Vba 双击单元格时,为什么下面的代码不执行?
下面的代码运行较早,但在双击单元格时不会执行Vba 双击单元格时,为什么下面的代码不执行?,vba,double-click,Vba,Double Click,下面的代码运行较早,但在双击单元格时不会执行 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 =
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
不要手动键入这些签名中的任何一个 请改用“代码”窗格下拉列表: 从左侧下拉列表中选择
工作表
,然后在右侧下拉列表中选择要处理的事件;VBE将为您生成具有正确签名的方法存根
手动键入它们可能(而且确实!)导致处理程序永远不会被调用,或者更糟的是,被调用,但在错误的参数中给定了参数值,例如,如果UserForm\u QueryClose
是使用反向参数手动键入的(处理程序有2个整数
参数,因此您需要记住确切的顺序。。否则,您将分配取消
,表单将理解您分配了关闭模式
)
如果您在左侧下拉列表中没有看到工作表
,则您不在工作表的代码隐藏模块中。工作表事件只能在工作表模块中处理
在工作簿
模块(即此工作簿
)中,您可以在双击前处理工作表
事件,以处理双击工作簿中的任何工作表:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
End Sub
不要手动键入这些签名中的任何一个 请改用“代码”窗格下拉列表: 从左侧下拉列表中选择
工作表
,并在右侧下拉列表中选择要处理的事件;VBE将为您生成具有正确签名的方法存根
手动键入它们可能(而且确实!)导致处理程序永远不会被调用,或者更糟的是,被调用,但在错误的参数中给定了参数值,例如,如果UserForm\u QueryClose
是使用反向参数手动键入的(处理程序有2个整数
参数,因此您需要记住确切的顺序。。否则,您将分配取消
,表单将理解您分配了关闭模式
)
如果您在左侧下拉列表中没有看到工作表
,则您不在工作表的代码隐藏模块中。工作表事件只能在工作表模块中处理
在工作簿
模块(即此工作簿
)中,您可以在双击前处理工作表
事件,以处理双击工作簿中的任何工作表:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
End Sub
这不是对为什么它不起作用的答案(@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
将返回相反的结果。粗体=真,因此不粗体=假
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-这在选择命令中用于返回vbRed
或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
将返回相反的结果。
粗体=真,因此不粗体=假
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-这在选择
命令中用于返回vbRed
或1在双击之前使用工作表。更新后的代码为:在双击之前使用私有子工作表(ByVal目标为Excel.range,Cancel为Boolean),但它仍然没有触发。请提前感谢。事件处理程序绑定到它的实现工作表。请确保在正确的工作表代码中实现该处理程序。顺便说一句,“下面的代码运行得更早”是完全不可能的。该方法的签名与任何工作表事件
界面都不匹配,因此它不可能被调用。将光标放在If
语句上,然后按F9键创建断点。然后双击单元格。这样您就可以知道它是否被调用。FWIW它在这里工作得非常好。请在双击之前使用工作表改为单击
。更新后的代码为:双击之前的私有子工作表(ByVal目标为Excel.range,Cancel为Boolean),但它仍然没有触发。请提前感谢。事件处理程序绑定到其实现的工作表。请确保在正确的工作表代码中实现该处理程序。顺便说一句,“下面的代码运行得更早”是完全不可能的。该方法的签名与任何工作表事件
界面都不匹配,因此它不可能被调用。将光标放在If
语句上,按F9键创建断点。然后双击一个单元格。这样您就可以知道它是否被调用。FWIW它在这里工作得非常好。Private Sub_BeforeDoub工作表leClick(ByVal目标为Excel.range,Cancel为布尔值)如果Target.Font.ColorIndex为1,则Target.Cells.Font.ColorIndex=1 Target.Font.Bold=False,否则Target.Cells.Font.Color=vbRed Target.Font.Bold=True End如果Cancel=True End,则将此子项放置在