【问题标题】:VBA Loop to update a hyperlink for each cell in a columnVBA循环更新列中每个单元格的超链接
【发布时间】:2019-03-21 18:30:59
【问题描述】:

我编辑了这个问题,因为我犯了一个小错误,并决定不将我正在使用的单元格引用简化为简单的引用。

我选择通过运行宏来更新特定单元格中的超链接。

Range("AB118").Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
Range("Z118") & Range("AD105")

所以基本上:

AB 列包含最终的超链接,例如。主页!AB118

Z 列包含工作表的名称,例如。回家!

单元格 AD105 包含您将登陆的单元格,例如。 AB118

我已经编写了宏来一次更新一个单元格/行的超链接。

 'Update "Sheet 1" Link
    Range("AB118").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    Range("Z118") & Range("AD105")

'Update "Sheet 2" Link
    Range("AB119").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    Range("Z119") & Range("AD105")

'Update "Sheet 3" Link
    Range("AB120").Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
    Range("Z120") & Range("AD105")

有没有办法使用“For Each”或类似的方法来缩短这个宏,它通过每一行将 Z 列和单元格 AD105 组合成一个出现在 AB 列中的超链接。

希望这是有道理的,我对 excel 和 VBA 非常有经验,但对论坛来说是新手。

此信息表从第 118 行开始,到第 171 行结束,所以我不确定是否需要告诉它从特定行开始并在特定行结束。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以使用以下 Sub 循环浏览列“B”和“C”,直到其中一个为空。这将使用“B”和“C”中的值填充“A”列,直到没有更多的连续值。

    Private Sub NewLink()
        Dim i As Integer
        i = 1
        Do Until IsEmpty(Range("B" & i).Value) Or IsEmpty(Range("C" & i).Value)
            Range("A" & i).Select
            ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
            Range("B" & i) & Range("C" & i)
            i = i + 1
        Loop
    End Sub
    

    只需使用以下命令在您需要/希望它运行的任何地方调用此函数。

    Call NewLink
    

    按照 Dude_Scott 对 .Select 的建议,使用以下内容。

    Private Sub NewLink()
        Dim i As Integer
        i = 1
        Do Until IsEmpty(Range("B" & i).Value) Or IsEmpty(Range("C" & i).Value)
            ActiveSheet.Hyperlinks.Add Anchor:=Range("A" & i), Addreess:="", SubAddress:= _
            Range("B" & i) & Range("C" & i)
            i = i + 1
        Loop
    End Sub
    

    编辑:帮助读者根据自己的需要选择合适的解决方案。

    “Do While”循环的优点是您可以添加额外的连续行,而无需更新宏/子。

    缺点是“B”和“C”列本质上是为在“A”列中创建链接而保留的。

    【讨论】:

      【解决方案2】:

      如果未在单元格值中解决此问题,则执行超链接的代码可能会出错。您需要确保它的参考设置像工作表范围参考一样。

      SubAddress:= Range("Z118") & Range("AD105")
      

      应该是

      SubAddress:= "'" & Range("Z118") &"'!" & Range("AD105")
      

      但由于这是在您的单元格值中处理的,因此您可以从这里获得几个选项。但这里有一个您要求的 For 循环(有关 While 循环,请参见 TinMan464):

      Sub foo() 
      Dim i as integer 
      
        For i = 118 to 200 ‘change the last number to what you need 
           Range("AB"&i).Select
           ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= "'" & Range("Z"&i) &"'!" &  Range("AD105")
        Next i
      
      End sub
      

      但我会避免使用select

      Sub foo()
      Dim i as integer
      
        For i = 1 to 3 ‘change the last number to what you need 
            ActiveSheet.Hyperlinks.Add Anchor:= Range("AB"&i), Address:="", SubAddress:= "'" & Range("Z"&i) &"'!" &  Range("AD105")
        Next i
      
      End sub
      

      【讨论】:

      • 我能用更多的例子来回应吗?这个评论框没有太多的格式化能力。我什至不知道如何开始新的生产线!?
      • 感谢您最近的更新 - 我实际上在单元格中输入了额外的标点符号,以便子将其拉到链接中
      • 哦,好吧。我的更新对 Ranges 有帮助吗?需要我去掉多余的标点符号吗?
      • 哇,真快。做得好。那将很有帮助。不过,我对您的回答感到有些困惑,如何在潜艇中使用它?我需要事先“将 i 设为整数”吗?
      • 我添加了子名称和整数声明。显式声明变量是一种很好的做法,但除非在模块顶部有 Option Explicit,否则不需要。
      【解决方案3】:

      我们已经使用标准的For 循环获得了可接受的答案,但这里有一个使用For EachWithOffset 的版本供参考:

      Dim WorkingCell As Range
      
      For Each WorkingCell In ActiveSheet.Range("AB118:AB171").Cells
          With WorkingCell
              .Hyperlinks.Add Anchor:=.Cells(1,1), Address:="", _
                  SubAddress:=.Offset(0,-2).Value & ActiveSheet.Range("AD105").Value
          End With
      Next WorkingCell
      

      【讨论】:

      • 当我运行它时,我得到“运行时错误 450。参数数量错误或分配的属性无效。”
      • 我相信您在使用锚时遇到了错误。您正在尝试使用 WorkingCell 对象引用一个单元格。我认为要使它起作用,它应该阅读Anchor:= WorkingCell
      • @MattCann 对不起,我忘了Address 是一个强制参数,即使它没有被使用。我在代码中添加了Address:="",
      • @Dude_Scott 因为WorkingCell 是一个1 单元格范围,WorkingCellWorkingCell.Cells(1,1)WorkingCell.Range 都是等价的。因为这是在With 中,所以我们可以删除WorkingCell(我使用.Cells(1,1) 因为认为Anchor:=.Range 对于试图从示例中学习的初学者来说可能不太清楚)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2020-10-20
      • 2017-02-04
      • 1970-01-01
      • 2016-08-23
      • 2011-10-14
      相关资源
      最近更新 更多