
Я пытаюсь показать некоторые данные из моего SQL Server в Excel. Поскольку у меня есть запрос, который обращается к 3 таблицам и использует параметр, мне придется использовать VBA.
Я не уверен, как заставить VBA "запускаться автоматически". Выполнение обычного запроса в Excel дает вам такие варианты, как запуск при открытии листа или автоматическое обновление. Поскольку я добавляю параметр, я хотел бы, чтобы my Sub
запускался при изменении значения ячейки, в которой находится параметр.
Есть идеи?
решение1
Щелкните правой кнопкой мыши по вкладке листа и выберите «Просмотреть код». Поместите такой код в модуль листа
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then 'only run if the correct cell is changed
MySub 'this is the name of your vba procedure
End If
End Sub
Эта подпрограмма будет запускаться всякий раз, когда ячейка на этом листе изменяется. Если измененная ячейка — A1 (изменение в соответствии с вашими данными), то будет запущена процедура в стандартном модуле с именем MySub (изменение в соответствии с вашими данными).
Я не уверен, почему вам нужно использовать VBA. Кажется, вы можете написать SQL, чтобы вытащить данные из любого количества таблиц, и включить параметр.
решение2
Помещать:
application.volatile
в вашем коде.
решение3
Для ясности скажу, что параметр находится в ЯЧЕЙКЕ A1, а результат кода VBA указан в ЯЧЕЙКЕ A2.
В VBAмодуль
Function Test1(strText as string) as string
Test1 = strText & "15"
End Function
В ячейку A2 поместите уравнение "=Test1(A1)
В ячейку A1 поместите параметр, который вы хотите изменить.
Я бы проверил, работает ли он, а затем вставил бы другой код VBA, чтобы он запускался при каждом изменении A1.
решение4
Ответ dkusleika выглядит лучше всего; все становится немного сложнее, если вы хотите сделать то же самое для диапазона. Следующий код будет выполняться всякий раз, когда ячейка в указанной области изменяется.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim woArea As Range, isect As Range
Set woArea = Sheet1.Range("A1:A500")
Set isect = Application.Intersect(Target, woArea)
If isect Is Nothing Then
' Nothing happens
Else
' Stuff you want to happen goes here
End If
End Sub