需要从MS Excel中的列表展开MS Word中的多个“查找和替换”,以替换带有超链接的文本并修复错误

需要从MS Excel中的列表展开MS Word中的多个“查找和替换”,以替换带有超链接的文本并修复错误,excel,vba,replace,ms-word,find,Excel,Vba,Replace,Ms Word,Find,我有一个很大的Word文件,其中涉及到整个文档中的多个问题。 我还有一个Excel文件,列出了A列中的所有问题,B列中有一个实际问题的列表,这些问题也是超链接。 我想用电子表格B栏中相应的超链接问题替换Word文档中的每个问题 我试图在StackOverflow问题中使用宏,但我得到了 运行时错误“1004”:无法获取 靶场课 我不知道这意味着什么,也不知道如何修复它。 我猜这个宏需要调整才能插入B列中的超链接文本 谢谢你的帮助! PS在过去的15年中,我们每年都会手动完成4个指南,每个指南中有

我有一个很大的Word文件,其中涉及到整个文档中的多个问题。 我还有一个Excel文件,列出了A列中的所有问题,B列中有一个实际问题的列表,这些问题也是超链接。 我想用电子表格B栏中相应的超链接问题替换Word文档中的每个问题

我试图在StackOverflow问题中使用宏,但我得到了

运行时错误“1004”:无法获取 靶场课

我不知道这意味着什么,也不知道如何修复它。 我猜这个宏需要调整才能插入B列中的超链接文本

谢谢你的帮助!
PS在过去的15年中,我们每年都会手动完成4个指南,每个指南中有100多个问题。我很想找到一种自动化的方法

链接中的代码存在的问题是,它是为后期绑定而编写的,但是使用了一个命名的Excel常量。将“xlCellTypeLastCell”更改为“11”

由于您想将问题超链接,请尝试以下方法:

Sub HyperlinkQuestions()
Application.ScreenUpdating = False
Dim xlApp As Object, xlWkBk As Object, StrWkBkNm As String, r As Long
Dim StrFnd As String, StrHLnk As String, StrHTxt As String
StrWkBkNm = "C:\Users\" & Environ("Username") & "\Documents\QuestionLinks.xlsx"
If Dir(StrWkBkNm) = "" Then
  MsgBox "Cannot find the designated workbook: " & StrWkBkNm, vbExclamation
  Exit Sub
End If
On Error Resume Next
'Start Excel
Set xlApp = CreateObject("Excel.Application")
If xlApp Is Nothing Then
  MsgBox "Can't start Excel", vbExclamation
  Exit Sub
End If
On Error GoTo 0
With xlApp
  'Hide our Excel session
  .Visible = False
  ' The file is available, so open it.
  Set xlWkBk = .Workbooks.Open(StrWkBkNm, False, True)
  If xlWkBk Is Nothing Then
    MsgBox "Cannot open:" & vbCr & StrWkBkNm, vbExclamation
    .Quit: Set xlApp = Nothing: Exit Sub
  End If
  ' Process the workbook.
  With xlWkBk
    With .Worksheets("Sheet1")
      'Process the F/R data
      For r = 2 To .Cells(.Rows.Count, 1).End(-4162).Row ' -4162 = xlUp
        If Trim(.Range("A" & r)) <> vbNullString Then
          StrFnd = .Range("A" & r).Text
          With .Range("B" & r)
            If .Hyperlinks.Count = 1 Then
              StrHLnk = .Hyperlinks(1).Address
              StrHTxt = .Hyperlinks(1).TextToDisplay
            Else
              StrHLnk = .Text
              StrHTxt = .Text
            End If
          End With
          Call LinkQuestion(StrFnd, StrHLnk, StrHTxt)
        End If
      Next
    End With
  .Close False
  End With
  .Quit
End With
' Release Excel object memory
Set xlWkBk = Nothing: Set xlApp = Nothing
Application.ScreenUpdating = True
End Sub

Sub LinkQuestion(StrFnd As String, StrHLnk As String, StrHTxt As String)
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = StrFnd
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = True
    .MatchWholeWord = True
    .Execute
  End With
  Do While .Find.Found
    .Hyperlinks.Add .Duplicate, StrHLnk, , , StrHTxt
    .Start = .Hyperlinks(1).Range.End
    .Find.Execute
  Loop
End With
End Sub
子超链接问题()
Application.ScreenUpdating=False
Dim xlApp作为对象,xlWkBk作为对象,StrWkBkNm作为字符串,r作为长度
Dim StrFnd作为字符串,StrHLnk作为字符串,STRHTTXT作为字符串
StrWkBkNm=“C:\Users\”环境(“用户名”)和“\Documents\QuestionLinks.xlsx”
如果Dir(StrWkBkNm)=“那么
MsgBox“找不到指定的工作簿:”&StrWkBkNm,vb感叹号
出口接头
如果结束
出错时继续下一步
'启动Excel
设置xlApp=CreateObject(“Excel.Application”)
如果xlApp什么都不是,那么
MsgBox“无法启动Excel”,请使用感叹号
出口接头
如果结束
错误转到0
使用xlApp
'隐藏我们的Excel会话
.Visible=False
'文件可用,请打开它。
设置xlWkBk=.Workbooks.Open(StrWkBkNm,False,True)
如果xlWkBk什么都不是,那么
MsgBox“无法打开:”&vbCr&StrWkBkNm,VBEQUOTION
.Quit:Set xlApp=Nothing:Exit Sub
如果结束
'处理工作簿。
使用xlWkBk
随附工作表(“表1”)
'处理F/R数据
对于r=2到.Cells(.Rows.Count,1).End(-4162).Row'-4162=xlUp
如果Trim(.Range(“A”&r))为空字符串,则
StrFnd=.Range(“A”&r).Text
带.Range(“B”和“r”)
如果.Hyperlinks.Count=1,则
StrHLnk=.Hyperlinks(1).Address
StrHTxt=.Hyperlinks(1).TextToDisplay
其他的
StrHLnk=.Text
StrHTxt=.Text
如果结束
以
呼叫链接问题(StrFnd、StrHLnk、StrHTxt)
如果结束
下一个
以
.关闭错误
以
退出
以
'释放Excel对象内存
Set xlWkBk=Nothing:Set xlApp=Nothing
Application.ScreenUpdating=True
端接头
子链接问题(StrFnd作为字符串,StrHLnk作为字符串,StrHTxt作为字符串)
使用ActiveDocument.Range
和…一起找
.ClearFormatting
.Replacement.ClearFormatting
.Text=StrFnd
.Replacement.Text=“”
.Forward=True
.Wrap=wdFindStop
.Format=False
.MatchCase=True
.MatchWholeWord=True
.执行
以
找,找,找到
.Hyperlinks.Add.Duplicate,StrHLnk,,StrHTxt
.Start=.Hyperlinks(1).Range.End
.Find.Execute
环
以
端接头
运行“HyperlinkQuestions”宏会将您的问题转换为超链接


