更新选择

时间:2015-05-19 09:22:09

标签: excel-vba hyperlink vba excel

我的超链接有问题。

我有一些代码可以很好地用于其目的。然而,它做了另外一些我不想要的东西,对我来说没有意义为什么它正在发生。

我的代码如下:

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手动运行代码,检查它似乎正在更新的每个超链接的列号和行号,它甚至不会更改为模板列!

我很茫然。请帮忙。

2 个答案:

答案 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是活动表。

所以上面的代码是一种解决方法。超链接(除了模板中的所有超链接都是唯一的)都会正确更新。模板列也会更新,但上面的代码意味着每次都可以为新列创建正确的超链接,即使模板上的超链接是“错误的”。

代码查找包含超链接的单元格的地址,并将其用作超链接。这正是我想要的,我不需要模板列在开始时是正确的。