如何在Mac OS上使用Excel VBA保存Word文档?

如何在Mac OS上使用Excel VBA保存Word文档?,excel,vba,macos,ms-word,Excel,Vba,Macos,Ms Word,我正在尝试运行Excel VBA子例程来保存Word文档 语言版本:Word/Excel 16.41版 操作系统:Mac OS Mojave 10.14.6 我试过:() () 我从零开始使用不同的计算机和操作系统。我现在使用的是Mac OS Majave 10.14.6和Word/Excel 16.41版。我可以打开工具引用并选择单词库,但现在引用不亮且不可读取。(之前也有过短暂的讨论) 我遇到: 运行时错误-2146959355(80080005)自动错误 需要调试的行: Set wdApp

我正在尝试运行Excel VBA子例程来保存Word文档

语言版本:Word/Excel 16.41版
操作系统:Mac OS Mojave 10.14.6

我试过:()

()

我从零开始使用不同的计算机和操作系统。我现在使用的是Mac OS Majave 10.14.6和Word/Excel 16.41版。我可以打开工具引用并选择单词库,但现在引用不亮且不可读取。(之前也有过短暂的讨论)

我遇到:

运行时错误-2146959355(80080005)自动错误

需要调试的行:

Set wdApp = New Word.Application

请参阅的评论,该评论应作为答案发布。在VBE中,选择工具>参考>Microsoft Word 16.0对象库。

有两种方法可以从Excel自动执行Word:

  • 早期绑定:添加对microsoft word对象库的引用
  • 后期绑定:将变量声明为对象

  • 在您的情况下,我会使用早期绑定来访问intellisense。

    在Mac版本的Office上使用COM自动化(这是新的Word.Application“,
    CreateObject
    等正在做的事情)已经有几年了。您可能在其他地方看到类似的问题

    问题在于并非所有人都会遇到这些问题,这表明它们可能是由配置问题引起的。通常的怀疑是“与Mac OS沙箱有关”“。但是,我从未见过任何人(包括Microsoft)提供的支持文档告诉您如何解决此问题。我在Mac OS的干净安装上完成了Office的干净安装,遇到并报告了问题,我认为软件作者应该在这个时候真正调查问题,并提供修复或解决方法

    这里,(相同的Office版本,但Mac OS Catalina 10.15.6)我发现

    问题有点不同,这取决于您正在运行或试图自动化的应用程序

    在Excel中,尝试使用类型为
    Word.Application
    的早期绑定对象总是失败。所以你不能使用

    Dim wdApp As New Word.Document
    

    (不管您是否在VBE工具->引用中定义了正确的引用。如果您没有定义,您将看到编译时错误,VBA实际上不会运行代码)

    所以你需要

    Dim wdApp As Object
    
    以及使用CreateObject(如果Word尚未运行,或者当您需要Word的新实例时,至少在Windows上)或GetObject(当您要连接到Word的现有实例时)

    然而,在这里我发现CreateObject只在某些时候起作用,我还不知道为什么。它总是在Word尚未启动时启动Word,但有时它会等待Word启动并返回对Word对象的引用,有时则不会。测试并不是完全确定的,但实际上看起来它的工作时间最多为“每隔一次在Excel会话中调用它时”,在我看来,Excel似乎保留了一些它不应该保留的状态信息,并认为它“知道”单词已经开始,而实际上它还没有开始

    相比之下,GetObject似乎工作正常。通常,如果Word没有启动,它会返回一个错误,但是如果Word启动,它会返回对Word对象的引用。所以我尝试使用类似的方法

    Dim wdApp As Object
    On Error Resume Next
    Set wdApp = CreateObject("Word.Application")
    Err.Clear
    If wdApp Is Nothing Then
      Set wdApp = GetObject(,"Word.Application")
    End If
    
    但有时我仍然会遇到错误429 ActiveX组件无法在GetObject行中创建对象-在这种情况下,CreateObject看起来好像没有等待Word启动

    因此,我研究了不使用COM启动Word的可能性。有几种方法可以在Mac上尝试这样做,但最简单的方法是使用MacScript函数运行一点AppleScript来完成。这是最简单的,因为所有代码都可以在VBA子/函数中—您不需要任何外部文件

    由于Mac OS沙箱的问题,MacScript实际上已被弃用。您确实应该使用AppleScriptTask来代替。但MacScript目前似乎可以完成这项工作,只是它总是会引发VBA错误(在我看来不应该),因此我们必须处理VBA错误捕获

    在这里,下面的代码总是有效的

    Dim theApp As Object
    On Error Resume Next
    MacScript "tell application id ""com.microsoft.Word"" to activate"
    Err.Clear
    'On Error Goto problem ' you need to set this up
    Set theApp = GetObject(,"Word.Application")
    ' just be careful
    If theApp Is Nothing Then
      Debug.Print "theApp Is Nothing"
    Else
      Debug.Print TypeName(theApp)
      ' get on with what you need to do
    End If
    
    另一件我非常努力要做的事情是,通过在适当的位置添加此代码,看看是否可以利用早期绑定(对于Intellisense等):

    Dim myApp As Word.Application
    
    Set myApp = theApp
    'or
    Set myApp = theApp.Application
    
    但这根本不起作用。所以我似乎被后期装订所困扰

    如果您发现无法使用MacScript,可以使用AppleScriptTask。最简单的方法是将名为myStartWordScript.scpt的文本文件放在用户“库”中的文件夹中

    我使用了这样的脚本:

    on myStartWord(dummy as text)
        tell application id "com.microsoft.Word"
            activate
        end tell
        return "Word has started"
    end myStartWord
    
    Dim theApp As Object
    Debug.Print AppleScriptTask("myStartWordScript","myStartWord","")
    'On Error Goto problem ' you need to set this up
    Set theApp = GetObject(,"Word.Application")
    ' just be careful
    If theApp Is Nothing Then
      Debug.Print "theApp Is Nothing"
    Else
      Debug.Print TypeName(theApp)
      ' get on with what you need to do
    End If
    
    然后,您可以放弃一些处理错误的东西,并使用如下VBA代码:

    on myStartWord(dummy as text)
        tell application id "com.microsoft.Word"
            activate
        end tell
        return "Word has started"
    end myStartWord
    
    Dim theApp As Object
    Debug.Print AppleScriptTask("myStartWordScript","myStartWord","")
    'On Error Goto problem ' you need to set this up
    Set theApp = GetObject(,"Word.Application")
    ' just be careful
    If theApp Is Nothing Then
      Debug.Print "theApp Is Nothing"
    Else
      Debug.Print TypeName(theApp)
      ' get on with what you need to do
    End If
    

    如果您的宿主应用程序是Excel,则需要确保您有对Word的引用以使用早期绑定的Word对象,即Tools.References,并确保选中了Microsoft Word XX.X对象库。否则,请使用Get/CreateObject.sub test()Dim wordApplication As Word.Application Dim wordDocument As document Set wordApplication=New Word.Application wordApplication.Visible=True Set wordDocument=wordApp.Documents.Add wordDocument.SaveAs Filename:=“C:\myDocumentTest.docx”结束子文件
    Dim theApp As Object
    Debug.Print AppleScriptTask("myStartWordScript","myStartWord","")
    'On Error Goto problem ' you need to set this up
    Set theApp = GetObject(,"Word.Application")
    ' just be careful
    If theApp Is Nothing Then
      Debug.Print "theApp Is Nothing"
    Else
      Debug.Print TypeName(theApp)
      ' get on with what you need to do
    End If