Я относительно новичок в коде VBA в Excel, поэтому, пожалуйста, простите меня, если ответ будет простым (я ожидаю, что он обычно простой). Я использую Excel 2010, для справки. Я пытаюсь сделать следующее с помощью следующего скрипта:
Если в любую ячейку столбца D вводится числовая строка (любое значение), мне нужно, чтобы она автоматически преобразовывалась в гиперссылку, которая добавляла бы определенную адресную строку перед значением целевой ячейки и выдавала бы понятное имя, включающее значение ячейки.
Другими словами, вот пример функции Excel, которую я пытаюсь воспроизвести с помощью макроса:
=HYPERLINK("http://stprs553/tickets/list/single_ticket/293136","Ticket #293136")
Или, более конкретно (должно прояснить картину):
=HYPERLINK(CONCATENATE("http://stprs553/tickets/list/single_ticket/","Target_Cell_Data"),"Ticket #Target_Cell_Data")
293136это пример числовой строки, которую я хочу, чтобы пользователь мог ввести в любую ячейку в столбце D. Когда они это сделают, я хочу, чтобы эта ячейка была преобразована в гиперссылку, используя числовую строку в качестве базовых данных, добавляя остаток URL слева от значения ячейки, а затем создавая понятное имя, которое объединяет "Ticket #" с числовой строкой из значения ячейки. Я не хочу, чтобы моим пользователям приходилось изучать формулы Excel, чтобы иметь ссылку, или тратить время на копирование обоих концов функции для обертывания данных ячейки.
Вот что у меня есть на данный момент в VBA:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rangeLimit As Range
Set rangeLimit = Range("D:D")
If Not Intersect(rangeLimit, Target) Is Nothing Then
If Target <> "" Then
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & c.Value, TextToDisplay:="Ticket #" & c.Value, Target.Value
End If
End If
End Sub
Вот с какими проблемами я сталкиваюсь:
1.) Если я попытаюсь запустить формулу как есть, я получу ошибку компиляции. 2.) Если я удалю конец , Target.Value
строки гиперссылки, я получу ошибку 424, «Требуется объект».
Что я делаю не так, и/или как мне создать макрос для выполнения нужной функции? Целый час поиска в Google и просмотр некоторых постов StackOverflow привели меня к тому, что у меня есть сейчас, но это все еще не работает.
решение1
Я думаю, что вызов функции должен быть таким:
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value
Я просто изменил оба вхождения на c
, Target
что, как я думаю, сделает то, что вы описываете. Ошибка «Требуется объект» выдается, потому что c
не был инстанцирован ни для чего — вы не можете получить член чего-то, что не является объектом.
EDIT, чтобы устранить проблему с неизменяемым текстом ячейки:
Я задавался вопросом, останется ли текст ячейки просто числом. Исправление будет выглядеть примерно так, я думаю:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rangeLimit As Range
Set rangeLimit = Range("D:D")
If Not Intersect(rangeLimit, Target) Is Nothing Then
If IsNumeric(Target) And Not IsEmpty(Target) Then ' This condition should avoid munging of already-existing links, though if any tickets might be non-numeric it won't work properly.
Application.EnableEvents = False ' Must turn off event handling
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value
Target.Formula = "Ticket #" & Target.Value ' Should actually change the displayed text
Application.EnableEvents = True
End If
End If
End Sub
Важно отключить обработку событий всякий раз, когда вы используете VBA для редактирования содержимого ячейки внутри такого события, иначе вы рискуете попасть в бесконечный цикл. Я должен был подумать об этом изначально; но, похоже, что применение гиперссылки к ячейке не вызывает Worksheet_Change
.
Обратите внимание, что если вы удалите гиперссылку из ячейки, ячейка останется отформатированной как «подчеркнутая» и «цвет шрифта синий». Для вашего варианта использования, где столбец всегда будет либо ссылками на тикеты, либо пустыми ячейками, это, вероятно, приемлемо?