excel 使用VBA时偶尔会遇到运行时错误“-2146950355(80080005

isr3a4wc  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(823)

在stack上一些用户的帮助下,我编译了一个宏,该宏从excel工作簿中提取某些值,并将它们复制到word模板中。该宏有时工作正常,但在其他情况下,我得到一个错误-“运行时错误-2146950355(80080005):服务器执行失败”。我不知道为什么我有时会得到这个错误,但不是其他人。附件是我的代码和屏幕截图的错误和调试。

Const FilesPath As String = "filespath"
Const FilesPathh As String = "filespathh"
Const FilesPathhh As String = "filespathhh"
Const TemplateFile As String = "tempa.docx"

Sub Letters()
    Dim wd As Word.Application, doc As Word.Document
    Dim NomCell As Range, ws As Worksheet
    Dim Result As Integer
    

    Set ws = ActiveSheet
    Set wd = New Word.Application
    wd.Visible = True
    

   Columns("H:H").Select
    Application.CutCopyMode = False
    Selection.Copy
    Columns("I:I").Select
    Selection.Insert Shift:=xlToRight
    Application.CutCopyMode = False
        
        
    Columns("I:I").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("J:J").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("H:H").Select
    Selection.TextToColumns Destination:=Range("H1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=True, Other:=False, FieldInfo:= _
        Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
    Range("H1").Select
    ActiveCell.FormulaR1C1 = "Last Name"
    Range("I1").Select
    ActiveCell.FormulaR1C1 = "First Name"
    Range("J1").Select
    ActiveCell.FormulaR1C1 = "Other"
    
    

For Each NomCell In ws.Range("A2", ws.Cells(Rows.Count, 1).End(xlUp)).Cells
        'open as read-only
        
        
        Set doc = wd.Documents.Open(FilesPath & TemplateFile, ReadOnly:=True)
        With NomCell.EntireRow
        
        doc.Bookmarks("date").Range.Text = Date
        doc.Bookmarks("name").Range.Text = .Columns("I").Value
        doc.Bookmarks("course").Range.Text = .Columns("A").Value
    .Columns("A").Select
    Selection.Replace What:="&", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.Replace What:=":", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.Replace What:="/", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
        
               doc.SaveAs2 FilesPathh & .Columns("K").Value & " " & .Columns("A").Value & ".pdf", _
                                                   wdExportFormatPDF
               doc.Close False
            
        End With
    Next NomCell
    wd.Quit
    ActiveSheet.Cells.ClearContents
    Result = MsgBox("The letters have been created. Would you like to view them?", vbYesNo)
    If Result = vbYes Then
    Call Shell("explorer.exe " & FilesPathhh, vbNormalFocus)
    End If
End Sub

任何帮助都将不胜感激。谢谢!

k3fezbri

k3fezbri1#

运行时错误-2146950355(80080005):服务器执行失败
您可能会发现与Error when you start many COM+ applications: Error code 80080005 -- server execution failed文章中描述的完全相同的错误。
Considerations for server-side Automation of Office文章声明如下:
Microsoft Office的所有当前版本都是为在客户端工作站上作为最终用户产品运行而设计、测试和配置的。它们采用交互式桌面和用户配置文件。它们不提供满足设计为无人参与运行的服务器端组件的需要所必需的可重入性或安全性级别。
Microsoft当前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动执行Microsoft Office应用程序,因为在此环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。
如果要生成在服务器端上下文中运行的解决方案,则应尝试使用对于无人参与的执行来说是安全的组件。或者,应尝试找到至少允许部分代码在客户端运行的替代方案。如果从服务器端解决方案使用Office应用程序,则该应用程序将缺少成功运行所需的许多功能。此外,您将冒整个解决方案稳定性的风险。
如果只处理开放XML文档,请考虑使用Open XML SDK,否则,可以考虑使用任何为服务器端执行而设计的第三方组件,例如Assose。

jv4diomz

jv4diomz2#

我遇到了同样的问题,当我试图创建Word应用程序对象时,Word已经在运行,总是会出现这个问题。我通过尝试引用已经在运行的Word示例来解决这个问题。只有当这个示例不可用时,我才会创建一个新示例。
请注意,我在代码中使用了后期绑定:

Dim wrdApp As Object

'Temporarily turn off error handling
On Error Resume Next

'Try to get a reference to an already running instance of Word
Set wrdApp = GetObject(, "Word.Application")

'If referencing to the running instance failed
If wrdApp Is Nothing Then
    'Create a new instance of Word
    Set wrdApp = CreateObject("Word.Application")
End If

'Turn error handling back on
On Error GoTo 0

相关问题