我对 Excel 中的 VBA 代码还比较陌生,所以如果答案很简单(我希望通常都是这样),请原谅我。我使用的是 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
尚未实例化为任何东西——您无法检索非对象成员。
编辑,解决单元格文本不变的问题:
我想知道单元格文本是否只保留数字。我认为修复方法将如下所示:
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
。
请注意,如果您从单元格中删除超链接,单元格的格式仍为“带下划线”和“蓝色字体颜色”。对于您的用例,列将始终是指向票证的链接或空白单元格,这可能是可以接受的?