Word 2016 for Mac宏中的CreateObject(“ Excel.Application”)问题

时间:2019-04-10 15:56:26

标签: word-vba-mac

在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对象...

2 个答案:

答案 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