【问题标题】:Why wont the code below execute when a cell is double clicked on?为什么双击单元格时下面的代码不会执行?
【发布时间】:2017-11-02 20:03:22
【问题描述】:

下面的代码运行较早,但在双击单元格时不会执行。

Private Sub Worksheet_DoubleClick(ByVal Target As range, Cancel As Boolean)
    If Target.Font.Bold = False Then

            Target.Font.Bold = True
            Target.Font.Color = vbRed
    Else
            Target.Font.Bold = False
            Target.Font.Color = 1

    End If
End Sub

【问题讨论】:

  • 改用Worksheet_BeforeDoubleClick
  • 更新后的代码为:Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.range, Cancel As Boolean),但仍然没有触发。提前谢谢你。
  • 事件处理程序绑定到为其实现的工作表。确保您在正确工作表的代码隐藏中实现处理程序。顺便说一句,“下面的代码更早运行”是完全不可能的。该方法的签名与任何WorksheetEvents 接口都不匹配,因此它永远不会被调用。将光标放在If 语句上,然后按F9 进行断点。然后双击一个单元格。这样你就知道它是否被调用了。 FWIW 它在这里工作得很好。

标签: vba double-click


【解决方案1】:

不是对为什么它不起作用的答案(@Mat's Mug 和@Scott Craner 再次击败我),而是代码的缩短版本。

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

    With Target.Font
        .Bold = Not .Bold
        .Color = Choose(Abs(CLng(.Bold)) + 1, 1, vbRed)
    End With

End Sub

好的,不像原版那么容易理解,但它的作用如下:

Target.Font.Bold 是 TRUE 或 FALSE,所以 Not .Bold 将返回相反的结果。
粗体 = TRUE 所以非粗体 = FALSE

Abs(CLng(.Bold)) + 1
同样,.Bold 是 TRUE 或 FALSE。数值上 TRUE = -1,FALSE = 0。

CLNG(.Bold) 将返回 -1 或 0。
ABS(CLNG(.Bold)) 将返回 1 或 0。
Abs(CLng(.Bold)) + 1 将返回 1 或 2 - 在 CHOOSE 命令中用于返回 @987654329 @ 或1

【讨论】:

  • 感谢您的回复。我已经更新了代码,一切都很好。再次感谢。
【解决方案2】:

请勿手动输入任何这些签名!

改用代码窗格下拉菜单:

从左侧下拉列表中选择Worksheet,并在右侧下拉列表中选择要处理的事件; VBE 将为您生成一个带有正确签名的方法存根。

从头顶手动输入它们可以(并且确实!)导致处理程序最终永远不会被调用,或者更糟糕的是,被调用,但在错误的论点,例如如果 UserForm_QueryClose 是使用倒置参数手动输入的(处理程序有 2 个 Integer 参数,因此您需要记住确切的顺序.. 否则您分配 Cancel 并且表单理解您分配了 CloseMode

如果您在左侧下拉菜单中没有看到 Worksheet,那么您不在工作表的代码隐藏模块中。工作表事件只能在工作表模块中处理。

Workbook 模块(即ThisWorkbook)中,您可以处理SheetBeforeDoubleClick 事件以处理对工作簿中任何 工作表的双击:

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

End Sub

【讨论】:

  • Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.range, Cancel As Boolean) If Target.Font.ColorIndex 1 Then Target.Cells.Font.ColorIndex = 1 Target.Font.Bold = False Else Target.Cells.Font.Color = vbRed Target.Font.Bold = True End If Cancel = True End Sub
  • 我把这个 Sub 放在单独的工作表“Sheet 1”上。它没有按预期激活。我错过了什么?感谢您的反馈。
  • 确切的代码在这里有效。处理程序处理双击事件。您是否尝试在处理程序中设置断点 (F9)?
  • @t.mo 您的活动可能已关闭且未重新开启。
  • @ScottCraner gah,一定是它! Application.EnableEvents = True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多