ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码实现目录中的超链接不受工作表改名及行列变动影响?

如何用vba代码实现目录中的超链接不受工作表改名及行列变动影响?

作者:绿色风 分类: 时间:2022-08-17 浏览:99
楼主
kevinchengcw
Q: 如何用vba代码实现目录中的超链接不受工作表改名及行列变动影响?
A: 利用单元格批注可以曲线实现这一目标,代码解释如下:
模块中的代码:
  1. Sub test()  '本程序用于将超链接中的源单元格和目标单元格添加上批注,用批注来记录相关信息
  2. Dim HLK As Hyperlink, Arr
  3. For Each HLK In Worksheets("目录").Hyperlinks   '循环目录表中的各个链接
  4.     Arr = Split(HLK.SubAddress, "!")    '提取链接地址(本工作簿内的),并拆分放入数组
  5.     With HLK.Parent '为链接所在单元格写入批注,内容为目标单元格所在工作表的codename,这样不受工作表改名影响
  6.         .ClearComments
  7.         .AddComment Worksheets(Replace(Arr(0), "'", "")).CodeName
  8.     End With
  9.     With Range(HLK.SubAddress)  '对于目标单元格则写入目录表的codename和单元格地址,以"!"分隔,方便拆分
  10.         .ClearComments
  11.         .AddComment HLK.Parent.Parent.CodeName & "!" & HLK.Parent.Address
  12.     End With
  13. Next HLK
  14. End Sub

Thisworkbook中代码:
  1. Private Sub Workbook_SheetActivate(ByVal Sh As Object)  '当工作表激活时执行下述语句
  2. Dim HLK As Hyperlink, Arr, Str$, Dic As Object, WS As Worksheet
  3. If Sh.CodeName = "Sheet1" Then  '判断是不是目录工作表(即使目录工作表改名也可以继续有效,因为是检测codename
  4.     Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,用于装载工作表名与codename对应关系
  5.     For Each WS In Worksheets   '循环提取各表名和codename
  6.         Dic.Add WS.CodeName, WS.Name
  7.     Next WS
  8.     For Each HLK In Sh.Hyperlinks   '循环各个链接
  9.         Arr = Split(HLK.SubAddress, "!")    '获取工作簿内地址并拆分放入数组
  10.         Arr(0) = Dic(HLK.Parent.Comment.Text)   '更新工作表名
  11.         HLK.SubAddress = Join(Arr, "!") '组合后更新地址
  12.     Next HLK
  13.     Set Dic = Nothing   '清空字典项目
  14. End If
  15. End Sub

  16. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)    '单元格选择变更时执行下述代码
  17. Dim Cmt As Comment, Arr, Str$, Dic As Object, WS As Worksheet
  18. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目
  19. For Each WS In Worksheets   '循环添加工作表名与codename对应关系
  20.     Dic.Add WS.CodeName, WS.Name
  21. Next WS
  22. If Sh.CodeName <> "Sheet1" Then '如果不是目录表,则
  23.     For Each Cmt In Sh.Comments '循环各个批注
  24.         If Cmt.Text Like "*!*" Then '如果批注符合特征(该特征可进一步修改以进一步符合实际使用中情况)
  25.             Arr = Split(Cmt.Text, "!")  '拆分放入数组
  26.             With Worksheets(Dic(Arr(0)))    '对于codename所对应的工作表
  27.                 Str = .Range(Arr(1)).Text   '提取单元格文字
  28.                 .Range(Arr(1)).ClearContents    '清除现有内容
  29.                 .Hyperlinks.Add .Range(Arr(1)), "", "'" & Dic(Cmt.Parent.Parent.CodeName) & "'!" & Cmt.Parent.Address, Str, Str '重新添加链接地址
  30.             End With
  31.         End If
  32.     Next Cmt
  33. End If
  34. Set Dic = Nothing   '清空字典项目
  35. End Sub

附示例文件。
智能超链接.rar
2楼
whong003
代码 贴在什么地方啊。希望说一下。。不懂
3楼
lrlxxqxa
下载附件后即可清晰。
4楼
syc7447
这个一定得收藏
5楼
sweetless05
haodongxi好东西就是不会用

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap