尝试用excel单元格内容替换书签时出现MS Word自动化错误

尝试用excel单元格内容替换书签时出现MS Word自动化错误,excel,vba,ms-word,Excel,Vba,Ms Word,我的代码的目标是在word文档中查找书签,并用客户的姓名、地址或评估金额替换这些信息。我的代码搜索包含特定信息的书签(例如,书签看起来像[姓名]、[地址]、[评估]),然后用excel工作表中特定单元格中的信息替换它。我希望代码查看整个文档中的所有书签,并用适当的信息替换它,并保留书签。代码有两个问题。第一,它说“Me”使用不当(指代码中的Me.Repaint部分)。如果我尝试在没有Me.Repaint的情况下运行代码,我会得到一个VBA运行时错误“-2146959355(80080005)”:

我的代码的目标是在word文档中查找书签,并用客户的姓名、地址或评估金额替换这些信息。我的代码搜索包含特定信息的书签(例如,书签看起来像[姓名]、[地址]、[评估]),然后用excel工作表中特定单元格中的信息替换它。我希望代码查看整个文档中的所有书签,并用适当的信息替换它,并保留书签。代码有两个问题。第一,它说“Me”使用不当(指代码中的Me.Repaint部分)。如果我尝试在没有Me.Repaint的情况下运行代码,我会得到一个VBA运行时错误“-2146959355(80080005)”:自动化错误。有没有人对我可以做什么不同的建议?多谢各位

我已尝试删除我。重新绘制,并尝试重新启动word。我还在VBA引用部分启用了excel对象

Function Read_Excel_Cell(cellRin As Long) As String
Dim oExcel As Excel.Application
Dim myWB As Excel.Workbook
Set oExcel = New Excel.Application
Set myWB = oExcel.Workbooks.Open("excel file")
Read_Excel_Cell = myWB.Sheets(1).Cells(cellRin, 1)
Set myWB = Nothing
Set oExcel = Nothing
End Function

Sub clientinfoexcel()
Dim bmk As Bookmark
For Each bmk In ActiveDocument.Range.Bookmarks
cltext = bmk.Name
Dim clinfo1 As Range
Set clinfo1 = ActiveDocument.Bookmarks(cltext).Range
If clinfo1.Text Like "*name*" Then
    clinfo1.Text = Text: Read_Excel_Cell (1)
    ActiveDocument.Bookmarks.Add cltext, clinfo1
ElseIf clinfo1.Text Like "*address*" Then
    clinfo1.Text = Text: Read_Excel_Cell (2)
    ActiveDocument.Bookmarks.Add cltext, clinfo1
ElseIf clinfo1.Text Like "*appraisal*" Then
    clinfo1.Text = Text: Read_Excel_Cell (3)
    ActiveDocument.Bookmarks.Add cltext, clinfo1
End If
Next bmk
End Sub

出现自动错误。

设置myWB和oExcel=nothing不会关闭工作簿或退出excel,因此可能会打开一组隐藏的excel实例-签入任务管理器

只需一次打开/关闭即可获取所需数据

例如(未经测试):


设置myWB和oExcel=nothing不会关闭工作簿或退出excel,因此可能会打开一堆隐藏的excel实例-签入任务管理器

只需一次打开/关闭即可获取所需数据

例如(未经测试):


我没有在问题中的代码中看到
Me.Repaint
,这可能会导致错误。。。?这是从用户窗体运行的吗?据我所知,这不是Word或Excel的一部分

在任何情况下,这些行的代码中都会出现三次语法错误:

clinfo1.Text = Text: Read_Excel_Cell (1)
这是不正确的:
文本:

我相信你想要的是:

clinfo1.Text = Text:= Read_Excel_Cell(1)
指定参数时需要
:=
,而不是

除此之外,代码可能会更有效率。当
For
循环已经为书签提供了
bmk
对象时,无需重复
ActiveDocument.Bookmarks[index]
。在我看来,
Select Case
比许多
ElseIf
语句更易于阅读、编写和维护

我还更改了Excel的代码,以便它只启动一次新的Excel实例—如果它找不到正在运行的Excel。处理Excel应用程序的方法多种多样——这只是一种可能性。如果您想进一步探讨这个问题,我建议您进行更多的研究(这里和其他地方有很多很多问题和代码示例),并可能针对该主题提出一个不同的、更狭隘的问题

Function Read_Excel_Cell(cellRin As Long) As String
  Dim oExcel As Excel.Application
  Dim myWB As Excel.Workbook

  On Error Resume Next
  Set oExcel = GetObject(, "Excel.Appplication")
  If Err.Number = 429 Then
    Set oExcel = New Excel.Application
  End If
  On Error GoTo 0

  oExcel.Visible = True
  For Each myWb in oExcel.Workbooks
    If myWb.Name = "excel file" Then
      Exit For
    End If
  Next

  If myWb Is Nothing Then
    Set myWB = oExcel.Workbooks.Open("excel file")
  End If

  Read_Excel_Cell = myWB.Sheets(1).Cells(cellRin, 1)
  Set myWB = Nothing
  Set oExcel = Nothing
