Добавление описания в TextBoxes в форме VBA Excel, которая исчезает, когда пользователь начинает вводить текст внутри - PullRequest
0 голосов
/ 18 января 2012

У нас есть пользовательская форма с несколькими текстовыми полями, и мы хотели бы создать что-то похожее на изображение ссылки ниже, чтобы показать, что пользователь должен вводить в каждое текстовое поле:

http://d2o0t5hpnwv4c1.cloudfront.net/426_formsBestPractices/comments.png

Текст «по умолчанию» исчезнет, ​​как только пользователь начнет печатать (в отличие от того, когда пользователь «поместит» курсор в текстовое поле.

Кроме того, если ничего не введено в текстовое поле, текст по умолчанию небудет предоставлен и будет использоваться пробел.

Можно ли это сделать?

Буду признателен за любые предложения.

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Могу ли я спросить, почему вы хотите, чтобы текст по умолчанию исчезал, когда пользователь изменяет текст, а не после того, как он вводит текстовое поле?

Это не то, чего ожидает большинство пользователей, я думаю, что это будет немного смущать некоторых и не рекомендую.Скорее всего, пользователь попытается удалить старый текст, прежде чем вводить новый текст, создавая дополнительную работу.

Я бы использовал что-то вроде этого:

Const sNameDefault As String = "Your Name Here"
Const sEmailDefault As String = "Your Email Here"

Private Sub UserForm_Initialize()
    Me.TextBox1.Text = sNameDefault
    Me.TextBox2.Text = sEmailDefault

    CommandButton1.SetFocus
End Sub

'// TextBox1 - Name
Private Sub TextBox1_Enter()
    With Me.TextBox1
        If .Text = sNameDefault Then .Text = vbNullString
    End With
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox1
        If .Text = vbNullString Then .Text = sNameDefault
    End With
End Sub

'// TextBox2 - Email
Private Sub TextBox2_Enter()
    With Me.TextBox2
        If .Text = sEmailDefault Then .Text = vbNullString
    End With
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox2
        If .Text = vbNullString Then .Text = sEmailDefault
    End With
End Sub

Private Sub CommandButton1_Click()
    Dim sName As String, sEmail As String

    '// Get Name
    If Me.TextBox1.Text = sNameDefault Then
        sName = vbNullString
    Else
        sName = Me.TextBox1.Text
    End If

    '//  Get Email
    If Me.TextBox2.Text = sEmailDefault Then
        sEmail = vbNullString
    Else
        sEmail = Me.TextBox2.Text
    End If

    MsgBox ("Your Name: " & sName & vbNewLine & " Your Email:" & sEmail)

    Unload Me
End Sub

Приведенный выше пример - просто пользовательская форма сдва текстовых поля и командная кнопка.Нажатие внутри текстового поля очистит текст по умолчанию.Если пользователь ничего не вводит, щелкнув другое текстовое поле или элемент управления, текст по умолчанию будет добавлен обратно.После нажатия кнопки команды код вернется пустым, если текст по умолчанию останется.

1 голос
/ 18 января 2012

Да, это возможно:)

Я создал образец для вас.Вы можете скачать его здесь.

http://wikisend.com/download/143478/Sample.xlsm

Хитрость заключается в том, чтобы создать 2 похожих текстовых поля и скрыть «оригинальный» за пустым текстовым блоком («который имеет текст по умолчанию»)вы начинаете печатать в манекене, текст на самом деле будет печататься в текстовом поле, которое скрыто.

А когда вы извлекаете значения, просто извлекайте значения из 2-го текстового поля, чтобы данные по умолчанию не рассматривались)

Надеюсь, это поможет.

Используемый код

Private Sub UserForm_Initialize()
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1.Text)
End Sub

Private Sub CommandButton1_Click()
    MsgBox TextBox2.Text
End Sub

Private Sub TextBox1_Change()
    TextBox1.Visible = False
    With TextBox2
        .Text = Replace(TextBox1.Text, "Please enter your name", "")
        .Visible = True
        .SetFocus
        .SelStart = Len(TextBox2.Text)
    End With
End Sub
...