在单元格单击上运行一个宏,在单元格双击上运行另一个宏

时间:2018-09-25 19:45:49

标签: excel vba click double-click

我有一个数据库,其中的类别标题包含.Interior.Color和.Font格式,当单击类别标题单元格时,该格式标题将应用于选定的行。

我想添加以下功能:双击类别标题单元格,将隐藏文档中与该类别不匹配的所有行。

我在Sheet1(代码)中添加了以下内容:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, HideRow As 
Boolean)

If Not Application.Intersect(Target, Range("C1:W1")) Is Nothing Then
    LstRow = Cells.Find(What:="*", After:=Range("A1"), lookat:=xlPart, _
             LookIn:=xlFormulas, SearchOrder:=xlByRows, _ 
             SearchDirection:=xlPrevious, MatchCase:=False).Row   
    'Finds last row with data
    Set Dyn_AllEntries = ActiveSheet.Range("C5:C" & LstRow)  'range w/ all data
    If HiddenRows <> True Then  'Checks to see if the macro was already run
        For Each cl In Dyn_AllEntries
            If cl.Offset(0, 11) <> Target Then  'check if category matches
                cl.EntireRow.Hidden = True   'if not, hide row
            End If
        Next cl
        HiddenRows = True   'set boolean, to verify the macro is active
    ElseIf HiddenRows = True Then  'check if macro is active
        For Each cl In Dyn_AllEntries
            If cl.Offset(0, 11) <> Target And LCase(cl.Offset(0, -2)) <> _ 
            "true" Then  'if category not match & row not hidden by other macro
                cl.EntireRow.Hidden = False   'unhide row
            End If
        Next cl
        HiddenRows = False    'set boolean so I know macro isn't active
    End If
End If
End Sub

现在,当我选择一个单元格时为我编写的代码给了我编译错误:

  

过程声明与具有相同名称的事件或过程的描述不匹配。

我的“单击”代码命名为Private Sub Worksheet_SelectionChange(ByVal Target As Range, HideText As Boolean),而我的“双击”代码命名为Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, HideRow As Boolean)

两者均在Sheet1(代码)模块内。我的“单击”代码没有更改,因为它在添加“双击”代码之前可以正常工作。

是否可能针对不同的选择操作运行同一单元格的两个不同宏?

这是工作表的样子,如果有帮助的话:Sheet1

1 个答案:

答案 0 :(得分:5)

您不能随意更改事件处理程序签名-事件不是这样工作的。

工作表事件是在某些WorksheetEvents界面中定义的,方法签名是它们的本质,它们是一成不变的:事件源(即工作表)是提供参数值的方法-如何工作表是否知道为该HideRow参数提供什么值?不会,并且由于您所在的Worksheet模块是从Worksheet类继承其成员,因此如果您在工作表模块中命名过程Worksheet_BeforeDoubleClick,则因为VBA不会支持方法重载的唯一方法是使该过程具有与定义的过程完全相同的签名。

使事件处理程序签名与期望的签名匹配,然后代码将再次编译。

*几乎:参数名称并不重要-它们的类型和顺序确实如此。