excel - 为什么 MS Excel 在 Worksheet_Change Sub 过程中崩溃并关闭?

标签 excel vba

当我在 Excel 工作表上运行 VBA 代码时,我遇到了 Excel 崩溃的问题。
我正在尝试在工作表更改中添加以下公式:

Private Sub Worksheet_Change(ByVal Target As Range)
   Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1"
End Sub

运行此代码时,我收到一条消息,显示“excel 遇到问题,需要关闭”,然后 excel 关闭。

enter image description here

如果我在 Worksheet_Activate() 过程中运行代码,它可以正常工作并且不会崩溃

Private Sub Worksheet_Activate()
   Worksheets("testpage").Range("A1:A8").Formula = "=B1+C1"
End Sub

但我确实需要它在 Worksheet_Change() 过程中工作。

有人在使用 Worksheet_Change() 事件时遇到过类似的崩溃吗?有人能指出解决此问题的正确方向吗?

最佳答案

我在使用Worksheet_Change时建议这样做

  1. 您不需要工作表名称。在工作表代码模块中,不合格的范围引用引用该工作表。也就是说,使用 Me 限定符会更清楚。如果您尝试使用另一张工作表,请使用该工作表限定范围引用。

  2. 每当您使用 Worksheet_Change 事件时,如果要将数据写入任何单元格,请务必切换 Off 事件。这是必需的,以便代码不会重新触发 Change 事件,并进入可能的无限循环

  3. 每当您关闭事件时,请使用错误处理将其重新打开,否则如果出现错误,代码下次将不会运行。

试试这个

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa
    
    Application.EnableEvents = False
    
    Me.Range("A1:A8").Formula = "=B1+C1"
    
Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub

在处理此事件时您可能还想了解一些其他信息。

如果您想确保在更改多个单元格时代码不会运行,请添加一个小检查

Private Sub Worksheet_Change(ByVal Target As Range)
    '~~> For Excel 2003
    If Target.Cells.Count > 1 Then Exit Sub
    
    '
    '~~> Rest of code
    '
End Sub

CountLarge 是在 Excel 2007 及以后版本中引入的,因为 Target.Cells.Count 返回一个 Long 值,该值在 Excel 2007 中可能会出错,因为总细胞计数增加。

Private Sub Worksheet_Change(ByVal Target As Range)
    '~~> For Excel 2007
    If Target.Cells.CountLarge > 1 Then Exit Sub
    '
    '~~> Rest of code
    '
End Sub

要处理所有已更改的单元格,请使用此代码

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim aCell As Range
    
    For Each aCell In Target.Cells
        With aCell
            '~~> Do Something
        End With
    Next
End Sub

要检测特定单元格中的变化,请使用Intersect。例如,如果单元格 A1 中发生更改,则将触发以下代码

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
        MsgBox "Cell A1 was changed"
        '~~> Your code here
    End If
End Sub

要检测特定范围内的变化,请再次使用Intersect。例如,如果 A1:A10 范围内发生更改,则将触发以下代码

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A1:A10")) Is Nothing Then
        MsgBox "one or more Cells in A1:A10 range was changed"
        '~~> Your code here
    End If
End Sub

注意:如果您之前收到错误并且进行了上述更改,并且您的代码仍然无法正常工作,则可能是事件尚未重置。在立即窗口中,键入Application.EnableEvents = True,然后按ENTER键。这会将其重置为True。如果您没有看到立即窗口,请按快捷键Ctl+G启动立即窗口 .

enter image description here

关于excel - 为什么 MS Excel 在 Worksheet_Change Sub 过程中崩溃并关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13860894/

相关文章:

excel - 如何在 Excel 2016 VBA 中读取已用或可用内存量

vba - 用户窗体在 "End Sub"之后关闭,而无需调用 "Unload Me"

excel - 如何在EXCEL VBA中获取行数

excel - 制作输入框,以便用户可以输入他/她的名字并在每个消息框中使用

vba - Excel VBA,转换数据导致Excel崩溃

vba - 使用 VBA 更改所有数据透视表上的过滤器

excel - 以编程方式插入动态生成标签的点击事件代码不起作用

excel - 在Excel中使用VBA在IE中Google搜索并返回第一个结果的超链接

vba - 根据单元格中的单词隐藏Excel中的行

xml - 使用命名空间属性和 SelectSingleNode 属性的 XPATH