End Function

Sub clientinfoexcel()
  Dim bmk As Bookmark
  For Each bmk In ActiveDocument.Range.Bookmarks
    cltext = bmk.Name
    Dim clinfo1 As Range
    Set clinfo1 = bmk.Range
    Select Case cltext
       Case Like "*name*"
            clinfo1.Text = Read_Excel_Cell(1)
            ActiveDocument.Bookmarks.Add cltext, clinfo1
       Case Like "*address*" 
            clinfo1.Text = Read_Excel_Cell(2)
            ActiveDocument.Bookmarks.Add cltext, clinfo1
       Case Like "*appraisal*" Then
           clinfo1.Text = Read_Excel_Cell(3)
           ActiveDocument.Bookmarks.Add cltext, clinfo1
    End Select
  Next bmk
End Sub

我没有在问题中的代码中看到
Me.Repaint
,这可能会导致错误。。。?这是从用户窗体运行的吗?据我所知,这不是Word或Excel的一部分

在任何情况下,这些行的代码中都会出现三次语法错误:

clinfo1.Text = Text: Read_Excel_Cell (1)
这是不正确的:
文本:

我相信你想要的是:

clinfo1.Text = Text:= Read_Excel_Cell(1)
指定参数时需要
:=
,而不是

除此之外,代码可能会更有效率。当
For
循环已经为书签提供了
bmk
对象时,无需重复
ActiveDocument.Bookmarks[index]
。在我看来,
Select Case
比许多
ElseIf
语句更易于阅读、编写和维护

我还更改了Excel的代码,以便它只启动一次新的Excel实例—如果它找不到正在运行的Excel。处理Excel应用程序的方法多种多样——这只是一种可能性。如果您想进一步探讨这个问题,我建议您进行更多的研究(这里和其他地方有很多很多问题和代码示例),并可能针对该主题提出一个不同的、更狭隘的问题

Function Read_Excel_Cell(cellRin As Long) As String
  Dim oExcel As Excel.Application
  Dim myWB As Excel.Workbook

  On Error Resume Next
  Set oExcel = GetObject(, "Excel.Appplication")
  If Err.Number = 429 Then
    Set oExcel = New Excel.Application
  End If
  On Error GoTo 0

  oExcel.Visible = True
  For Each myWb in oExcel.Workbooks
    If myWb.Name = "excel file" Then
      Exit For
    End If
  Next

  If myWb Is Nothing Then
    Set myWB = oExcel.Workbooks.Open("excel file")
  End If

  Read_Excel_Cell = myWB.Sheets(1).Cells(cellRin, 1)
  Set myWB = Nothing
  Set oExcel = Nothing
End Function

Sub clientinfoexcel()
  Dim bmk As Bookmark
  For Each bmk In ActiveDocument.Range.Bookmarks
    cltext = bmk.Name
    Dim clinfo1 As Range
    Set clinfo1 = bmk.Range
    Select Case cltext
       Case Like "*name*"
            clinfo1.Text = Read_Excel_Cell(1)
            ActiveDocument.Bookmarks.Add cltext, clinfo1
       Case Like "*address*" 
            clinfo1.Text = Read_Excel_Cell(2)
            ActiveDocument.Bookmarks.Add cltext, clinfo1
       Case Like "*appraisal*" Then
           clinfo1.Text = Read_Excel_Cell(3)
           ActiveDocument.Bookmarks.Add cltext, clinfo1
    End Select
  Next bmk
End Sub

设置myWB和oExcel=nothing不会关闭工作簿或退出excel,因此您可能有一堆隐藏的excel实例处于打开状态-签入任务管理器。设置myWB和oExcel=nothing不会关闭工作簿或退出excel,因此,您可能在任务管理器中打开了一堆隐藏的excel实例。我尝试了您提供的代码,但遇到了ByRef参数类型不匹配的错误。此外,由于某些原因,set-oExcel=New Excel。应用程序正在导致word停止响应,然后出现运行时错误:自动化错误我离开PC几天-回来时可以查看一下。我添加了一个变量声明,将
txt声明为String
,这可能是类型不匹配错误的原因。至于
et oExcel=New Excel.Application
-这对我来说很有效,所以我不确定你的电脑上可能有什么问题。我尝试了你提供的代码,遇到了ByRef参数类型不匹配的错误。此外,由于某些原因,set-oExcel=New Excel。应用程序正在导致word停止响应,然后出现运行时错误:自动化错误我离开PC几天-回来时可以查看一下。我添加了一个变量声明,将
txt声明为String
,这可能是类型不匹配错误的原因。至于
et oExcel=New Excel.Application
的问题,这对我来说很有效,所以我不确定你的电脑上可能有什么问题。