Windows10下Excel发票生成Word/PDF宏报错(Run-Time Error 5941)求助
解决Word邮件合并宏报错Run-Time Error 5941的问题
老哥,我懂你现在的糟心情况:之前在Win7上用这个宏生成发票,能顺顺当当导出Word和PDF,换Win10笔记本后直接报错Run-Time Error 5941 - 请求的集合成员不存在,卡死在Windows(MainDoc).Activate这行,还联系不上原代码作者,自己动手能力有限,就想要个简单好操作的解决办法对吧?
错误原因
这行报错的代码本来是想激活原来的邮件合并主文档,但Win10里Word的窗口管理和Win7不一样——有时候文档窗口标题会自动加后缀(比如“[兼容模式]”),导致Windows(MainDoc)找不到对应的窗口,直接触发了这个错误。
简单易懂的解决方案
咱直接改两处关键代码,把“找窗口”改成“找文档本身”,顺便还修复了可能导致文件存错位置的小问题:
第一步:替换宏代码
打开带宏的Word文档,按Alt + F11打开VBA编辑器,找到merge1record_at_a_time这个宏,把原来的代码替换成下面的修改版:
Sub merge1record_at_a_time() ' merge1record_at_a_time Macro Dim fd As FileDialog 'Create a FileDialog object as a Folder Picker dialog box. Set fd = Application.FileDialog(msoFileDialogFolderPicker) With fd 'Use the Show method to display the Folder Picker dialog box and return the user's action. 'The user pressed the button. If .Show = -1 Then For Each vrtSelectedItem In .SelectedItems 'vrtSelectedItem is a String that contains the path of each selected item. 'You can use any file I/O functions that you want to work with this path. 'This example displays the path in a message box. SelectedPath = vrtSelectedItem Next vrtSelectedItem Else MsgBox ("No Directory Selected. Exiting") Exit Sub End If End With 'Set the object variable to Nothing. Set fd = Nothing Application.ScreenUpdating = False ' 关键修改1:直接保存主文档对象,避免窗口名称变化的问题 Dim mainDocObj As Document Set mainDocObj = ActiveDocument MainDoc = mainDocObj.Name ' 保留文档名称变量 For i = 1 To mainDocObj.MailMerge.DataSource.RecordCount With mainDocObj.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True With .DataSource .FirstRecord = i .LastRecord = i .ActiveRecord = i docname = .DataFields("PATIENT_NAME_").Value & " " & .DataFields("Company_name").Value _ & " " & .DataFields("Invoice_Number").Value & ".docx" ' ADDED CODE - Use ".docx" for Word Documents docname2 = .DataFields("PATIENT_NAME_").Value & " " & .DataFields("Company_name").Value _ & " " & .DataFields("Invoice_Number").Value & ".pdf" End With .Execute Pause:=False Application.ScreenUpdating = False End With '***************************************************************** '** NOTE: //// BELOW IS TO SAVE AS A WORD DOCUMENT //// ** '***************************************************************** ' 关键修改2:加上选择的文件夹路径,确保文件存在你指定的位置 ActiveDocument.SaveAs FileName:=SelectedPath & "\" & docname, FileFormat:= _ wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _ :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _ :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _ SaveAsAOCELetter:=False '***************************************************************** '** NOTE: //// BELOW IS TO SAVE AS A PDF //// ** '***************************************************************** 'set OpenAfterExport to False so the PDF files won't open after mail merge ActiveDocument.ExportAsFixedFormat OutputFileName:=SelectedPath & "\" & docname2, _ ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _ wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _ Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _ CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _ BitmapMissingFonts:=True, UseISO19005_1:=False ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges ' 关键修改3:用文档对象激活,代替原来的窗口激活 mainDocObj.Activate Next i Application.ScreenUpdating = True End Sub
第二步:操作步骤(超简单)
- 打开你用来做邮件合并的Word文档(就是原来带宏的那个)
- 按下键盘上的
Alt + F11,弹出VBA编辑窗口 - 在左边的“工程”列表里找到你的宏(名字是
merge1record_at_a_time),双击打开它 - 把原来的代码全删掉,粘贴上面的新代码
- 关闭VBA窗口,回到Word,重新运行宏就可以了
为啥这么改?
- 原来的
Windows(MainDoc).Activate是找窗口,容易因为Win10的窗口标题后缀失效;改成mainDocObj.Activate直接操作一开始保存的主文档对象,稳得一批 - 加了
SelectedPath & "\",确保导出的Word和PDF都存在你选择的文件夹里,不会存到默认位置找不到
内容的提问来源于stack exchange,提问作者DJKAPA
相关产品推荐
相关产品推荐

