Как указать относительный путь к книге в поле LINK? - PullRequest
0 голосов
/ 30 декабря 2018

После специальной вставки ссылки из диапазона ячеек из Excel в Word (2013) поле выглядит следующим образом:

{ LINK Excel.Sheet.12 "D:\\RelativePath\\1\\work\\tmp.xlsx" Sheet1!NamedRange \a \p }

Если вы переместите источник (.xlsx)и получатель (.docx) в папку 2, вам нужно изменить ссылку в поле LINK так, чтобы она выглядела так:

{ LINK Excel.Sheet.12 "D:\\RelativePath\\2\\work\\tmp.xlsx" Sheet1!NamedRange \a \p }

Когда таких полей много,это неудобно.

Я попробовал и это:

{ LINK Excel.Sheet.12 "...\\...\\work\\tmp.xlsx" Sheet1!NamedRange \a \p }

и это:

{ LINK Excel.Sheet.12 "~\\work\\tmp.xlsx" Sheet1!NamedRange \a \p } но ничего не работает.

Это тоже не работает:

Как создать абсолютные гиперссылки и относительные гиперссылки в документах Word

Можно ли указать в поле LINK не абсолютное значение,но относительный адрес источника?

Upd @ Синди Мейстер предложила решение, и после некоторого уточнения код работает нормально.

Вот он:

Sub updateLINKs()
Dim doc As Word.Document
Dim fld As Word.Field
Dim sFilePath As String, sFileName As String
Set doc = ActiveDocument
sFilePath = doc.Path
For Each fld In doc.Fields
    If fld.Type = wdFieldLink Then
      If fld.Result.InlineShapes.Count > 0 And _
         InStr(fld.OLEFormat.ClassType, "Excel") And _
         fld.LinkFormat.SourcePath <> sFilePath Then
           sFileName = fld.LinkFormat.SourceName
           fld.LinkFormat.SourceFullName = sFilePath & "\" & sFileName
      End If
    End If
Next
End Sub

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Невозможно использовать относительные пути в полях Link.Путь должен быть обновлен / изменен в коде поля.Это можно сделать достаточно простым способом, используя возможности, предоставляемые свойством LinkFormat.

Например, если предположить, что относительный путь будет таким же, как в документе Word, следующий код:

  1. Получает путь из свойства Document.Path
  2. Зацикливает все поля в документе и определяет, являются ли они полем LINK из источника Excel, который отображает InlineShape (объект, а не текст).Поля зациклены в обратном порядке, так как изменение пути приводит к тому, что Word удаляет и воссоздает ССЫЛКУ в фоновом режиме.Это означает, что цикл с начала документа будет многократно «попадать» в одно и то же поле, что приведет к бесконечному циклу.
  3. Определяет текущее имя файла для связанного объекта из поля Link, используя LinkFormat.SourceName
  4. Объединяет информацию и присваивает ее свойству LinkFormat.SourceFullName

Обратите внимание, что свойства LinkFormat.SourcePath и LinkFormat.SourceName доступны только для чтения, поэтому путь можно изменить толькоиспользуя SourceFullName.

Sub UpdateLinks()
    Dim doc As Word.Document
    Dim fld As Word.Field, nrFields As Long, i As Long
    Dim sFilePath As String, sFileName As String

    Set doc = ActiveDocument
    sFilePath = doc.path
    nrFields = doc.Fields.Count
    For i = nrFields To 1 Step -1
        Set fld = doc.Fields(i)
        If fld.Type = wdFieldLink Then
          If fld.result.InlineShapes.Count > 0 And _
             InStr(fld.OleFormat.ClassType, "Excel") Then
               sFileName = fld.LinkFormat.SourceName
               fld.LinkFormat.SourceFullName = sFilePath & "\" & sFileName
          End If
        End If
    Next
End Sub
0 голосов
/ 30 декабря 2018

Вы не можете указать относительный путь в поле LINK.Это потребует встраивания другого поля в поле LINK, но, как я уже говорил ранее, вы не можете сделать это с полями LINK.Ссылка, которую вы разместили, касается только настройки гиперссылки для гиперссылок, что также не приводит к действительно относительной ссылке.

Единственный обходной путь для поля LINK - использование макроса, который обновляет абсолютный путь..

...