Текстовый текст подсказки в Excel VBA

Вы знаете, как иногда вы видите текст в поле ввода, запрашивающий ответ? Когда вы нажимаете на нее, она исчезает, но возвращается, если вы отменили выбор, не набрав ничего.

Как мне сделать это в текстовом поле Excel? Можно ли это сделать вообще?

Я думаю, что я мог бы сделать это, если бы я прикрепил макрос клика к текстовому полю, и макрос мог бы сказать, какое текстовое поле было щелкнуто, но проблема с макросом клика в том, что он не позволит вам сначала выбрать объект, поэтому Вы понятия не имеете, на что нажали. И я не хочу жестко кодировать имя текстового поля в коде макроса клика.

3 ответа

Решение

Я думаю, что вы имеете в виду "заполнитель" в пользовательской форме. Два трюка, которые я использую для достижения этой цели, - это свойство "tag" и события Enter и Exit. Во-первых, создайте свои подмодули, которые будут срабатывать при вводе (фокус) и выходе (размытие).

Sub TB_enter(TB_name)
    If Len(Me.Controls(TB_name).Tag) = 0 Then
        Me.Controls(TB_name).Tag = Me.Controls(TB_name).Value
        Me.Controls(TB_name).Value = vbNullString
    End If
End Sub
Sub TB_exit(TB_name)
    If Len(Me.Controls(TB_name).Value) = 0 Then
        Me.Controls(TB_name).Value = Me.Controls(TB_name).Tag
        Me.Controls(TB_name).Tag = vbNullString
    End If
End Sub

Затем для каждого экземпляра вашего текстового поля в пользовательской форме дважды щелкните текстовое поле в режиме просмотра объекта. Это автоматически создаст Private Sub для события изменения. Перейдите в верхний правый угол панели инструментов и измените раскрывающийся список "Изменить" на "Ввод". Это создаст новый Private Sub для события Enter. Повторите этот процесс еще раз, но выберите "Выход", чтобы создать событие "Выход". Теперь просто скопируйте следующий код в события Enter и Exit соответственно (я использовал имя по умолчанию для первого текстового поля, но это не зависит от имени при вызове событий).

Private Sub TextBox1_Enter()
    TB_enter ActiveControl.Name
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    TB_exit ActiveControl.Name
End Sub

Если вы размещаете эти вызовы во внешнем модуле, просто замените "Я" на имя пользовательской формы.

Вы могли бы сделать это с парой событий. Очистить поле на клике довольно просто:

Private Sub TextBox1_GotFocus()
    TextBox1.Text = ""
End Sub

Я бы добавил несколько других шагов, добавил событие worksheet_activate, чтобы установить начальное значение и установить флаг, если установлено значение по умолчанию:

Private Sub Worksheet_Activate()
    Dim textBox1Default As Boolean
    TextBox1.Text = "Please enter some text here"
    textBox1Default = True
End Sub

Затем я бы добавил событие TextBox1_Change, чтобы удалить флаг по умолчанию

Private Sub TextBox1_Change()
    If textBox1Default = True Then textBox1Default = False
End Sub

И, наконец, настройте исходное событие GotFocus, чтобы включить проверку флага:

Private Sub TextBox1_GotFocus()
    If textBox1Default Then TextBox1.Text = ""
End Sub

Вам нужно будет заставить его работать на вас, таким образом, если вы измените вкладки, он сбросит текст, но вы можете проверить его при активации и изменить его в соответствии с тем, когда вы хотите сбросить его.

Джесси

Я думаю, что подходящий термин для такого рода называется «Заполнитель». Вот простой способ, который я нашел на другом форуме. В свойстве формата текстового поля введите следующее:

      @;"Your ghost text to disappear"

Изображение ниже - это скриншот оригинального сообщения автора.

Другие вопросы по тегам