Excel vba удалить подсказку, если ячейка пуста - PullRequest
0 голосов
/ 04 июля 2019

У меня есть vba, который, когда я щелкаю в ячейке (которая содержит «идентификаторы»), ищет этот «идентификатор» на другом листе и создает всплывающую подсказку с информацией из этого листа. Она работает следующим образом:

  • Если идентификатор существует, показывает подсказку, когда я щелкаю по нему. Скрывает всплывающую подсказку, если я нажму на пустую ячейку;
  • Если идентификатор не существует, он ничего не показывает;

Моя проблема остается в следующем шаге:

  • Если у меня есть идентификатор, который существует и удаляется из ячейки, всплывающая подсказка остается там, но без информации. Каждый раз, когда я нажимаю на эту ячейку, она показывает пустую подсказку. Мне нужно, чтобы это не показывало, что клетка пуста.

Мой код:

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

Какие-нибудь предложения о том, как этого добиться? Благодаря.

1 Ответ

1 голос
/ 04 июля 2019

У меня есть два варианта для вас:

  1. Обнаружение, что ячейка становится пустой ("") с помощью события Worksheet_change, и удаление проверки для удаления всплывающей подсказки
  2. Используйте ваше текущее событие Select, но введите блок IF, чтобы сказать «Если ячейка пуста, то удалите проверку, в противном случае создайте подсказку ...», чтобы гарантировать, что проверка (и, следовательно, ваша подсказка) будет удалена, когда вы нажмете на пустая ячейка

Я думаю, что лучшим вариантом, безусловно, является Вариант 1. Я включил Вариант 2 только для того, чтобы вы могли увидеть, как это можно сделать только с вашим текущим событием и как это логически следует вместо использования Worksheet_change для удаления всплывающей подсказки.

Вариант 1

Добавьте событие изменения рабочего листа, которое делает это:

Private Sub Worksheet_Change(ByVal Target As Range)

   If Target.value = "" Then
      Target.Validation.Delete
   End If

End Sub

Это сработает при удалении вашего идентификатора из ячейки; тогда ваше Target.Value будет равно "" и, следовательно, любая проверка будет также автоматически удалена; убирает подсказку.

Непреднамеренным следствием является то, что это удаляет все проверки; поэтому, если вы хотите сохранить некоторые другие проверки (например, тип данных, список), вам придется повторно добавить его в ячейку; Вы можете написать подпрограмму только для этого (например, sub putValidationBack (x_in как 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

То же, что и выше, это удалит все проверки, поэтому вам нужно будет вернуть все проверки, которые вы хотите сохранить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...