MSWord, как отключить / разорвать первую ссылку на документ Excel, не нарушая оставшийся набор гиперссылок - PullRequest
0 голосов
/ 29 мая 2020

Я хочу создать шаблон слова, который имеет связанную таблицу Excel через поле со следующим кодом:

{LINK Excel.SheetMacroEnabled.12 D: \ calendar.xlsm calendar! NamedR \ f 4 \ h \ * MERGEFORMAT}

Таблица находится в Excel и обновляется ежедневно. В Excel есть несколько столбцов, и в одном из них есть ряд гиперссылок на различные веб-сайты. Когда я пытаюсь разорвать ссылку на таблицу, чтобы создать остальную часть документа и заархивировать его с помощью следующего кода, я всегда получаю все ссылки (включая гиперссылки на веб-сайты) в связанной таблице. Забавно то, что когда я делаю это вручную и выбираю таблицу в Word, она разрывает только ссылку на таблицу Excel, оставляя гиперссылки в столбце таблицы нетронутыми. Это желаемый программный c результат. Я попробовал 2 следующих макроса, и ни один из них не работает. Есть ли способ добиться этого через VBA, не разрывая все ссылки в связанной таблице?

Sub ConvertTableLink()

    Dim myField As Field

   For Each myField In ActiveDocument.Fields
      If myField.Type = wdFieldLink Then
         myField.Unlink
      End If
   Next

End Sub

Sub ConvertTableLinkTake2()

   ActiveDocument.Fields(1).Update
   ActiveDocument.Fields(1).Unlink

End Sub

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Непонятно, почему ваши ссылки остаются, когда вы отключили поле LINK вручную, но не с помощью VBA. Вообще говоря, я наблюдаю то же поведение независимо от того, как я это делаю здесь - ссылки остаются синими, поэтому они по-прежнему выглядят как ссылки, но это не так.

Вы можете самостоятельно «отсоединить», чтобы сохранить гиперссылки, использующие это, предполагая, что LINK является первым полем LINK в документе:

Sub replaceLinkByResult1()
Dim fld As Word.Field
Dim rng As Word.Range
For Each fld In ActiveDocument.Fields
  If fld.Type = wdFieldLink Then
    Set rng = fld.Result.Tables(1).Range
    rng.Copy
    fld.Delete
    rng.Paste
    Exit For
  End If
Next
End Sub

Если копирование / вставка не работает или вы предпочитаете избегать этого, также должно работать следующее:

Sub replaceLinkByResult2()
Dim fld As Word.Field
Dim rng1 As Word.Range
Dim rng2 As Word.Range
For Each fld In ActiveDocument.Fields
  If fld.Type = wdFieldLink Then
    Set rng1 = fld.Result.Tables(1).Range
    Set rng2 = rng1.Duplicate
    rng2.Collapse wdCollapseEnd
    rng2.Start = rng2.Start + 1
    rng2.InsertParagraph
    rng2.Start = rng2.Start + 1
    rng2.FormattedText = rng1.FormattedText
    fld.Delete
    Set rng2 = Nothing
    Set rng1 = Nothing
    Exit For
  End If
Next
End Sub
0 голосов
/ 31 мая 2020

Например, если связанный объект является первым полем в документе:

Sub Demo()
Dim Rng As Range, Hlnk As Hyperlink, i As Long
Dim StrDisp As String, StrLink As String, StrFont As String, StrSize As String
With ActiveDocument.Fields(1)
  Set Rng = .Result
  With Rng
    For Each Hlnk In .Hyperlinks
      StrDisp = StrDisp & "|" & Hlnk.TextToDisplay
      StrLink = StrLink & "|" & Hlnk.Address
      StrFont = StrFont & "|" & Hlnk.Range.Font.Name
      StrSize = StrSize & "|" & Hlnk.Range.Font.Size
    Next
  End With
  .Unlink
  With Rng
    For i = 1 To UBound(Split(StrDisp, "|"))
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Format = False
        .Text = Split(StrDisp, "|")(i)
        .Replacement.Text = ""
        .Wrap = wdFindStop
        .Execute
      End With
      Set Hlnk = .Hyperlinks.Add(Anchor:=.Duplicate, Address:=Split(StrLink, "|")(i), TextToDisplay:=Split(StrDisp, "|")(i))
      Hlnk.Range.Font.Name = Split(StrFont, "|")(i)
      Hlnk.Range.Font.Size = Split(StrSize, "|")(i)
    Next
  End With
End With
End Sub
...