http://answers.microsoft.com/en-us/office/forum/office_2007-office_other/how-do-i-hyperlink-specific-text-within-the-same/598cfd98-6217-4eac-9ac9-969477c46401?auth=1
«Это довольно легко с Pub 2007. Просто Вставить> Закладка и перетащить, что значок, где вы хотите, чтобы ссылка для перехода. Затем выберите текст> вставить гиперссылку> место в этом документе и выберите закладку, которую вы только что создали. единственный раз, когда у меня были проблемы, если страница не достаточно долго, ниже закладки ... и есть обходные пути. http://office.microsoft.com/en-us/publisher-help/create-a-hyperlink-HP010203490.aspx DavidF»
Позвольте мне знать, если это помогает или если вам почему-то нужно сделать это в VBA
Редактировать: . Очень легко написать макрос, чтобы обновлять ссылки на страницы, но ссылки на закладки, по-видимому, плохо поддерживаются объектной моделью, если я не упустил что-то. Мое решение состоит из двух частей.
Прежде всего, ссылки, которые должны быть обновлены, распознаются их текстовым текстом, начинающимся с «страницы» (LIKE «page *»). Макрос обновления просто распознает эти ссылки и изменяет их отображаемый текст на страницу X. Однако это не работает для ссылок на закладки, которые, как представляется, в объектной модели ведут себя как ссылки на страницы, за исключением того, что идентификатор страницы, на который они ссылаются, не существует , Я потратил немало времени, пытаясь понять, какие отношения могут быть между этой несуществующей гиперссылкой и закладкой, но безрезультатно. Вместо этого я создал обходное решение, в котором вы вручную связываете гиперссылку и закладку с тегом (создаете тег для закладки со значением несуществующего идентификатора страницы гиперссылки).
Инструкции для обычных ссылок на страницы
Создать гиперссылку на страницу.Текст должен начинаться с «страницы» (в противном случае RefreshReferenceLinks должен быть отредактирован)
Run C_RefreshReferenceLinks обновить, чтобы проверить, что он работал
Инструкции по ссылкам в закладки (мечение как обойти)
Создать закладку (Insert -> Закладка)
Создание гиперссылки на закладки
Выберите гиперссылку и запустить A_GetPageIdOfHyperlink
Выберите закладку и запустить B_TagBookmarkWithPageId
Run C_RefreshReferenceLinks обновить, чтобы проверить, что он работал
Вы можете загрузить мой примерный проект, содержащий пример содержимого, инструкции и макросы ниже: http://www.filedropper.com/showdownload.php/pageandbookmarklinks (это, вероятно, даст вам предупреждение о безопасности, поскольку она содержит макросы)
Полный список источников
Public Const tagName = "BookmarkPageId"
Sub A_GetPageIdOfHyperlink()
Dim oHyperlink As Hyperlink
Set oHyperlink = ActiveDocument.Selection.TextRange.Hyperlinks(1)
CopyText oHyperlink.pageId
MsgBox oHyperlink.pageId & " copied to clipboard as text"
End Sub
Sub B_TagBookmarkWithPageId()
Dim oShape As Shape
Set oShape = ActiveDocument.Selection.ShapeRange(1)
If IsBookmark(oShape) Then
If TagExists(oShape.Tags, tagName) Then
oShape.Tags(tagName).Delete
End If
Dim txt As String
txt = Trim(GetClipBoardText())
Debug.Print "Ssdsd:" & txt
Dim newTag As Tag
Set newTag = oShape.Tags.Add(tagName, txt)
MsgBox "Tagged as " & tagName & " = '" & txt & "'"
Else
MsgBox "Not a bookmark"
End If
End Sub
Sub C_RefreshReferenceLinks()
Dim oPage As Page
Dim oShape As Shape
For Each oPage In ActiveDocument.Pages
For Each oShape In oPage.Shapes
RefreshInShape oShape
Next oShape
Next oPage
For Each oPage In ActiveDocument.MasterPages
For Each oShape In oPage.Shapes
RefreshInShape oShape
Next oShape
Next oPage
For Each oShape In ActiveDocument.ScratchArea.Shapes
RefreshInShape oShape
Next oShape
End Sub
Function RefreshInShape(oShape As Shape)
Dim cHyperlinks As Hyperlinks
Dim oHyperlink As Hyperlink
If oShape.HasTextFrame = False Then Exit Function
Set cHyperlinks = oShape.TextFrame.TextRange.Hyperlinks
For i = 1 To cHyperlinks.Count
Set oHyperlink = cHyperlinks(i)
If oHyperlink.TargetType = pbHlinkTargetTypePageID Then
If oHyperlink.TextToDisplay Like "page *" Then
oHyperlink.TextToDisplay = "page " & GetPageNumberByPageId(oHyperlink.pageId)
End If
End If
Next i
End Function
Function GetPageNumberByPageId(pageId)
Dim oPage As Page
Dim oShape As Shape
Dim oTag As Tag
For Each oPage In ActiveDocument.Pages
If CLng(oPage.pageId) = CLng(pageId) Then
GetPageNumberByPageId = oPage.PageNumber
Exit Function
End If
Next oPage
For Each oPage In ActiveDocument.Pages
For Each oShape In oPage.Shapes
If TagExists(oShape.Tags, tagName) Then
Set oTag = oShape.Tags(tagName)
If CStr(oTag.Value) = CStr(pageId) Then
GetPageNumberByPageId = oPage.PageNumber
Exit Function
End If
End If
Next oShape
Next oPage
GetPageNumberByPageId = "[ERROR]"
End Function
Function IsBookmark(oShape As Shape)
IsBookmark = False
If oShape.Type = pbWebHTMLFragment And oShape.AutoShapeType = msoShapeMixed Then
IsBookmark = True
End If
End Function
Function TagExists(collection As Tags, itemName As String) As Boolean
TagExists = False
Dim oTag As Tag
For Each oTag In collection
If oTag.Name = itemName Then
TagExists = True
Exit For
End If
Next oTag
End Function
Function GetParentOfType(obj As Object, sTypeName As String)
Do Until TypeName(GetParentOfType) = "Page"
Set GetParentOfType = obj.Parent
Loop
End Function
Sub CopyText(Text As String)
'VBA Macro using late binding to copy text to clipboard.
'By Justin Kay, 8/15/2014
'Thanks to http://akihitoyamashiro.com/en/VBA/LateBindingDataObject.htm
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText Text
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing
End Sub
Function GetClipBoardText() As String
Set DataObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
On Error GoTo Whoa
'~~> Get data from the clipboard.
DataObj.GetFromClipboard
'~~> Get clipboard contents
GetClipBoardText = DataObj.GetText(1)
Exit Function
Whoa:
GetClipBoardText = ""
End Function
Спасибо за ваш ответ, но гиперссылкой не совсем то, что я хотел. Я хотел бы вставить фразу типа «см. Стр. 22 для примера», где «22» динамически обновляется при изменении документа. Например, если этот пример перемещен на страницу 24, фраза должна обновиться и прочитать «см. Стр. 24 для примера». – Alberto
Привет, Альберто, пожалуйста, проверьте, помогает ли мой новый ответ! – Jbjstam
Спасибо! Я это попробую :-) – Alberto