VBA:当组合框中选定的值发生变化时如何触发事件

use*_*510 5 excel vba combobox onchange

我是 VBA 新手,希望在组合框(用户窗体内)中的选择发生更改时触发一个简单的更改事件。

我尝试了这两种Private Sub myCombo_AfterUpdate()方法,Private Sub myCombo_Change()但在这两种情况下,当我在组合框中选择不同的值时,都不会发生任何情况。

这是组合框的错误方法吗?

我的子程序如下启动,因为我想将下拉列表中当前选定的项目与表中的值进行比较:

Private Sub myCombo_AfterUpdate()
    If Me.myCombo.Value = Worksheets(8).Range("A4") Then
    'do stuff
End Sub
Run Code Online (Sandbox Code Playgroud)

非常感谢蒂姆对此提供的任何帮助。

Alb*_*ina 1

默认情况下,创建新工作表时,命名方式如下所示:Sheet1Sheet2Sheet3等。它们按创建顺序编号。

“函数”Worksheets(1)Worksheets(2)用于按索引获取工作表。该索引可以是工作表名称的任一数字:

使用 Worksheets (index),其中 index 是工作表索引号或名称,返回单个 Worksheet 对象。

它基本上意味着返回工作簿的Worksheets(i)当前第 - 个工作表(如果是整数)。ii

问题是工作表编号(例如 和 中的“1” Sheet1Worksheets(1)不一定相同。如果一张一张地创建工作表且顺序不变,则默认情况下它们是相同的。但是,数字不匹配的情况可能有多种。

因此,强烈建议按名称而不是按编号获取工作表,即:

Worksheets("Sheet1")
Run Code Online (Sandbox Code Playgroud)

并不是

Worksheets(1)
Run Code Online (Sandbox Code Playgroud)

此外,仍然可以选择将工作表引用为对象 ( Sheet1)。

PS 如何重现工作表索引不匹配的示例

  1. 在 MS Excel 中使用默认名称创建至少 2 个工作表。在我们的例子中。Sheet1并被Sheet2创建。
  2. Button在 上添加一个对象Sheet1
  3. Sheet2向左移动使其成为最左侧的页面(如屏幕截图所示)。
  4. Button向对象添加宏Sheet1,并向宏添加断点。另外,使用Add Watch...命令将变量添加到调试部分
    • Worksheets(1).CodeName
    • Worksheets(2).CodeName
  5. 如果您单击该Button对象并转到 VB 代码窗口,Watches您将在该窗口中看到
  • Worksheets(1).CodeName = "Sheet2"(最左边的表)
  • Worksheets(2).CodeName = "Sheet1"(第二张)

截屏