我有一个vba,当我单击一个单元格(包含“ 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
任何如何实现这一建议?谢谢。
答案 0 :(得分:1)
我为您提供两个选择:
我认为最好的绝对是选项1。我已经包括了选项2,以便您可以了解如何仅对当前事件进行处理,以及如何在逻辑上继续使用Worksheet_change进行工具提示删除。
选项1
添加执行此操作的工作表更改事件:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.value = "" Then
Target.Validation.Delete
End If
End Sub
这会在您从单元格中删除ID时触发;那么您的Target.Value将等于“”,因此所有验证也将自动删除;拿走工具提示。
意外的结果是,这删除了 all 验证;因此,如果要保留某些其他验证(如数据类型,列表),则必须将其重新添加到单元格中;您可以为此编写一个子例程(例如sub putValidationBack(x_in as Range)..)
选项2
在当前代码周围添加一个IF块:
if Range(sTarget).Value = "" then
With Range(sTarget).Validation
.Delete
End with
Else
' Everything after and including your On Error Resume goes here
End if
与上述相同的结果将删除所有验证,因此您需要放回要保留的所有验证。