vba - 在运行宏之前处理工作表更改事件

时间:2017-10-01 14:59:04

标签: excel vba excel-vba

假设Excel工作表包含两个vba Sub过程:

  • Sub1:工作表上的处理程序更改

    Private Sub Worksheet_Change(ByVal Target As range)
        'do something
    End Sub
    
  • Sub2:单击按钮时运行的Sub

当用户在编辑单元格时单击Sub2按钮时,两个Sub都按Sub2的顺序执行(因为他点击了按钮) - > Sub1(因为编辑操作已终止)。

如何撤销此订单?我想在运行与点击按钮相关联的Sub之前处理工作表更改。

两个Sub必须保持不相关。 IE浏览器。如果单击Sub2按钮并且没有进行单元格编辑,则只应执行Sub2。

2 个答案:

答案 0 :(得分:3)

我提出了这个解决方案:

Private Sub Worksheet_Change(ByVal Target As range)
    'handle worksheet changes here
End Sub
'Workaround to make sure other pending events (like worksheet changes) are handled first.
'It schedules handleButtonClick at the end of the event queue
Public Sub handleButtonClick ()
    Application.OnTime Now, "handleButtonClick_private"
End Sub

Private Sub handleButtonClick_private ()
    'handle button click here
End Sub

它的工作原理是将实际的处理程序推迟到事件队列的末尾。因此,将在执行实际处理程序之前处理可能的挂起工作表更改事件。

答案 1 :(得分:0)

这意味着Sub2Sub1的相关工作表中进行了更改,因此......

使用下面的方法:

Private Sub Worksheet_Change(ByVal Target As range)
    Application.EnableEvents = False 'Edited
    If ActiveSheet.Name = "SheetName" Then
        'do something
    End If
    Application.EnableEvents = True 'Edited
End Sub 'Worksheet_Change

<强>被修改

Sub Sub2
Application.EnableEvents = False
    'do something
Application.EnableEvents = True
End Sub 'Sub2

因此,Sub1过程仅在相关工作表已激活时运行,并且当Sub2过程正在运行时,另一个事件过程尚未激活。