Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA代码,用于在单元格包含特定字母时自动添加注释_Excel_Vba_Comments - Fatal编程技术网

Excel VBA代码,用于在单元格包含特定字母时自动添加注释

Excel VBA代码,用于在单元格包含特定字母时自动添加注释,excel,vba,comments,Excel,Vba,Comments,上周我刚开始学习VBA,现在我正在尝试解决以下问题:如果用户键入某个字母(并且只键入这些指定的字母),则应将注释自动添加到选定的单元格中。注释应该包含一个小的“标题”,然后是一个解释性文本,由用户输入。 所显示的代码实际上是有效的,但只适用于我测试它的第一个单元。因此,当我第一次执行它时,注释会自动出现在我想要的指定文本中,但在下一个单元格中没有。即使重新启动Excel也没有帮助,所以现在即使是第一个单元格也不会创建注释。这就是为什么我感到困惑 Private Sub Worksheet_Cha

上周我刚开始学习VBA,现在我正在尝试解决以下问题:如果用户键入某个字母(并且只键入这些指定的字母),则应将注释自动添加到选定的单元格中。注释应该包含一个小的“标题”,然后是一个解释性文本,由用户输入。 所显示的代码实际上是有效的,但只适用于我测试它的第一个单元。因此,当我第一次执行它时,注释会自动出现在我想要的指定文本中,但在下一个单元格中没有。即使重新启动Excel也没有帮助,所以现在即使是第一个单元格也不会创建注释。这就是为什么我感到困惑

Private Sub Worksheet_Change(ByVal Target As Range)

Dim x

Application.EnableEvents = False

If Target.Value = "" Then

    Application.Undo
    x = Target.Value
    Target.Value = ""
    On Error Resume Next

    If (x = "A") Or (x = "B") Or (x = "C") Or (x = "D") Or (x = "E") Then Target.Comment.Delete
    On Error GoTo 0   

ElseIf Target.Value = "A" Then
    Target.AddComment ("explanationA: ")

ElseIf Target.Value = "B" Then
    Target.AddComment "explanationB: "

ElseIf Target.Value = "C" Then
    Target.AddComment "explanationC: "

ElseIf Target.Value = "D" Then
    Target.AddComment "explanationD: "

ElseIf Target.Value = "E" Then
    Target.AddComment "explanationE: "

End If
End Sub
我已指定“工作表”和“更改”

还有一个我感兴趣的问题:excel是否有可能在生成注释后自动选择注释,以便用户可以键入一些解释性信息,而无需手动选择注释


谢谢你的帮助!提前非常感谢

下面是一些简单快捷的东西

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Select Case Target.Cells
    Case Is = "A": Target.AddComment ("explanationA: ")
    Case Is = "B": Target.AddComment ("explanationB: ")
    Case Is = "C": Target.AddComment ("explanationC: ")
    Case Is = "D": Target.AddComment ("explanationD: ")
    Case Is = "E": Target.AddComment ("explanationE: ")
End Select
On Error Resume Next
End Sub

只需记住将代码放在您希望它发生的工作表上,它看起来也区分大小写。

您可以在模块的声明部分(顶部)使用
选项比较文本
,以允许对整个模块进行不区分大小写的比较

虽然子程序“MyCompare”中的代码相同,但结果不同:

Sub MyCompare

    Debug.print "a" = "A"
    ' Prints False

End Sub


但不管怎样,让我们谈谈你的实际问题。代码中有这一行:

Application.EnableEvents = False
请注意,代码第一次工作的原因是您捕获了
工作表\u Change
事件。但是现在您只是禁用了此代码中的事件,并且从未重新打开它,因此您将无法再运行
工作表\u Change
子例程

在退出代码之前,请确保将其重新打开。此外,明智的做法是以启用事件的方式处理错误,而不是过早地停止代码,这将使它们处于禁用状态


我通常在不运行Sub的情况下启用事件的方式是使用debug窗口。在VBE中按Ctrl+G打开此窗口,然后在窗口中键入
Application.EnableEvents=True
并按Return,即可更改该属性。

使用InStr(1,UCase(Target.Value),“A”)>0而不是Target.Value=“A”等,以便查找字符串是否包含“A”而不是说它完全等于a。此外,这将检查是否输入了“A”或“A”。谢谢,但我只希望代码检查单元格中的字母“A”/“A”。因此,如果单元格包含例如“Ab”,则注释不应出现。只需将Target.Cells修改为UCase(Target.Value),并且不再区分大小写。是的,这将启用小写,如果您想要“A”或“A”,则只需将大小写更改为:case“A”,“A”:Target.AddComment(“explanationA:”)谢谢!您的答案对于编写更全面的代码非常有帮助!谢谢你的解释!这是我的错误。
Application.EnableEvents = False