【问题标题】:Run one macro on cell click and a different macro on cell double-click在单元格单击时运行一个宏,在单元格双击时运行另一个宏
【发布时间】:2019-03-01 12:29:56
【问题描述】:

我有一个包含类别标题的数据库,其中包含 .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(代码)模块中。我的“单击”代码没有改变,因为在我添加“双击”代码之前它就可以工作了。

难道不能对同一个单元格运行两个不同的宏来执行不同的选择操作吗?

如果有帮助,请查看工作表的外观:

【问题讨论】:

  • 那些事件不支持HideText As Boolean 参数和HideRow As Boolean 参数。在您提供的代码中,HideRow 根本没有使用,但HiddenRows 是相关的?
  • 两者都会抛出相同的编译错误。如果“单击”代码包含 HideText 参数,那么它之前就无法正常工作。
  • 将我的布尔尺寸标注移动到代码中(而不是子标题)并匹配“HiddenRows”的变量名称解决了我的问题。非常感谢你们!

标签: excel vba click double-click


【解决方案1】:

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

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

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

*几乎:参数 names 并不重要——它们的类型和顺序很重要。

【讨论】:

  • 具有讽刺意味的是,只要在事件名称(包括 HideRow)中添加任何布尔值,我就可以编译代码,但删除它们会导致代码无法编译。我目前在括号中声明了一个组成且未使用的布尔值,因此它将编译。 ::shrugs:: 另外,我找不到有关事件处理程序签名、事件签名的任何信息,甚至找不到有关从工作表类继承的成员的体面文章。你能推荐一个地方让我在这些事情上自我教育吗?谢谢!
  • 对象浏览器 (F2),以及代码窗格中的两个下拉菜单。
  • @Casey 代码可以编译,但请注意代码窗格顶部的下拉菜单:如果左侧显示“(general)”,则它不是事件处理程序 - 只是一个永远不会运行的程序;-)
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多