在Word 2016中,我有一个Word宏,该宏正在读取Excel文档中的数据并在Word中使用此数据。此宏在Windows平台(Windows 7和Windows 10)上运行良好,但在Mac上不起作用。它在CreateObject("Excel.Application")
指令上失败,并收到运行时错误'-2146959355(80080005)'
自动化错误
这是Office 2016 for Mac(当前使用版本16.23)中的问题,还是我的“环境”中以及Mac上Office的安装方式中的问题?
它曾经可以使用一段时间,并且停止使用Office 2016 for Mac更新。不幸的是,我不记得是哪个版本引起了问题。自将近2年以来,我在每次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")
替换为
Set xlapp = New Excel.Application
和我收到相同的错误消息
我希望CreateObject调用不会失败,并允许xlapp用作宏中的Excel对象...
答案 0 :(得分:0)
您对此有何了解?我知道您在某个时间发布了问题,但是尝试以相同方式从Mac上的Powerpoint打开Excel时遇到了同样的问题。它适用于早期版本,但在Office 2016中失败。 尽管有人看到有人建议用Applescript打开Excel,但我发现有人提到它是一个问题,但没有解决方案。给定宏中对Application对象的引用数量,我可能正在寻找一个完整的重写。
答案 1 :(得分:0)
在Mac Word VBA中经过反复试验后,以下内容对我有用。我发现的一件事很重要,就是CreateObject("Excel.Application")
返回一个Excel.Workbook
对象而不是Excel.Application
对象(并且GetObject(...)
执行相同的操作)。这似乎与早期版本的Mac版Excel有所不同。另一个是发射行为有些不一致,因此我增加了重试的时间。
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