如何创建超链接数组(Excel VBA)?

Qqq*_*qqq 4 excel vba

是否可以在数组中创建超链接列表,以便数组元素都是超链接?

我正在研究一个更有效的宏来创建超链接索引。我将所有工作表名称都放在一个数组中,但希望在将其打印到“索引”选项卡上之前将数组元素转换为超链接。

到目前为止,我已经尝试了以下操作(这只是我尝试将数组元素转换为超链接的代码部分)...

尝试1:

For Each xElement In xArr
    xElement = FormulaR1C1 = "=Hyperlink(""xWB.Sheets(xElement)!A1"", xWB.Sheets(xElement).Name)"
Next xElement
Run Code Online (Sandbox Code Playgroud)

尝试 1 的结果:宏运行时没有错误,但结果列表没有超链接。我的索引与我完全忽略此代码一样。

尝试2:

For Each xElement In xArr
    xElement = .Hyperlinks.Add _
        anchor:="", _     'Compile error: Expected: end of statement
        Address:="", _
        SubAddress:="'" & xWB.Sheets(xelement).Name & "'!A1", _
        TextToDisplay:=xWB.Sheets(xelement).Name
Next xElement
Run Code Online (Sandbox Code Playgroud)

尝试 2 的结果:“anchor”突出显示为导致错误。错误消息是“编译错误:预期:语句结束”

可以做我正在尝试的事情吗?

Dav*_*ens 6

您的第一次尝试有一些问题。

  1. FormulaR1C1似乎不合格,因此它要么是拼写错误,要么是空变体
  2. xElement = FormulaR1C1 = ...分配一个布尔值(第二次比较的结果:FormulaR1C1 = ...xElement
  3. 最后,要就地修改数组,您不能For Each,您必须使用索引赋值,否则xElement会在不修改的情况下更改xArray

 

Dim a as Long
For a = LBound(xArray) to UBound(xArray)`
    xArray(a) = "something..."
Next
Run Code Online (Sandbox Code Playgroud)

您的第二次尝试失败,因为Anchor参数不能是空字符串。根据 dox,它必须是一个 shape 或 range 对象

可以做我正在尝试的事情吗?

严格来说,不。您不能“在将数组元素打印到我的“索引”选项卡上之前将其转换为超链接”,因为没有Hyperlink向您公开的个体的构造函数(即,您不能简单地创建或实例化它Hyperlink自己,它可以只能通过Hyperlinks.Add需要参数的方法创建Anchor)。

因此,解决方案是.Hyperlinks.Add在数组迭代期间使用该方法简单地创建它们,例如:

Dim wsIndex as Worksheet
Set wsIndex = Worksheets("Index")
Dim x as Long
With wsIndex
    For x = LBound(xArr) To UBound(xArr)
        .Hyperlinks.Add _
            wsIndex.Cells(x + 1, 1), _
            xArr(x).Name & "!A1", _
            TextToDisplay:=xArr(x).Name
    Next
End With
Run Code Online (Sandbox Code Playgroud)

更新

可以将超链接存储在数组或集合中,但必须先创建它们。你可以这样做:

ReDim links(LBound(xArr) to UBound(xArr))
Dim h as Hyperlink
Dim wsIndex as Worksheet
Set wsIndex = Worksheets("Index")
Dim x as Long
With wsIndex
    For x = LBound(xArr) To UBound(xArr)
        Set h = .Hyperlinks.Add _
            wsIndex.Cells(x + 1, 1), _
            xArr(x).Name & "!A1", _
            TextToDisplay:=xArr(x).Name
        ' Store the link in an array for later use, if needed
        Set links(x) = h
    Next
End With
Run Code Online (Sandbox Code Playgroud)