Создать гиперссылку, используя информацию из двух столбцов

Используя Excel 2010, в каждой строке я хотел бы создать гиперссылку в столбце G.

Этот столбец уже содержит информацию, которая будет использоваться в качестве отображаемого текста (или понятного имени) гиперссылки.

Чтобы гиперссылка указывала на правильное место, ей нужно число, которое содержит столбец M. Совпадающая информация всегда находится в одной и той же строке.

Таким образом, это может быть просто слияние двух битов информации в двух ячейках определенной строки.

Вот с чего я начал:

    Sub Macro2()
'
' Macro2 Macro
'
Dim Name As String
Dim Branch As String

' Combination of two rows
Dim CombineRow As Range

Dim cell As Range
Dim row As Range
Dim Branch_ID As Range

Set Branch_ID = Worksheets("Default").Range("M2")

Set CombineRow = Range("G2:M2")

For Each row In CombineRow.Rows
     For Each cell In row.Cells
        Branch = Branch_ID.Cells.Value
        Name = Name_ID.Cells.Value
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
            "https://www.example.com/", SubAddress:= _
            "something:", _
            TextToDisplay:=Name
        Next cell
        ' relative one row down
        Set Branch_ID = Branch_ID.Offset(1, 0)
        Set Name_ID = Branch_ID.Offset(1, 0)
    Next row
End Sub

Чего я не знаю, так это как прикрепить значение столбца M (например, 600021610) к концу гиперссылки?

Я на правильном пути здесь?

РЕДАКТИРОВАТЬ:

То, что у меня есть сейчас, это:

Sub Macro2()
'
' Macro2 Macro
'
Dim Branch As String
Dim Name As String

' combine two rows
Dim CombineRow As Range

Dim cell As Range
Dim row As Range
Dim Branch_ID As Range
Dim Name_ID As Range

Set Branch_ID = Worksheets("Default").Range("M2")
Set Name_ID = Worksheets("Default").Range("G2")

Set CombineRow = Range("G2:M2")

For Each row In CombineRow.Rows
    For Each cell In row.Cells
        Branch = Branch_ID.Cells.Value
        Name = Name_ID.Cells.Value
        ActiveSheet.Hyperlinks.Add Anchor:=Name_ID, Address:= _
            "https://www.example.com/", SubAddress:= _
            "something" & Branch, _
            TextToDisplay:=Name
        Next cell
        Set Branch_ID = Branch_ID.Offset(1, 0)
        Set Name_ID = Name_ID.Offset(1, 0)
    Next row
End Sub

Это работает, но только для первой строки. Почему не делает петли? Действительно ли CombineRow правильно, или это должно быть так: G:G;M:M или что-то подобное?

Я также мог представить себе использование цикла Do ... While, потому что вставка end_tag не будет проблемой.


person hnk24211    schedule 15.08.2012    source источник
comment
Ой, так быстро ответили! Большое спасибо за это уже, я собираюсь попробовать это немедленно.   -  person hnk24211    schedule 15.08.2012


Ответы (3)


Попробуйте сделать аргумент для hyperlinks.add использовать переменную.

dim addressStr as string
dim targetRng as Range

For Each row In CombineRow.Rows
     For Each cell In row.Cells
        Branch = Branch_ID.Cells.Value
        Name = Name_ID.Cells.Value

        set targetRng = range("A1")   'change this to whatever you want it to be each loop
        addressStr = "https://www.example.com/" & cells(cell.row,15).value

        ActiveSheet.Hyperlinks.Add Anchor:=targetRng , Address:= _
            addressStr, SubAddress:= _
            "something:", _
            TextToDisplay:=Name
        Next cell
        ' relative one row down
        Set Branch_ID = Branch_ID.Offset(1, 0)
        Set Name_ID = Branch_ID.Offset(1, 0)
    Next row<BR>
End Sub<BR>

Кроме того, вы устанавливаете Name_ID и Branch_ID в одно и то же значение в своих смещениях.


В вашем цикле вы будете проходить только через 1 строку (потому что весь ваш диапазон находится в строке 2). Таким образом, ваш единственный цикл - это ячейки - вы никогда не устанавливаете идентификаторы веток/имен по-разному, потому что они появляются после вашего цикла:

For Each cell In row.Cells
    'stuff
Next cell

Set Branch_ID = Branch_ID.Offset(1, 0)
Set Name_ID = Name_ID.Offset(1, 0)

