5

我正在使用 VBA 来更改 Excel,并在 Sheet1 中有以下简单的事件处理程序:

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox "HI"
End Sub

不过,这永远不会触发。我在即时窗口中测试过:

?Application.EnableEvents

最终返回 True,所以它应该触发。有谁知道为什么这根本不想开火?

4

3 回答 3

9

你有不止一张纸吗?请注意,工作表的 CodeName 属性和 Name 属性(Excel 中选项卡上的名称)并不总是相同的。例如,如果 Project Explorer 列出

Sheet2 (Sheet1)

然后 Sheet1 是名称,Sheet2 是代码名称。

查看是否将代码放入错误模块的最简单方法是右键单击工作表的选项卡并选择查看代码。这将显示该工作表的 CodePane,这就是您的代码所在的位置。

于 2012-07-25T18:08:58.423 回答
4

这个问题是很久以前发布的,但我最近遇到了同样的问题。如果还有其他 vba 新手正在为此苦苦挣扎,请尝试保存您的工作簿并重新打开它。在我这样做之后,我的工作表中的 Worksheet_Change Sub 按我的预期触发了。

也许有一个控件来编译我缺少的工作表子程序???

于 2016-02-03T16:32:13.973 回答
2

通常与Target. 这是一个示例,如果您突出显示 M4 并更改值,看看会发生什么:

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = "$M$4" Then
    MsgBox ("HI")
 End If
End Sub

这里是关于这个事件的一个很好的帖子

从那篇文章中调整代码,然后你可以做这样的事情

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Me.Range("$A$1:$V$100")) Is Nothing Then Exit Sub 
    If Target.Address = "$A$1" Then 
        MsgBox ("A1")
    ElseIf Target.Address = "$A$2" Then 
        MsgBox ("A2")
    End If 
End Sub 

好的 - 请参阅下面的评论 + 我刚刚测试过,您的代码应该可以正常工作。试试这个?这也行不通吗?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Cells) Then
        MsgBox ("A1")
    End If
End Sub
于 2012-07-25T17:54:34.537 回答