Могу ли я использовать гиперссылку для запуска макроса vba в Excel?

У меня есть электронная таблица, в которой много строк данных. Я хотел бы иметь возможность щелкнуть ячейку, которая будет запускать макрос, используя данные из этой строки. Поскольку количество строк всегда будет меняться, я думаю, что гиперссылка для каждой строки может быть лучшим способом.

   ROW MeterID   Lat    Long   ReadX  ReadY  ReadZ   CoeffA  CoeffB  CoeffC
   2   10f62gs   34.1   33.3   102.2  231.3  382.2   4.34    22.1    0.002
   3   83gs72g   34.4   31.4   109.2  213.1  372.1   2.23    12.7    0.023
   4   43gS128   33.3   32.2   118.8  138.7  241.8   1.94    5.08    0.107

Есть ли способ запустить макрос vba, щелкнув гиперссылку и узнав строку ячейки, которая щелкнула гиперссылку?


person Jason    schedule 25.02.2015    source источник


Ответы (5)


Это сработает для вас

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
        MsgBox "Row " & ActiveCell.Row & " is clicked"
End Sub
person Jeanno    schedule 25.02.2015

Да, вы можете, для этого выполните следующие простые шаги:

  1. Выберите ячейку, в которой вы хотите сделать гиперссылку
  2. Щелкните правой кнопкой мыши - ›Гиперссылка…
  3. Введите адрес той же ячейки, в которой вы делаете гиперссылку, и дайте имя ссылке. См. Картинку ниже:

Назначить макрос гиперссылке

  1. Щелкните ОК.
  2. Гиперссылка создана.

Примечание. Щелчок по этой гиперссылке ничего не сделает, потому что она назначена тому же адресу ячейки.

  1. Теперь нажмите Alt + F11
  2. Скопируйте и вставьте приведенный ниже код

Запустите макрос Excel, щелкнув гиперссылку

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)  
    'Check if the Target Address is same as you have given  
    'In the above example i have taken A4 Cell, so I am  
    'Comparing this with $A$4  
  
    If Target.Range.Address = "$A$4" Then  
        'Write your all VBA Code, which you want to execute  
        'Or Call the function or Macro which you have  
        'written or recorded.  
        MsgBox "Write your Code here to be executed"  
        Exit Sub  
    End If  
End Sub  

В приведенном выше коде мы сравниваем адрес ячейки, а затем выполняем набор кода или функции. Есть и другой способ сделать это. Мы можем сравнить с целевым именем и выполнить код. В приведенном выше примере я дал имя цели гиперссылки как MyMacro.

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)  
    'Check if the Target Name is same as you have given  
    'In the above example i have given the Name of the HyperLink  
    'is MyMacro.  
  
    If Target.Name = "mymacro" Then  
        'Write your all VBA Code, which you want to execute  
        'Or Call the function or Macro which you have  
        'written or recorded.  
        MsgBox "Write your Code here to be executed"  
        Exit Sub  
    End If  
End Sub  
person M M    schedule 25.02.2015

Следующий подход (формула гиперссылки) - более интересный способ запуска макроса с помощью гиперссылки. Не нужно никаких событий:

  1. Напишите формулу гиперссылки в ячейку. Это можно сделать и в VBA:
    Sub testCreateHyperlinkFunction()
       'Very important to have # in front of the function name!
       Range("A1:A5").Formula = "=HYPERLINK(""#MyFunctionkClick()"", ""Run a function..."")"
    End Sub

Более эффектным будет следующий подход, способный сохранить начальное значение ячеек обрабатываемого диапазона (в примере A1: A5):

Sub testCreateHyperlinkFunctionBis()
  Dim rng As Range, arr As Variant, c As Range, i As Long
   Set rng = Range("A1:A5")
   arr = rng.Value
   For i = 1 To UBound(arr, 1)
     Range("A" & i).Formula = "=HYPERLINK(""#MyFunctionkClick()"", " & _
            IIf(IsNumeric(arr(i, 1)), arr(i, 1), """" & arr(i, 1) & """") & ")"
   Next i
End Sub
  1. Создайте функцию для вызова (в модуле):
    Function MyFunctionkClick()
      Set MyFunctionkClick = Selection 'Do not miss this part!
      MsgBox "The clicked cell addres is " & Selection.row
    End Function
  1. Щелчком по ячейке запускается функция MyFunctionkClick() ...
