Как в VBA добавить гиперссылку к моему объекту комментария?

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

Вот как выглядит код. Я подозреваю, что проблема связана с частью ActiveDocument.Hyperlink.Add, но я не могу найти решение, чтобы мой макрос нацеливался на активный объект комментария, а не на ActiveDocument...

Sub new_comment()
'
' new_comment Macro
'
'
Selection.Comments.Add Range:=Selection.Range, Text:= \_
"This is my text."
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= \_
"https://google.com" \_
, SubAddress: = "", ScreenTip: = "", TextToDisplay: = "This is my source"

End Sub

Есть идеи?

Я попытался вручную добавить текст привязки и гиперссылку во время записи макроса, и он не зарегистрировал мои команды.

=== ОБНОВЛЕНИЕ ===

Приведенное ниже решение Тима работает хорошо, затем я попытался добавить несколько блоков кода, по одному для каждого предустановленного комментария, который я хочу запустить в Word. Каждый последующий комментарий, который я добавляю с помощью этих макросов, будет вставлять якорь гиперссылки в первый комментарий документа.

Итак, если я запущу три макроса ниже по порядку, new_comment_1 и new_comment_2 привяжут свою гиперссылку где-нибудь в new_comment. Есть какие нибудь идеи как это починить?

Sub new_comment()

    Dim cmt As Comment

    Set cmt = Selection.Comments.Add(Range:=Selection.Range, _
                Text: = "This is my text. This is my source.")
    
    HyperlinkComment cmt, "This is my source", "https://google.com"
    
End Sub

Sub HyperlinkComment(cmt As Comment, linkText As String, URL As String)
    Dim p As Long, rng As Range
    Set rng = cmt.Range
    p = InStr(1, cmt.Range.Text, linkText, vbTextCompare)
    If p > 0 Then
        rng.SetRange Start:=p, End:=p + Len(linkText)
        cmt.Parent.Hyperlinks.Add Anchor:=rng, Address:=URL
    End If
End Sub

Sub new_comment_1()

    Dim cmt As Comment

    Set cmt = Selection.Comments.Add(Range:=Selection.Range, _
                Text: = "This is my second preset comment. This is my second source.")
    
    HyperlinkComment cmt, "This is my second source.", "https://www.wikipedia.org/"
    
End Sub

Sub new_comment_2()

    Dim cmt As Comment

    Set cmt = Selection.Comments.Add(Range:=Selection.Range, _
                Text: = "This is my third preset comment. This is my third source.")
    
    HyperlinkComment cmt, "This is my third source.", "https://www.un.org/en/"
    
End Sub
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: обновлено - удален вызов SetRange в HyperlinkComment и вместо этого используется MoveStart / MoveEnd, что, похоже, исправило ситуацию.

Что-то вроде этого:

Sub Tester()
 
    Dim doc As Document, i As Long
    
    
    Set doc = ThisDocument
    
    'for testing - remove any existing comments
    For i = doc.Comments.Count To 1 Step -1
        doc.Comments(i).Delete
    Next i
    
    new_comment doc.Paragraphs(1).Range, "This is my text. This is my source....", _
                "This is my source", "https://google.com"
                
    
    new_comment doc.Paragraphs(3).Range, "This is my text2. This is my source2....", _
                "This is my source", "https://yahoo.com"
                            
    
    new_comment doc.Paragraphs(5).Range, "This is my text3. This is my source3....", _
                "This is my source", "https://www.wikipedia.org"


End Sub


Sub new_comment(rng As Range, txt As String, linktxt As String, URL As String)

    Dim cmt As Comment

    Set cmt = rng.Parent.Comments.add(Range:=rng, Text:=txt)
    HyperlinkComment cmt, linktxt, URL
    
End Sub

Sub HyperlinkComment(cmt As Comment, linkText As String, URL As String)
    Dim p As Long, rng As Range, cmtLen As Long, p2 As Long
    Set rng = cmt.Range
    cmtLen = Len(rng.Text)
    p = InStr(1, cmt.Range.Text, linkText, vbTextCompare)
    p2 = p + Len(linkText)
    If p > 0 Then
        rng.MoveStart wdCharacter, p - 1
        If p2 < cmtLen Then rng.MoveEnd wdCharacter, -(cmtLen - p2) - 1
        cmt.Parent.Hyperlinks.add Anchor:=rng, Address:=URL
    End If
End Sub

Спасибо, Тим. Однако я только что запустил ваш код в VBA, он создает комментарий «Это мой текст. Это мой источник», но «Это мой источник». на нем нет гиперссылки.

pipo_exquis 31.05.2023 19:01

Работает на меня, как опубликовано. Вы отладили? Например, проходит ли тест If p > 0 Then?

Tim Williams 31.05.2023 19:11

Привет, Тим, я немного поработал с твоим кодом, и у меня возникли проблемы с якорями. Я обновил исходный пост.

pipo_exquis 02.06.2023 21:33

См. правку выше.

Tim Williams 04.06.2023 01:54

Я использую этот код всю неделю, он работает так, как и предполагалось, для вставки предустановленных комментариев. Однако, когда я создаю новый документ Word, этот код всегда создает комментарий «Это мой текст. Это мой источник…». вверху пустого документа.

pipo_exquis 12.06.2023 15:10

В этом коде нет ничего, что запускается автоматически, поэтому я не уверен, почему он создал этот комментарий? Вы внесли какие-то изменения?

Tim Williams 12.06.2023 17:26

Я не делал никаких изменений. Я думал, что это могла быть подпрограмма «Тестер», так как именно здесь я нахожу текст «Это мой текст. Это мой источник ...», но комментарий все еще там, когда я создаю новый документ даже после удаления что суб. Интересно, что комментарий всегда датирован 5 июня 2023 года в 08:26.

pipo_exquis 13.06.2023 19:45

Кажется, в вашем шаблоне документа (Normal.dotm) может быть комментарий? support.microsoft.com/en-au/office/…

Tim Williams 13.06.2023 19:49

Я посмотрю на это, это, вероятно, проблема с normal.dotm Спасибо!

pipo_exquis 14.06.2023 15:43

Другие вопросы по теме

Есть ли макрос или способы преобразования диаграмм в изображения внутри документа Word?
Apache POI - установите две диаграммы рядом в документе Word
Почему я получаю недействительный токен доступа от On-behalf-of-flow?
Заполнение поля подавляет или закрывает подсказку при добавлении
Регулярное выражение для поиска подстановочных знаков Word для поиска круглых скобок, содержащих не менее 3 последовательных цифр
Добавьте фигуру в текстовый документ, перекрывая существующие абзацы
Изменить действие Tab в Microsoft Word
Я пытаюсь создать гистограмму в текстовом документе, используя Apache POI. Я не могу открыть документ Word, хотя файл был успешно завершен
Скрыть документ при инициализации пользовательской формы, не затрагивая другие несвязанные документы, но сохраняя при этом значок на панели задач
Редактируйте документы Word и отслеживайте изменения с помощью Python