Я пытаюсь создать макросы в 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





Обновлено: обновлено - удален вызов 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
Работает на меня, как опубликовано. Вы отладили? Например, проходит ли тест If p > 0 Then?
Привет, Тим, я немного поработал с твоим кодом, и у меня возникли проблемы с якорями. Я обновил исходный пост.
См. правку выше.
Я использую этот код всю неделю, он работает так, как и предполагалось, для вставки предустановленных комментариев. Однако, когда я создаю новый документ Word, этот код всегда создает комментарий «Это мой текст. Это мой источник…». вверху пустого документа.
В этом коде нет ничего, что запускается автоматически, поэтому я не уверен, почему он создал этот комментарий? Вы внесли какие-то изменения?
Я не делал никаких изменений. Я думал, что это могла быть подпрограмма «Тестер», так как именно здесь я нахожу текст «Это мой текст. Это мой источник ...», но комментарий все еще там, когда я создаю новый документ даже после удаления что суб. Интересно, что комментарий всегда датирован 5 июня 2023 года в 08:26.
Кажется, в вашем шаблоне документа (Normal.dotm) может быть комментарий? support.microsoft.com/en-au/office/…
Я посмотрю на это, это, вероятно, проблема с normal.dotm Спасибо!
Спасибо, Тим. Однако я только что запустил ваш код в VBA, он создает комментарий «Это мой текст. Это мой источник», но «Это мой источник». на нем нет гиперссылки.