【问题标题】:Office 365 Update to Version 1908 - VBA References / Object LibraryOffice 365 更新到版本 1908 - VBA 参考/对象库
【发布时间】:2020-02-05 05:49:11
【问题描述】:

问题

我们的办公电脑都运行 Office 365 专业增强版,并且正在逐步更新到版本 1908(内部版本 11929.20562)。随着 PC 的更新,我们的许多 VBA 宏都因各种对象错误而失败。到目前为止,我们在 Outlook 和 WRQ Reflections(终端仿真器)这两个产品中遇到了错误。

示例

Sub master_dailyWhispirSMS_P2(myExcel As Excel.Application, myWorkbook As Excel.Workbook, worksheetName As String, testingMode As Boolean)

While Trim(myWorkbook.Worksheets(worksheetName).Cells(rowNum, 1).Value) <> ""

以上代码导致运行时错误“91”对象变量或未设置块变量

Dim myExcel As Excel.Application    
Dim myWorkbook As Excel.Workbook
Set myExcel = GetObject(, "Excel.Application")
myExcel.Workbooks.Open (folderPath & "\" & fileName)
Set myWorkbook = myExcel.Workbooks(fileName)
myWorkbook.Activate

上述代码导致错误编译错误:找不到方法或数据成员。 MyWorkbook.Activate 上出现编译错误。

调查结果

到目前为止,共同的主题是我们正在使用早期绑定并使用 Microsoft Excel 对象库中的对象。

我尝试更改为使用后期绑定,这让我解决了一个问题,但有太多例程可能需要更新。

在 VBA 编辑器中,在“工具”菜单的“参考”下,Microsoft Excel 16.0 对象库显示为选中状态。我尝试删除引用,然后再次将其添加回来,这似乎解决了问题。这也适用于我同事的 PC。

寻求的想法/解决方案

此代码在 Office 更新之前可以正常工作。除了让每个单独的用户执行删除/添加之外,我还试图了解出了什么问题,以及是否有其他方法可以解决这个问题。

请注意,我对早期和后期绑定的理解仍然非常“绿色”,但我认为不知何故,对对象库的引用要么已损坏,要么只是在更新后没有指向正确的 DLL 文件。这可以解释为什么各种方法都不起作用。

【问题讨论】:

  • Dim myExcel As Excel.Application 是早期绑定。如果您想使用后期绑定以使其适用于所有版本,请改用它 - Dim myExcel As Object - 您还需要删除项目中的引用。
  • 你在哪一行得到编译错误?
  • 从订阅转为 MSI 安装? Office 365 的更新可能超出了 Office 2019 中可用的功能。Office 2016 和 2019 是“快照”,而 Office 365 则在不断发展。 O2019 将具有与 Office 365 相同的内容。“向后”而不是“向前”一直是 VBA 的问题/问题。对较新库的引用不会在较旧的安装上运行。规则一直是:在代码应该运行的最旧版本上开发。我认为不会有一个简单的解决方案。删除和重新附加引用的代码可能有效。
  • 感谢您的回复。做了几个编辑。抱歉,我不确定最新版本的 Office 365 指的是什么。我已经输入了实际的版本号/内部版本号。还添加了哪一行出现编译错误。只是想找出我如何实施@Cindy Meister 关于创建代码以删除/重新附加的建议。只是想找出 References 对象中可用的方法和属性。
  • 参见*.com/a/51313215/9439330 和相关部分(页面右侧,工作之后,热门网络问题之前)。 Office365 版本 1908 可能等同于 Office 2019。所有 office 库都更改了版本。

标签: excel vba


【解决方案1】:

虽然我无法找出导致问题的原因,但我能够通过删除每个参考然后重新添加来解决问题。幸运的是,我发现我能够更改一个主文件并让我们的 IT 人员将其推送给所有员工,因为我无法让 VBA 在正确的项目中删除和添加引用。

我能够在每个项目中单独运行宏并比较 Reference.Name、Reference.Description、Reference.fullpath 和 Reference.GUID。所有属性都相同,所以不知道为什么引用“损坏”。

无论如何,发布此答案只是为了确认删除并添加回引用为我解决了问题。

这是我用来比较项目之间的引用的代码(在添加/删除引用之前和之后)。

Sub checkLibraryReference()

Dim vbProj As Object
Dim refChk As Object
Set vbProj = Session.VBProject
Set refChk = vbProj.References
Dim printLine As String

For Each refCheck In vbProj.References
printLine = refCheck.Name & "," & _
     refCheck.Description & "," & _
     refCheck.major & "," & _
     refCheck.minor & "," & _
     refCheck.fullpath & "," & _
     refCheck.GUID & Chr(13)
Debug.Print printLine

Next refCheck

End Sub

我从即时窗口抓取输出,粘贴到 Excel 中并使用文本到列。然后我只是做了一个简单的比较。

我努力寻找有关引用对象的文档,但最终在此处的 Access VBA 参考中找到了它:

Access VBA Reference Library

【讨论】: