我的超链接有问题。
我有一些代码可以很好地用于其目的。然而,它做了另外一些我不想要的东西,对我来说没有意义为什么它正在发生。
我的代码如下:
Dim hLink As Hyperlink
Dim cColumn As Range
Dim Path1 As String
Dim Path2 As String
Dim pathEnd As Integer
Set cColumn = Columns(int4)
str3 = ColumnLetter(ActiveCell.Column)
For Each hLink In cColumn.Hyperlinks
pathEnd = InStr(hLink.SubAddress, "!")
Path1 = Left(hLink.SubAddress, pathEnd)
pathEnd = Len(hLink.SubAddress) - InStr(hLink.SubAddress, ColLetter)
Path2 = Right(hLink.SubAddress, pathEnd)
hLink.SubAddress = Path1 & str3 & Path2
Next hLink
int1在前一个子例程中查找列号。 ColumnLetter查找新列的列字母。
这是完整代码的作用(其中一些不包括在内)。
我有一个“模板”列,它被复制到一个新列。信息在新列中更新,然后在程序结束时,运行此超链接子例程。
它工作得很好,但是将超链接地址中的模板列的字母替换为新列。
但是一旦运行,模板列中的超链接也会发生变化。
我已经在运行超链接子例程之前停止了代码,并且超链接是预期的并且没有更改 - 即两个列都匹配模板列中的链接。因此,我确信这是问题代码(这是有道理的)。
我尝试了多次选择新列的迭代,但无济于事,它总是更改两列中的超链接。
我甚至使用F8手动运行代码,检查它似乎正在更新的每个超链接的列号和行号,它甚至不会更改为模板列!
我很茫然。请帮忙。
答案 0 :(得分:0)
我认为Hyperlinks
存储在Range
以上的级别,但可以在Range
级别返回。也就是说,Excel将所有Hyperlinks
存储在一个位置,然后为您提供方便的函数来返回锚定在给定Hyperlinks
中的Range
。如果在复制/粘贴它们之后输出超链接的所有信息,你会发现一些真正的怪异。看起来如果你复制一个范围,你只需复制一个对超链接的引用,而不是一个新的。
我认为如果您想要更改超链接而不影响另一个,您可能需要创建一个新的超链接。
显示一些奇怪的代码
Sub MakeHyperlinks()
Dim rng_cell1 As Range
Set rng_cell1 = Range("A1")
'create a hyperlink to cell one row below
rng_cell1.Hyperlinks.Add rng_cell1, "", rng_cell1.Offset(1).Address, , rng_cell1.Offset(1).Address
'copy that column and paste (insert) next door several times
For i = 1 To 5
rng_cell1.EntireColumn.Copy
rng_cell1.EntireColumn.Insert
Next
OutputHyperlinkInfo
'change original hyperlink
rng_cell1.Hyperlinks(1).SubAddress = "b2"
OutputHyperlinkInfo
End Sub
Sub OutputHyperlinkInfo()
Dim sht As Worksheet
Set sht = ActiveSheet
Dim hyp As Hyperlink
Dim rng_hyp As Range
Debug.Print Join(Array("rng.address", "hyp.Name", "hyp.Range", "hyp.Address", "hyp.SubAddress", "hyp.TextToDisplay"), "|")
For Each rng_hyp In sht.UsedRange.SpecialCells(xlCellTypeConstants)
For Each hyp In rng_hyp.Hyperlinks
Debug.Print Join(Array(rng_hyp.Address, hyp.Name, hyp.Range, hyp.Address, hyp.SubAddress, hyp.TextToDisplay), "|")
Next
Next
End Sub
结果包括Subs的立即输出。
rng.address|hyp.Name|hyp.Range|hyp.Address|hyp.SubAddress|hyp.TextToDisplay
$A$1|$A$2|$A$2||$A$2|$A$2
$B$1|$A$2|$A$2||$A$2|$A$2
$C$1|$A$2|$A$2||$A$2|$A$2
$D$1|$A$2|$A$2||$A$2|$A$2
$E$1|$A$2|$A$2||$A$2|$A$2
$F$1|$A$2|$A$2||$A$2|$A$2
rng.address|hyp.Name|hyp.Range|hyp.Address|hyp.SubAddress|hyp.TextToDisplay
$A$1|$A$2|$A$2||b2|$A$2
$B$1|$A$2|$A$2||b2|$A$2
$C$1|$A$2|$A$2||b2|$A$2
$D$1|$A$2|$A$2||b2|$A$2
$E$1|$A$2|$A$2||b2|$A$2
$F$1|$A$2|$A$2||b2|$A$2
这里要注意的重要一点是,即使原始调用是针对单个单元格,所有SubAddress
也都已更改。它有点好奇所有超链接都具有相同的Name
。不确定这是否表明这里发生了什么。
答案 1 :(得分:0)
Dim hLink As Hyperlink
Dim cColumn As Range
Set cColumn = Columns(int4)
For Each hLink In cColumn.Hyperlinks
str2 = "'" & str1 & "'!" & hLink.Range.Address
hLink.SubAddress = str2
Next hLink
str1是活动表。
所以上面的代码是一种解决方法。超链接(除了模板中的所有超链接都是唯一的)都会正确更新。模板列也会更新,但上面的代码意味着每次都可以为新列创建正确的超链接,即使模板上的超链接是“错误的”。
代码查找包含超链接的单元格的地址,并将其用作超链接。这正是我想要的,我不需要模板列在开始时是正确的。