如何在单元格更改时在 Excel 中运行 VBA 程序的基础知识

如何在单元格更改时在 Excel 中运行 VBA 程序的基础知识

我正在尝试在 Excel 中显示来自 SQL Server 的一些数据。因为我有一个查询涉及 3 个表并使用一个参数,所以我将不得不使用 VBA。

我不知道如何让 VBA“自动运行”。在 Excel 中执行常规查询会为您提供选项,例如在工作表打开时运行或自动刷新。由于我正在添加一个参数,因此我希望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

相关内容