我正在尝试运行Excel子程序来保存Word文档。
语言版本: Word/Excel版本16.41
操作系统: Mac 10.14.6
我试过:(文件/文件)
我从零开始在不同的计算机和操作系统上工作。我现在使用Majave 10.14.6和Word/Excel版本16.41。我能够打开工具--引用--并选择单词库,但是现在引用没有高亮显示,也是不可点击的。(在此之前也是短暂的)
我遇到:
运行时错误-2146959355 (80080005)自动化错误。
需要调试的行:
Set wdApp = New Word.Application
Option Explicit
Sub CreateBasicWordReportEarlyBinding()
Dim wdApp As Word.Application
Set wdApp = New Word.Application
With wdApp
.Visible = True
.Activate
.Documents.Add
With .Selection
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.BoldRun
.Font.Size = 18
.TypeText "Best Movies Ever"
.BoldRun
.Font.Size = 12
.TypeText vbNewLine
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.TypeParagraph
End With
Range("A2", Range("A2").End(xlDown).End(xlToRight)).Copy
.Selection.Paste
.ActiveDocument.SaveAs2 Environ("UserProfile") & "\Desktop\MovieReport.docx"
.ActiveDocument.Close
.Quit
End With
Set wdApp = Nothing
End Sub
发布于 2020-09-27 16:11:53
几年来,在Mac版本的Office上使用COM自动化(这就是New Word.Application
“、CreateObject
等正在做的事情)一直存在问题。你可能在其他地方也看到过类似的问题。
问题在于,并不是每个人都会遇到这些问题,这意味着这些问题可能是由配置问题造成的。通常的嫌疑应该是“与Mac沙箱有关”。但是,我从未见过包括Microsoft在内的任何一个支持文档,它告诉您如何解决这个问题。我已经在Mac的干净安装上完成了Office的干净安装,并遇到并报告了这些问题,我认为软件作者应该真正地调查这个问题,并提供修复或解决办法。
这里,(相同的Office版本,但Mac 10.15.6)我发现.
问题有一点不同,取决于您正在运行或试图自动化的应用程序。
在Excel中,尝试使用Word.Application
类型的早期绑定对象总是失败的.所以你不能用
Dim wdApp As New Word.Document
或
Dim myApp As Word.Document
Set myApp = New Word.Document
(不管您是否在VBE工具中定义了正确的引用->引用。否则,您将看到编译时错误,并且VBA实际上不会运行代码)。
所以你需要
Dim wdApp As Object
并使用CreateObject (如果Word尚未运行或需要Word的新实例(至少在Windows上)或GetObject (当您想连接到Word的一个/现有实例时)。
然而,在这里,我发现CreateObject有时只起作用,而且我还没有弄清楚原因。如果还没有启动,它总是会启动Word,但有时它会等待Word开始,并返回对单词对象的引用,有时则不会。测试并不是完全确定的,但实际上它似乎最大限度地“每隔一次在Excel会话中调用它”,在我看来,它似乎保留了一些它不应该使用的状态信息,并且认为它“知道”WOrd已经启动,而实际上它还没有启动。
相反,GetObject似乎工作正常。通常,如果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开始单词的可能性。有几种方法可以尝试在Mac上这样做,但最简单的方法是使用MacScript函数来运行一些AppleScript。这是最简单的,因为所有的代码都可以放在VBA /函数中--您不需要任何外部文件。
实际上,由于Mac沙箱的问题,MacScript是不受欢迎的。您实际上应该使用AppleScriptTask来代替。但是MacScript目前似乎在做这个工作,只是它总是会引发一个VBA错误(而IMO不应该这样),所以我们不得不处理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的文本文件放在用户的“库”中的一个文件夹中。
~/Library/Application Scripts/com.microsoft.Excel
我用了这样的剧本:
on myStartWord(dummy as text)
tell application id "com.microsoft.Word"
activate
end tell
return "Word has started"
end myStartWord
然后,您可以丢弃一些错误读取器,并使用如下的VBA代码:
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
发布于 2020-09-26 16:23:48
请参阅自由流的评论,它应该作为答案发布。在VBE中,选择工具>引用> Microsoft 16.0对象库。
发布于 2020-09-26 16:42:25
有两种方法可以从Excel中自动生成word:
在您的例子中,我将使用早期绑定来访问intellisense.在这里输入图像描述。
https://stackoverflow.com/questions/64071777
复制相似问题