我有 Word 2016 VBA 代码来读取 Excel 文档中的数据。
这适用于 Windows 平台(Windows 7 和 Windows 10)。
在 Mac 上,它失败了CreateObject("Excel.Application")
操作说明。
运行时错误'-2146959355 (80080005)'
自动化错误
这是 Office 2016 for Mac(当前使用版本 16.23)中的问题,还是我的“环境”以及 Office 在 Mac 上安装方式的问题?
它曾经可以工作,但在 Office 2016 for Mac 更新后停止工作。我不记得哪个版本导致了这个问题。近两年以来,我在每次 Office 更新时都会检查此代码,但总是失败。
我尝试使用 Parallels Desktop 运行 Windows 10 虚拟机,在这个虚拟 Windows 环境中,代码可以正常运行。我需要“本地”运行它。
以下代码重现了该问题:
Sub MyTestOfCreateObject()
Dim xlapp As Object
Set xlapp = CreateObject("Excel.Application")
xlapp.Visible = True
xlapp.Quit
Set xlapp = Nothing
End Sub
我尝试更换CreateObject("Excel.Application")
with
Set xlapp = New Excel.Application
。我收到同样的错误消息。
我希望 xlapp 用作 Excel 对象。
经过在 Mac Word VBA 中进行大量试验和错误后,以下内容对我有用。我发现的一件重要的事情是CreateObject("Excel.Application")
返回一个Excel.Workbook
对象而不是Excel.Application
对象(和GetObject(...)
做同样的事)。这似乎是早期版本的 Excel for Mac 的一项更改。另一个原因是启动行为有些不一致,因此我添加了延迟重试。
Sub Test1()
Dim objExcelWkbk As Object
On Error Resume Next
' GetObject() and CreateObject() behave inconsistently... retry a few times
Dim iRetry As Integer
iRetry = 1
Do While iRetry <= 3
' I also tried:
' Set objExcelWkbk = New Excel.Application
' Although this *will* launch Excel, it always gives an "Class does not support Automation or does not support expected interface" error
' If Excel is already open then assign to the variable
' For Excel, an Excel.Application.Workbook object is returned when successful (rather than Excel.Application)
Set objExcelWkbk = GetObject(, "Excel.Application")
CheckAndReportError ("Try#" & iRetry & " (A) GetObject()")
Wait 2
If Not objExcelWkbk Is Nothing Then
Exit Do
End If
' If Excel was not previously open then object variable will be empty
' so create the object
Set objExcelWkbk = CreateObject("Excel.Application")
CheckAndReportError ("Try#" & iRetry & " (B) CreateObject()")
Wait 2
If Not objExcelWkbk Is Nothing Then
Exit Do
End If
iRetry = iRetry + 1
Loop
Err.Clear
If objExcelWkbk Is Nothing Then
Debug.Print "Failed to create Excel object"
Else
Debug.Print "Excel version " & objExcelWkbk.Application.Version & "; OS " & objExcelWkbk.Application.OperatingSystem
CheckAndReportError ("(C) objExcelWkbk.Application.Version")
objExcelWkbk.Application.Quit
CheckAndReportError ("(D) objExcelWkbk.Application.Quit()")
End If
Set objExcelWkbk = Nothing
End Sub
Sub CheckAndReportError(Label As String)
If Err.Number = 0 Then
Debug.Print Label & " no error"
Exit Sub
End If
Debug.Print Label & " error #" & Err.Number & ": " & Err.Description
Err.Clear
End Sub
Sub Wait(ByVal Seconds As Single)
Dim CurrentTimer As Variant
WaitUntil = Timer + Seconds
Do While Timer < WaitUntil
DoEvents
Loop
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)