Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 2010中导致SheetSelectionChange事件的特殊单元格_Excel_Excel Addins_Vba - Fatal编程技术网

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
事件,因此您会收到该消息。我仍在寻找。我可以给你一个替代的代码,上面你不知道