Таким образом, каждый раз, когда вы вызываете функцию гиперссылки, вы используете один и тот же диапазон Name_ID. Вы также можете сделать это смещение (0,1), потому что смещение равно смещению (строка, столбец), и кажется, что вы выполняете итерацию по горизонтальному диапазону.

person enderland    schedule 15.08.2012
comment
Привет, я установил следующие диапазоны: Установить Branch_ID = Рабочие листы (по умолчанию). Диапазон (M2) Установить Name_ID = Рабочие листы (по умолчанию). Диапазон (G2) и с помощью .Offset (1,0) я хочу двигаться вниз с каждым циклом. Когда я устанавливаю targetRng = range(A1), он всегда остается в этом месте или мне нужно выполнить смещение и для этого? - person hnk24211; 15.08.2012
comment
Он всегда будет оставаться как A1, пока вы не установите для него что-то другое. В приведенном выше коде проверьте последовательность следующей ячейки Set Branch_ID = Branch_ID.Offset(1, 0) Set Name_ID = Name_ID.Offset(1, 0)` - вы выполняете итерацию без обновления идентификаторов филиалов/имен (поскольку для каждого цикл ячеек заканчивается до того, как ветвь/имя КОГДА-ЛИБО будут сброшены) - person enderland; 15.08.2012
comment
Ну, это работает сейчас в пути. Я помещаю Offsets(1,0) (потому что я думаю, что это Offset(row,column)) в цикл. Но теперь он проходит только через первые 7 строк. Любые идеи? - person hnk24211; 16.08.2012
comment
При изменении смещения на смещение (0,1) создаются гиперссылки только в той же строке. Но любопытно то, что он также создает 7 гиперссылок справа. Я понятия не имею, почему... - person hnk24211; 16.08.2012
comment
Посмотрите на диапазон, который вы повторяете (G2: M2). В этом диапазоне всего 7 ячеек. - person enderland; 16.08.2012
comment
Ах, хорошо, G2:M2 — это семь, я вижу. Тогда я не выразил то, что хотел: я хотел, чтобы он создавал гиперссылки в G, беря данные из G и M, начиная со строки 2. Как мне это выразить? - person hnk24211; 16.08.2012

Вы можете просто использовать оператор & для объединения строк и создания URL-адреса.

addressStr = "https://www.example.com/" & <<Specify Cell for M Column and Row>>
person Bharat Sinha    schedule 15.08.2012
comment
По сути, это правильно, но почему бы не сделать дополнительный шаг и не указать код, который заполняет пробел между <<...>>? - person Gaffi; 15.08.2012
comment
Именно, потому что это одна из моих проблем. Я настоящий новичок в vba ... поэтому я не знаю, что возможно, а что нет. Ну, в основном я узнаю то, что невозможно, потому что Excel подсказывает мне на каждом углу :) - person hnk24211; 15.08.2012

Это работает!
Спасибо всем за помощь.
Решением было не ставить (G2:M2), потому что это приводит только к созданию семи гиперссылок.
Вместо этого просто ставьте (G:M) и и IF вокруг него, чтобы предотвратить создание бессмысленных гиперссылок, когда ячейки уже пусты.

    Sub Macro2()
'
' Macro2 Macro
'
Dim Branch As String
Dim Name As String

' combine two rows
Dim CombineRow As Range

Dim cell As Range
Dim row As Range
Dim Branch_ID As Range
Dim Name_ID As Range

Set Branch_ID = Worksheets("Default").Range("M2")
Set Name_ID = Worksheets("Default").Range("G2")

Set CombineRow = Range("G:M")

For Each row In CombineRow.Rows
For Each cell In row.Cells

    Branch = Branch_ID.Cells.Value
    Name = Name_ID.Cells.Value

    If Name <> "" Then

        ActiveSheet.Hyperlinks.Add Anchor:=Name_ID, Address:= _
            "https://www.example.com", SubAddress:= _
            "something" & Branch, _
            TextToDisplay:=Name

    Set Branch_ID = Branch_ID.Offset(1, 0)
    Set Name_ID = Name_ID.Offset(1, 0)

    End If

    Next cell

    Next row

End Sub

Я МЕРТВ уверен, что есть много возможностей для улучшения, особенно в конструкции IF.
Но пока это работает. Это не означает, что кто-то должен сдерживать свои комментарии по улучшению этого ;). Это были мои первые шаги в VBA! :)

person hnk24211    schedule 16.08.2012
comment
Вам понадобится условие побега, иначе оно будет повторяться вечно, пока не достигнет конца рабочей книги. Или измените свой диапазон на что-то вроде G2: M999 или что-то другое. - person enderland; 16.08.2012