Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 - Fatal编程技术网

Excel vba删除单元格为空时的工具提示

Excel vba删除单元格为空时的工具提示,excel,vba,Excel,Vba,我有一个vba,当我点击一个包含“ID”的单元格时,它会在另一个工作表中搜索该“ID”,并用该工作表中的信息创建一个工具提示。它的工作原理如下: 如果ID存在,单击时显示工具提示。如果在空单元格中单击,则隐藏工具提示 如果ID不存在,则不显示任何内容 我的问题仍然存在于以下步骤中: 如果我有一个存在的ID并将其从单元格中删除,工具提示将保留在那里,但没有信息。每次单击该单元格时,它都会显示空的工具提示。我需要它不要显示任何类似于该单元格为空的内容 我的代码: Public sTarget

我有一个vba,当我点击一个包含“ID”的单元格时,它会在另一个工作表中搜索该“ID”,并用该工作表中的信息创建一个工具提示。它的工作原理如下:

  • 如果ID存在,单击时显示工具提示。如果在空单元格中单击,则隐藏工具提示
  • 如果ID不存在,则不显示任何内容
我的问题仍然存在于以下步骤中:

  • 如果我有一个存在的ID并将其从单元格中删除,工具提示将保留在那里,但没有信息。每次单击该单元格时,它都会显示空的工具提示。我需要它不要显示任何类似于该单元格为空的内容
我的代码:

Public sTarget As String

Private Sub Worksheet_Change(ByVal Target As Range)

sTarget = Target.Address

Dim MyVal As String
Dim MyToolTipBody As String
Dim MyToolTipHead As String
Dim Rng As String

On Error Resume Next
MyVal = "*" & Range(sTarget).Value
With Worksheets("Sheet2")
On Error Resume Next
    Rng = .Cells.Find(What:=MyVal, LookIn:=xlFormulas, LookAt:=xlWhole).Address
    MyToolTipHead = 'Code for tooltip header
    MyToolTipBody = 'Code for tooltip body
End With

With Range(sTarget).Validation
    .Delete
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
    :=xlBetween
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = MyToolTipHead
    .ErrorTitle = ""
    .InputMessage = MyToolTipBody
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = False
End With
End Sub

关于如何实现这一点,有什么建议吗?谢谢。

我有两个选择供您选择:

  • 使用工作表更改事件检测单元格变为空(“”),并删除验证以删除工具提示
  • 使用当前的Select事件,但引入IF块,说明“如果单元格为空,则删除验证,否则创建工具提示…”,以确保在单击空白单元格时删除验证(因此也删除了工具提示)
  • 我认为最好的是选项1。我加入了选项2,这样你就可以看到如何使用当前事件来完成,以及如何在逻辑上使用工作表更改来删除工具提示

    选项1

    添加可执行此操作的工作表更改事件:

    Private子工作表\u更改(ByVal目标作为范围)
    如果Target.value=”“,则
    Target.Validation.Delete
    如果结束
    端接头
    
    当您从单元格中删除ID时,将触发此操作;然后您的Target.Value将等于“”,因此任何验证也将自动删除;并删除工具提示

    意外的结果是,这将删除所有验证;因此,如果您希望保留某些其他验证(如数据类型、列表),则必须将其重新添加到单元格中;您可以为此编写一个子例程(例如sub-putValidationBack(x_在as范围内)…)

    选项2

    在当前代码周围添加IF块:

    如果范围(sTarget).Value=”“那么
    带范围(sTarget)。验证
    .删除
    以
    其他的
    “一切都在这里,包括你的错误简历
    如果结束
    

    与上面相同的结果这将删除所有验证,因此您需要将任何要保留的验证放回原位。

    与其跳过错误(无论如何都不是好的做法),不如检查是否找到了值(不是什么都没有),如果找到了,只显示提示。也许您应该使用SelectionChange。但是如果我尝试使用“如果不是MyVal,则”我一直收到“类型不匹配”错误。@SJR您能详细说明SelectionChange的用法吗?您说您有“我在单元格中单击”时可以使用的代码吗“但这就是SelectionChange所做的。您使用的是仅在更改单元格时激活的更改。这就是您想要的吗?重新查找时,您需要为查找操作分配一个范围对象,并检查这是否为空(您实际上似乎没有使用
    Rng
    ).我只是用rng在单元格中搜索。我以后不会用它,因为它只用于搜索。