Excel 2010中导致SheetSelectionChange事件的特殊单元格
我有一个测试宏Excel 2010中导致SheetSelectionChange事件的特殊单元格,excel,excel-addins,vba,Excel,Excel Addins,Vba,我有一个测试宏 Sub test() Dim rSrcMatrix As Range Set rSrcMatrix = Sheets("Code Matrix").Range("Xfer_To_Xfer_Matrix").Range("A1") Set rSrcMatrix = rSrcMatrix.Resize(rSrcMatrix.SpecialCells(xlCellTypeLastCell).Row, rSrcMatrix.SpecialCells(xlCellT
Sub test()
Dim rSrcMatrix As Range
Set rSrcMatrix = Sheets("Code Matrix").Range("Xfer_To_Xfer_Matrix").Range("A1")
Set rSrcMatrix = rSrcMatrix.Resize(rSrcMatrix.SpecialCells(xlCellTypeLastCell).Row, rSrcMatrix.SpecialCells(xlCellTypeLastCell).Column)
End Sub
我正在使用此宏测试我在VS2010中创建的COM插件。我已将加载项中的Sheet SelectionChange
事件委托给某个函数
现在我注意到,每当我运行此宏时,Excel都会触发SheetSelectionChange
事件4次,我的加载项会多次调用关联的方法
是否有我遗漏的东西或这是excel中的错误?我相信,我可能是错的,因为我找不到MSDN文章来证明这一点,但SpecialCells执行一种类型的选择,并触发
工作表\u SelectionChange
或工作簿\u SheetSelectionChange
事件,因此您需要关闭事件
下面是一个简单的测试方法
将此代码放置在图纸代码区域
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "Damn! The SpecialCells caused me to pop up!!!"
End Sub
Sub test()
Debug.Print ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
End Sub
工作表\u选择更改
和工作簿\u工作表选择更改
执行相同的工作<代码>工作表\选择在工作表中使用更改,代码用于特定工作表。当您希望在工作簿中的所有工作表上触发事件时,将使用Workbook\u sheet selectionChange
您在评论中的问题:如果我们想将另一个事件与该行代码关联,该怎么办。在这种情况下,我们无法抑制该事件
现在,我们有两种选择。根据您的上述问题,我们不能使用备选方案
。因此,您可以直接跳到备选方案2
备选方案1
关闭事件
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
'
'~~> YOUR CODE
'
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
备选方案2
与使用SpecialCells
查找最后一行或最后一列不同,我们将使用.find
Sub test()
Dim ws As Worksheet
Dim rSrcMatrix As Range
Dim Lrow As Long, LCol As Long
Set ws = ThisWorkbook.Sheets("Code Matrix")
With ws
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
Lrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
LCol = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
Else
Lrow = 1
End If
Set rSrcMatrix = .Range("Xfer_To_Xfer_Matrix").Range("A1")
Set rSrcMatrix = rSrcMatrix.Resize(Lrow, LCol)
Debug.Print rSrcMatrix.Address
End With
End Sub
子测试()
将ws设置为工作表
Dim RSRCA矩阵作为范围
变暗Lrow尽可能长,LCol尽可能长
Set ws=ThisWorkbook.Sheets(“代码矩阵”)
与ws
如果Application.WorksheetFunction.CountA(.Cells)为0,则
Lrow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
LCol=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
SearchOrder:=xlByColumns_
搜索方向:=xlPrevious_
MatchCase:=False)。列
其他的
Lrow=1
如果结束
设置rSrcMatrix=.Range(“Xfer\u到Xfer\u矩阵”).Range(“A1”)
设置rSrcMatrix=rSrcMatrix.Resize(Lrow,LCol)
调试.打印rSrcMatrix.地址
以
端接头
我相信,我可能是错的,因为我找不到MSDN文章来证明这一点,但SpecialCells执行一种类型的选择并触发工作表\u SelectionChange
或工作簿\u SheetSelectionChange
事件,因此您需要关闭事件
下面是一个简单的测试方法
将此代码放置在图纸代码区域
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "Damn! The SpecialCells caused me to pop up!!!"
End Sub
Sub test()
Debug.Print ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
End Sub
工作表\u选择更改
和工作簿\u工作表选择更改
执行相同的工作<代码>工作表\选择在工作表中使用更改,代码用于特定工作表。当您希望在工作簿中的所有工作表上触发事件时,将使用Workbook\u sheet selectionChange
您在评论中的问题:如果我们想将另一个事件与该行代码关联,该怎么办。在这种情况下,我们无法抑制该事件
现在,我们有两种选择。根据您的上述问题,我们不能使用备选方案
。因此,您可以直接跳到备选方案2
备选方案1
关闭事件
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
'
'~~> YOUR CODE
'
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
备选方案2
与使用SpecialCells
查找最后一行或最后一列不同,我们将使用.find
Sub test()
Dim ws As Worksheet
Dim rSrcMatrix As Range
Dim Lrow As Long, LCol As Long
Set ws = ThisWorkbook.Sheets("Code Matrix")
With ws
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
Lrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
LCol = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
Else
Lrow = 1
End If
Set rSrcMatrix = .Range("Xfer_To_Xfer_Matrix").Range("A1")
Set rSrcMatrix = rSrcMatrix.Resize(Lrow, LCol)
Debug.Print rSrcMatrix.Address
End With
End Sub
子测试()
将ws设置为工作表
Dim RSRCA矩阵作为范围
变暗Lrow尽可能长,LCol尽可能长
Set ws=ThisWorkbook.Sheets(“代码矩阵”)
与ws
如果Application.WorksheetFunction.CountA(.Cells)为0,则
Lrow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
LCol=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
SearchOrder:=xlByColumns_
搜索方向:=xlPrevious_
MatchCase:=False)。列
其他的
Lrow=1
如果结束
设置rSrcMatrix=.Range(“Xfer\u到Xfer\u矩阵”).Range(“A1”)
设置rSrcMatrix=rSrcMatrix.Resize(Lrow,LCol)
调试.打印rSrcMatrix.地址
以
端接头
您是否已关闭活动?刚刚回答了这个问题。。。谢谢。它似乎起作用了!!。但我们只是使用此解决方案暂时禁用事件。我仍然不明白为什么“特殊细胞”会引发这个事件。如果我们想将另一个事件与该行代码关联,该怎么办。在这种情况下,我们无法抑制该事件。我相信我可能是错的,因为我找不到MSDN文章来证明这一点,但SpecialCells执行一种类型的选择并触发工作表\u SelectionChange
事件,因此您会收到该消息。我仍在寻找。我可以给你一个替代的代码,上面你不知道