Worksheet_SelectionChange触发非预期子过程运行问题咨询
问题解决:选中单个单元格时意外触发列范围的VBA事件
我编写了如下VBA代码:
' 当选中区域改变时触发 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 调用Sort_Customers_Countries和Go_First_Sheet子程序 If Not Intersect(Target, Me.Range("cel__Sheets_Formula")) Is Nothing Then Sort_Customers_Countries Go_First_Sheet End If ' 调用Center_Resize_Image子程序 If Not Intersect(Target, Me.Range("col__Customer_Country_Flag")) Is Nothing Then Center_Resize_Image End If End Sub
问题:选中cel__Sheets_Formula(单个命名单元格,位置为'Customers Countries'!$F$1)时,除了运行Sort_Customers_Countries和Go_First_Sheet,还会触发Center_Resize_Image执行。col__Customer_Country_Flag是表格tbl__Customers_Countries中的Customer Country Flag列,两个命名范围并无交集。
问题原因
核心问题是Go_First_Sheet执行时会切换工作表,此时Excel的选中目标会自动切换到新工作表的某个单元格,而这个单元格恰好落在col__Customer_Country_Flag的范围内,导致第二个If条件被意外触发。
解决办法
在执行工作表切换操作前,临时关闭Excel的事件触发机制,操作完成后再重新开启,避免切换时的选中变化触发新的Worksheet_SelectionChange事件。修改后的代码如下:
' 当选中区域改变时触发 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 调用Sort_Customers_Countries和Go_First_Sheet子程序 If Not Intersect(Target, Me.Range("cel__Sheets_Formula")) Is Nothing Then Sort_Customers_Countries ' 关闭事件触发 Application.EnableEvents = False Go_First_Sheet ' 重新开启事件触发 Application.EnableEvents = True End If ' 调用Center_Resize_Image子程序 If Not Intersect(Target, Me.Range("col__Customer_Country_Flag")) Is Nothing Then Center_Resize_Image End If End Sub
如果Go_First_Sheet本身没有切换工作表,而是在当前工作表内操作,那可以检查Sort_Customers_Countries是否有修改选中区域的代码,同样用Application.EnableEvents临时禁用事件即可避免连锁触发。
内容的提问来源于stack exchange,提问作者Jawad
相关产品推荐
相关产品推荐

