【问题标题】:Using Access 2010 VBA list all open Excel Workbooks使用 Access 2010 VBA 列出所有打开的 Excel 工作簿
【发布时间】:2014-10-28 21:37:11
【问题描述】:

好吧,我一定漏掉了一些微妙的东西。

在 Excel 2010 中,此 VBA 有效:

Private Sub ExcelTest()

Dim wb As Workbook

For Each wb In Workbooks

    Debug.Print wb.Name

Next wb

End Sub

我正在尝试在 Access VBA 中复制它,并且我在 Access 2010 中尝试了以下方法,但没有成功。

Private Sub AccessTest1()
'Derived from http://stackoverflow.com/questions/15958061/controlling-excel-
'workbook-from-access-2010-vba

Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook

Set xlApp = New Excel.Application

For Each xlWB In Excel.Workbooks
    Debug.Print xlWB.Name
Next xlWB

'Nothing happens.
'Stepping through and hovering:
'xlApp = "MicroSoft Excel"
'xlWB = Nothing
'xlWB.Name = Object variable or With block variable not set.
'But doesn't throw an error.

End Sub

Private Sub AccessTest2()
'Derived from http://stackoverflow.com/questions/5729195/how-to-refer-to-excel-
'objects-in-access-vba

Dim xlApp As Excel.Application

Dim wb As Excel.Workbook

Set xlApp = New Excel.Application

For Each wb In Excel.Workbooks  '<--- Like this nothing happens
    Debug.Print wb.Name
Next wb

'Stepping through and hovering:
'xlApp = "MicroSoft Excel"
'wb = Nothing
'wb.Name = Object variable or With block variable not set.  But doesn't throw an error.

For Each wb In xlApp.Workbooks  '<--- This throws a "Object variable or 
                                 'With block variable not set" error
    Debug.Print wb.Name
Next wb

End Sub

Private Sub AccessTest3()
'Derived from http://stackoverflow.com/questions/5729195/how-to-refer-to-excel-
'objects-in-access-vba

Dim objExcelApp As Object
Dim wb As Object

Set objExcelApp = CreateObject("Excel.Application")

Set wb = objExcelApp.Workbook  '<--- Throws "Object doesn't support this property
                               'or method error"
'Hovering after error:
'objExcelApp = "MicroSoft Excel"
'wb = Nothing

For Each wb In objExcelApp.Workbooks
    Debug.Print wb.Name
Next wb

End Sub

我肯定在 Access 中检查了“Microsoft Excel 14.0 对象库”参考。 我只是想列出所有打开的 Excel 工作簿,以便我可以针对这些信息采取行动。 提前感谢您的帮助。

【问题讨论】:

    标签: vba excel ms-access-2010


    【解决方案1】:

    Set xlApp = New Excel.Application 会创建一个新的 Excel 实例 - 当然,其中没有任何工作簿。

    您想要实现的是通过已经打开的 Excel 实例。因此,您必须使用 getObject()。

    您的 For 语句中有另一个错误...您必须使用 xlApp.Workbooks 而不是 Excel.Workbooks。

    以下代码应提供预期结果:

    Dim xlApp As Excel.Application
    Set xlApp = GetObject(, "Excel.Application")
    
    Dim xlWB As Excel.Workbook
    For Each xlWB In xlApp.Workbooks
        Debug.Print xlWB.Name
    Next xlWB
    
    Set xlApp = Nothing
    Set xlWB = Nothing
    

    请记住,最后通过将对象变量设置为 Nothing 来删除它们。

    【讨论】:

    • 谢谢你的作品。我有一种预感,我必须“进入”工作簿,但如果不选择工作簿,我想不出如何实现这一目标。因为我无法让最基本的部分工作,所以我还没有开始清理部分。再次感谢您的回答和解释。
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多