宏假定您正在使用存储在“文档”文件夹中名为“QuestionLinks.xlsx”的Excel工作簿,并且问题和超链接列表分别位于“Sheet1”的A列和B列中。

基于示例文件:

Sub ReplaceInWordWithLinks()

    Dim wsName As String, ws As Worksheet, oWord As Object, oDoc As Object
    Dim cQNum As Range, qText As String, qContent As String, qLink As String
    Dim lnk As Hyperlink

    wsName = "TestLinkswLinks"

    Set ws = ThisWorkbook.Worksheets(wsName)

    Set oWord = GetObject(, "Word.application") 'get the open Word application
    Set oDoc = oWord.activedocument

    Set cQNum = ws.Range("A1") 'first question

    'do while cell is not blank
    Do While Len(cQNum.Value) > 0

        qText = Trim(cQNum.Value)
        'add trailing period if missing
        If Right(qText, 1) <> "." Then qText = qText & "."
        qContent = cQNum.Offset(0, 1).Value
        'is there an associated link?
        Set lnk = Nothing
        qLink = ""
        On Error Resume Next
        Set lnk = cQNum.Offset(0, 1).Hyperlinks(1)
        On Error GoTo 0
        If Not lnk Is Nothing Then qLink = lnk.Address

        Debug.Print qText, qContent, qLink

        ReplaceQuestionWithLink oDoc, qText, qContent, qLink

        Set cQNum = cQNum.Offset(1, 0) 'next question
    Loop

End Sub

'Replace all occurences of question with content and a link
'  qText = 'Question 3.' (eg)
Function ReplaceQuestionWithLink(doc As Object, qText As String, _
                                 qContent As String, qLink As String)
    Dim rng As Object

    Set rng = doc.Range

    ResetFindParameters rng 'reset Find to defaults

    With rng.Find
        .Text = qText
        Do While .Execute
            rng.Select
            doc.Parent.ActiveWindow.ScrollIntoView rng, True
            rng.Text = qContent             'replace text
            If Len(qLink) > 0 Then
                doc.Hyperlinks.Add rng, qLink   'add link if present
            End If
        Loop
    End With

End Function


Sub ResetFindParameters(oRng As Object)
  With oRng.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = 1 'wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = True '<<
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
End Sub
Sub-ReplaceInWordWithLinks()
将wsName设置为字符串、ws设置为工作表、oWord设置为对象、oDoc设置为对象
Dim cQNum作为范围,qText作为字符串,qContent作为字符串,qLink作为字符串
将lnk设置为超链接
wsName=“TestLinkswLinks”
设置ws=ThisWorkbook.Worksheets(wsName)
Set oWord=GetObject(,“Word.application”)'获取打开的Word应用程序
设置oDoc=oWord.activedocument
设置cQNum=ws.Range(“A1”)的第一个问题
'当单元格不为空时执行
当Len(cQNum.Value)>0时执行
qText=修剪(cQNum.Value)
'如果缺少,则添加尾随句点
如果正确(qText,1)”,则qText=qText&“
qContent=cQNum.Offset(0,1).Value
'是否存在关联链接?
设置lnk=无
qLink=“”
出错时继续下一步
设置lnk=cQNum.Offset(0,1)。超链接(1)
错误转到0
如果不是lnk,则qLink=lnk.Address
调试。打印qText、qContent、qLink
用链接oDoc、qText、qContent、qLink替换问题
设置cQNum=cQNum.Offset(1,0)”下一个问题
环
端接头
'用内容和链接替换所有出现的问题
“qText=”问题3“。(例如)
函数ReplaceQuestionWithLink(文档作为对象,qText作为字符串_
qContent作为字符串,qLink作为字符串)
作为对象的Dim rng
设置rng=单据范围
ResetFindParameters rng“将查找重置为默认值”
用rng.Find
.Text=qText
执行,执行
rng.选择
doc.Parent.ActiveWindow.ScrollIntoView rng,True
rng.Text=qContent“替换文本”
如果Len(qLink)>0,则
doc.Hyperlinks.Add rng,qLink“添加链接(如果存在)”
如果结束
环
以
端函数
子重置FindParameters(或作为对象)
和奥恩一起找
.ClearFormatting
.Replacement.ClearFormatting
.Text=“”
.Replacement.Text=“”
.Forward=True
.Wrap=1'wdFindContinue
.Format=False
.MatchCase=False

.MatchWholeWord=True“如果你想知道你的Word文件是什么样子的,你能添加一个屏幕截图吗?我想用什么样的证据来代替问题14、15和4”