Как создать массив гиперссылок (Excel VBA)? - PullRequest
1 голос
/ 10 июня 2019

Можно ли создать список гиперссылок в массиве, чтобы все элементы массива были гиперссылками?

Я работаю над более эффективным макросом для создания индекса с гиперссылками.У меня есть все имена рабочих таблиц в массиве, но я хотел бы преобразовать элементы массива в гиперссылки, прежде чем печатать его на вкладке «Индекс».

До сих пор я пробовал следующее (это только часть кодагде я пытался превратить элементы массива в гиперссылки) ...

Попытка 1:

For Each xElement In xArr
    xElement = FormulaR1C1 = "=Hyperlink(""xWB.Sheets(xElement)!A1"", xWB.Sheets(xElement).Name)"
Next xElement

Результат для Попытка 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

Результат для Попытки 2: «якорь» выделен как вызывающий ошибку.Сообщение об ошибке «Ошибка компиляции: ожидается: конец оператора»

Можно ли сделать то, что я пытаюсь сделать?

1 Ответ

2 голосов
/ 10 июня 2019

Ваша первая попытка имеет несколько проблем.

  1. FormulaR1C1 не представляется квалифицированным, поэтому это либо опечатка, либо пустой вариант
  2. xElement = FormulaR1C1 = ... присваивает логическое значение (результат второго сравнения: FormulaR1C1 = ... to xElement
  3. И, наконец, чтобы изменить массив на месте, вы не можете For Each, вам нужно использовать индексированное присваивание, в противном случае xElement изменяется без изменения xArray!

Dim a as Long
For a = LBound(xArray) to UBound(xArray)`
    xArray(a) = "something..."
Next

Ваша вторая попытка не удалась, поскольку аргумент Anchor не может быть пустой строкой. Для dox, это должна быть форма или диапазонobject .

Возможно ли сделать то, что я пытаюсь сделать?

Строго, нет. Вы не можете "преобразовать элементы массива в гиперссылки раньшераспечатав его на моей вкладке «Индекс», потому что не существует конструктора для индивидуального 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

Обновление

Вы можете хранить гиперссылкив массиве или коллекции, но не до тех пор, пока они не будут созданы первыми.Вы можете сделать что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...