2016-04-08 3 views
0

Я новичок в MS Publisher 2010, и я пытаюсь добавить «динамическую» ссылку на определенную страницу. В идеале, визуализированы текст должен быть что-то вроде:Вставить ссылку на номер страницы в Microsoft Publisher 2010

...see the example on page XXX 

Я хотел бы сделать XXX часть визуализировать номер страницы, на я имею в виду. Я видел, что вы можете размещать закладки в документе и создавать гиперссылки для этих закладок, но до сих пор мне не удавалось визуализировать номер страницы, привязанный к закладке.

Чтобы сделать еще один пример, я хотел бы эквивалент этого выражения Latex:

...see the example on page~\pageref{reference-to-XXX} 

было бы возможно получить этот эффект в Publisher 2010, может быть, с помощью VB скрипт? Спасибо за помощь!

ответ

1

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. Однако это не работает для ссылок на закладки, которые, как представляется, в объектной модели ведут себя как ссылки на страницы, за исключением того, что идентификатор страницы, на который они ссылаются, не существует , Я потратил немало времени, пытаясь понять, какие отношения могут быть между этой несуществующей гиперссылкой и закладкой, но безрезультатно. Вместо этого я создал обходное решение, в котором вы вручную связываете гиперссылку и закладку с тегом (создаете тег для закладки со значением несуществующего идентификатора страницы гиперссылки).

Инструкции для обычных ссылок на страницы

  1. Создать гиперссылку на страницу.Текст должен начинаться с «страницы» (в противном случае RefreshReferenceLinks должен быть отредактирован)

  2. Run C_RefreshReferenceLinks обновить, чтобы проверить, что он работал

Инструкции по ссылкам в закладки (мечение как обойти)

  1. Создать закладку (Insert -> Закладка)

  2. Создание гиперссылки на закладки

  3. Выберите гиперссылку и запустить A_GetPageIdOfHyperlink

  4. Выберите закладку и запустить B_TagBookmarkWithPageId

  5. 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 
+0

Спасибо за ваш ответ, но гиперссылкой не совсем то, что я хотел. Я хотел бы вставить фразу типа «см. Стр. 22 для примера», где «22» динамически обновляется при изменении документа. Например, если этот пример перемещен на страницу 24, фраза должна обновиться и прочитать «см. Стр. 24 для примера». – Alberto

+0

Привет, Альберто, пожалуйста, проверьте, помогает ли мой новый ответ! – Jbjstam

+0

Спасибо! Я это попробую :-) – Alberto

Смежные вопросы