1

我有一个测试宏

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插件。我已将SheetSelectionChange插件中的事件委托给某些功能。

现在我注意到,每当我运行这个宏时,Excel 都会触发该SheetSelectionChange事件 4 次,并且我的插件会多次调用关联的方法。

有什么我遗漏的或者这是excel中的错误吗?

4

1 回答 1

1

我相信我可能是错的,因为我找不到 MSDN 文章来证明这一点,但 SpecialCells 执行一种选择并触发Worksheet_SelectionChangeorWorkbook_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

Worksheet_SelectionChangeWorkbook_SheetSelectionChange做同样的工作。Worksheet_SelectionChange在工作表代码中使用的是特定工作表。并且Workbook_SheetSelectionChange当您希望事件在该工作簿中的所有工作表中触发时使用。

您的评论问题:如果我们想将另一个事件与该行代码相关联怎么办。在这种情况下,我们无法抑制该事件。

现在,我们有两种选择。根据您的上述问题,我们不能使用Alternative One. 所以你可以直接跳到Alternative 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
于 2013-10-29T17:05:09.743 回答