person FaneDuru    schedule 24.06.2020
comment
Интересный материал, я не знал, что функции могут быть вызваны с помощью этого #Function() в синтаксисе гиперссылки! Хотя я только что попробовал очень простое его применение, и функция вызывается дважды, а затем я получаю сообщение о том, что ссылка недействительна - странно, я исследую - person jamheadart; 26.06.2020
comment
@ jamheadart: Ни я, пока не обнаружил (не помню, где и когда ...). У меня в коллекции есть такие фрагменты кода или интересный материал. Никто не знает всего ... На мой взгляд, важно научиться и уметь ценить то, что действительно интересно и может быть полезно :) Что касается вашей проблемы, это ошибка в вашей функции. Его слабость в том, что он не позволяет выполнять пошаговую отладку. Если ошибка существует, она не вызывает ошибки. Он ведет себя таким образом. Работает дважды и выдает сообщение semi elocvent. Код не останавливается при ошибке! Очень осторожно при кодировании - person FaneDuru; 26.06.2020
comment
Определенно невозможно узнать все, но это то, что делает его интересным, если бы мы знали все это, нам было бы скучно !! Что касается моей проблемы, я пробовал буквально =HYPERLINK("#MyUdf()","Click me") в ячейке, а затем в Module1 была функция Public Function MyUDF(): MsgBox "wow": End Function - person jamheadart; 26.06.2020
comment
@ jamheadart: Вы упустили суть функции ... :) Set MyUDF = Selection - person FaneDuru; 26.06.2020
comment
Лол, да, я даже не осознавал, что там была эта строчка или что она делала. Теперь работает нормально, это круто. Спасибо! - person jamheadart; 26.06.2020
comment
@ jamheadart: Может быть, было бы неплохо отредактировать свой ответ и подчеркнуть это ... Я думал, что это будет понятно самому себе. Сделал это... - person FaneDuru; 26.06.2020
comment
Да, я не понимал, что этот бит был полностью необходим, я думал, что вы просто используете это как пример того, как использовать свойства Selection, я думал, что он просто вызовет функцию, и простой MsgBox будет вызываться нормально. - person jamheadart; 26.06.2020
comment
@ jamheadart: Функция должна каким-то образом знать, к какой ячейке относится код. Исходя из этого, функцию можно заставить по-разному возвращать ... Она также возвращается, но таким странным образом, если функция не знает своего корня. - person FaneDuru; 26.06.2020
comment
@FaneDuru - это отличная реализация для моего распределенного программного обеспечения (я хочу избегать использования кода, специфичного для листа). Я написал небольшую функцию-оболочку, с помощью которой можно запускать любую подпрограмму из: Function runFromHyperlink(procName): Set runFromHyperlink = selection: application.Run procName: End Function. Тогда формула гиперссылки будет выглядеть так: =HYPERLINK("#runFromHyperlink(""myUdf"")","Click me"), используя пример @jamheadart. Это полезно, поскольку вам не нужна функция-оболочка для каждого подпрограммы с Set MyUDF = Selection. - person Malan Kriel; 06.01.2021
comment
И MyUDF тогда может быть любым Sub или Function без синтаксиса Set MyUDF = Selection. Я мог бы даже передать некоторые аргументы в процедуру, например: =HYPERLINK("#runFromHyperlink(""foo(5)"")","Run procedure 'foo' with argument of 5") или =HYPERLINK("#runFromHyperlink(""foo(True)"")","Run procedure 'foo' with argument True"). Однако я не мог заставить его работать для строковых аргументов. - person Malan Kriel; 06.01.2021

Я просто хотел бы добавить еще один подход, основанный на одном из ответов здесь, который я использовал в прошлом. Это означает, что вам не нужно создавать гиперссылки или вспомогательный столбец, чтобы начать обработку строки, вы можете просто дважды щелкнуть любую ячейку в строке, которую хотите обработать:

На листе, на котором вы хотите выполнить двойной щелчок, используйте это:

Private Sub Worksheet_Activate()
Application.OnDoubleClick = "Module1.ProcessRow"
End Sub

Private Sub Worksheet_Deactivate()
Application.OnDoubleClick = ""
End Sub

А затем в Module1 есть процедура, которая будет обрабатывать активную ячейку:

Sub processRow()
MsgBox "Row " & ActiveCell.Row & " on " & ActiveSheet.Name & " was clicked"
End Sub

Вам также следует отключить метод двойного щелчка в Excel в событиях книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnDoubleClick = ""
End Sub

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

person jamheadart    schedule 24.06.2020

Я думаю, что вместо того, чтобы создавать гиперссылку для каждой ячейки, лучше создать макрос, который ссылается на свойство Activecell. Затем создайте сочетание клавиш для запуска макроса. Для этого:

  1. Нажмите ALT + F8
  2. Выберите Options
  3. Выберите клавишу, которая будет сочетанием клавиш

Если у вас уже есть гиперссылки, лучше всего запустить макрос с помощью события Hyperlink_Follow. Если нет, то учтите мою рекомендацию.

person basodre    schedule 25.02.2015