尝试从 Access 运行 Excel 以格式化导出的表,获取所需的对象错误

Posted

技术标签:

【中文标题】尝试从 Access 运行 Excel 以格式化导出的表,获取所需的对象错误【英文标题】:Trying to Run Excel from Access to Format Exported Table, Get Object Required Error 【发布时间】:2017-02-23 20:46:23 【问题描述】:

我正在尝试自动将表格从 Access 导出到 Excel 报告中。根据我对 Stack Overflow 的研究,建议有一个用于导出的 VBA 代码,然后是另一个用于格式化 Excel 工作表的代码。我非常喜欢从 Access 运行 Excel 工作表的格式,所以我只需按下一个按钮,事情就会被导出。我绝对讨厌运行这份报告,因为当我有其他紧迫的事情要做时,每个人都想要它“现在”。这是公司总裁办公室的,所以像我这样的苦工只能跳过去。

我在这里找到了这个建议的代码:https://***.com/a/14401307/6850333,但我收到“对象变量或未设置块变量”的错误

Sub FormatACTrade(strFilePath As String) 'I'm running this from another _
sub that exports the tables to excel, I know functions are needed for _
an output but this is a private variable that I'm using within a modle_
so should be ok??

On Error GoTo ErrorHandler

Dim objFile As Object

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
objExcel.DisplayAlerts = False
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder(strFilePath)

If objFso.GetExtensionName(objFile.Path) = "xlsx" Then
     Set objWorkbook = objExcel.Workbooks.Open(objFile.Path)
     For Each sh In objWorkbook.Worksheets
If sh.UsedRange.Address <> "$A$1" Or sh.Range("A1") <> "" Then
        With sh
        [Do stuff]
        End With
    End If
    Next
    objWorkbook.Close True
End If
End Sub

感谢任何建议。我是编码新手,我不得不承认有关 vba 对象、脚本和应用程序的文档很难理解。我知道我没有正确命名一个对象,但我真的不明白代码在这一行 Set objWorkbook = objExcel.Workbooks.Open(objFile.Path) 上做了什么。

【问题讨论】:

如果这是它标记的行,那么它错过了。您永远不会将 objFile 设置为任何内容。 它没有在编译器中标记,但那是我无法理解的地方。你是对的,objFile 没有定义。我刚刚添加了一行Dim objFile As Object,但现在错误是“对象变量或未设置块变量”,我不确定应该为 objFile 放什么。文件名? 取决于您打算做什么。我怀疑objFile.Path 的两个实例都应该是strFilePath .Path 扩展有什么作用吗?原始代码确实有 strFilePathobjFile.Path 分开。代码应该遍历文件夹中的文件,但我真的不需要。文件夹中只有一张 Excel 表,我知道它的名称。如何直接调用“xlsx”文件路径? “直接调用“xlsx”文件路径”是什么意思?您可能想要编辑您的问题,以包含您尝试使用您找到的此代码执行的操作的描述。 strFilePath 传递了什么? Sub 应该用来做什么? 【参考方案1】:

考虑删除对objFSO 的任何需求。以前的代码需要这个对象来遍历文件。既然知道 Excel 文件路径,就直接在Workbooks.Open() 方法中传入即可:

Sub FormatACTrade(strFilePath As String)    
    Dim objExcel As Object, objWorkbook As Object, sh As Object

    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False

    ' OPEN WORKBOOK (IN BACKGROUND)
    Set objWorkbook = objExcel.Workbooks.Open(strFilePath)

    For Each sh In objWorkbook.Worksheets
       If sh.UsedRange.Address <> "$A$1" Or sh.Range("A1") <> "" Then
          With sh
            [Do stuff]
          End With
       End If
    Next sh

    ' CLOSE AND SAVE WORKBOOK
    objWorkbook.Close True
    ' QUIT APP
    objExcel.Quit

    ' FREE RESOURCES
    Set objWorkbook = Nothing
    Set objExcel = Nothing
End Sub

【讨论】:

这是有效的。谢谢你。是否有在另一个中运行另一个 Microsoft Office 程序的最佳实践来源?我不知道我怎么会意识到“免费资源”或退出应用程序。 太棒了。请接受(在旁边打勾)以确认解决方案。我不知道是否有任何最佳实践的单一文档。但我通过各种工作示例学习了这些项目,包括 SO 帖子。你边做边学!

以上是关于尝试从 Access 运行 Excel 以格式化导出的表,获取所需的对象错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 DAO 从外部 Access (Outlook/Excel) 连接到有效数据库会生成 3343 无法识别的数据库格式错误

将查询从 Access 导出到 Excel 模板

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

从 Excel 导入以访问密钥冲突和相同的格式

使用 VBA 从 Access 运行后从任务管理器中删除 Excel 任务

从Navicat中导出数据成Excel表怎么转化成文本格式