【问题标题】:Updating hyperlinks in selection更新选择中的超链接
【发布时间】:2015-05-19 09:22:08
【问题描述】:

我的超链接有问题。

我有一些代码非常适合它的用途。但是,它还做了一些我不想要的事情,对我来说它为什么会发生毫无意义。

我的代码如下:

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

我很茫然。请帮忙。

【问题讨论】:

  • 黑暗中的一枪:将Set cColumn = Columns(int4) 更改为Set cColumn = Sheets("Sheet1").Columns(int4)Sheets("Sheet1") 更改为相关工作表。同样避免使用ActiveCell.Column 使用像Sheets("Sheet1").Columns(1) 这样的对象
  • 不,那没用。请注意,模板列与新列位于同一工作表中。

标签: excel hyperlink vba


【解决方案1】:

我相信Hyperlinks 存储在Range 之上的级别,但可以在Range 级别返回。也就是说,Excel 将所有Hyperlinks 存储在一个位置,然后为您提供一个方便的函数来返回锚定在给定Range 中的Hyperlinks。如果在复制/粘贴它们之后输出超链接的所有信息,你会发现一些真正的奇怪之处。看起来如果你复制一个范围,你只是复制一个对超链接的引用而没有得到一个新的。

我想如果你想改变超链接而不影响另一个,你可能需要创建一个新的超链接。

显示一些奇怪的代码

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。不确定这是否表明这里发生了什么。

【讨论】:

  • 非常感谢您的回答。我相信这会满足我的需要,因此将其作为答案。出于我的目的,我找到了一种更有效的解决方法,这意味着我可以忽略“模板”发生的情况(请参阅下面的答案)。
【解决方案2】:
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 是活动表。

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

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

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2012-12-10
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多