Excel VBA中的文本框提示文本

Text box prompt text in Excel VBA

提问人:Wes 提问时间:12/15/2011 最后编辑:pnutsWes 更新时间:4/18/2021 访问量:24463

问:

您知道有时您会在输入字段中看到提示答案的文本吗?当您单击它时,它会消失,但如果您取消选择而没有键入任何内容,它就会恢复。

如何在 Excel 文本框中完成此操作?这能做到吗?

我想如果我将单击宏附加到文本框并且宏可以分辨单击了哪个文本框,并且该宏可以分辨出单击了什么文本框,那么我可以完成此操作,但是单击宏的问题在于它不会让您先选择对象,因此您不知道单击了什么。而且我不想在单击宏代码中对文本框名称进行硬编码。

Excel VBA 文本框

评论

1赞 Jean-François Corbett 12/15/2011
@Wes:“我不想在单击宏代码中对文本框名称进行硬编码。为什么不呢?我就是这样做的。鉴于 Excel 似乎没有机制来返回对调用指定宏的对象的引用(这很糟糕),这可能是唯一的方法。
2赞 Tim Williams 12/16/2011
@JFC - Application.Caller 呢?这将返回触发宏的对象的名称。

答:

0赞 Jesse 12/16/2011 #1

你可以通过几个事件来做到这一点。要清除单击的框非常简单:

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

您需要让它为您工作,这样,如果您更改选项卡,它将重置文本,但您可以让它在激活时检查并更改它以适合您希望重置时。

耶西

评论

0赞 Wes 4/20/2012
您的解决方案要求在代码中引用文本框,但我没有那么奢侈,因为这些文本框是由用户复制的,并且无法获得对复制的文本框的显式引用。例如,假设复制的文本框自动标记为“文本框 2”,但您的事件仅适用于文本框 1。
0赞 Jesse 4/21/2012
您可以遍历活动工作表上的所有文本框,速度很快,但您必须对所有文本框使用相同的文本。
0赞 Wes 5/2/2012
是否有可以捕获单击任何文本框的事件?然后,当这种情况发生时,是否提供对单击的文本框的引用?
4赞 Michael 1/19/2012 #2

我认为您指的是用户窗体中的“占位符”。我用来实现此目的的两个技巧是“tag”属性以及 EnterExit 事件。首先,创建将在 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

接下来,对于用户窗体上文本框的每个实例,在“查看对象”模式下双击该文本框。这将自动为更改事件创建一个私有子。前往工具栏的右上角,将“更改”下拉列表更改为“Enter”。这将为 Enter 事件创建一个新的 Private Sub。再次重复此过程,但选择“退出”以创建退出事件。现在,只需将以下代码分别复制到 EnterExit 事件中(我使用了第一个文本框的默认名称,但在调用事件时,这与名称无关)。

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

如果要在外部模块中进行这些调用,只需将“Me”替换为用户窗体的名称即可。

评论

0赞 Wes 4/20/2012
我没有使用用户表单,但没关系,这只是我并不真正需要的好东西。
0赞 Michael 4/25/2012
您究竟如何使用此 Excel 工作表?是否将 ActiveX 控件用于文本框?用户是否可以将这些文本框复制并粘贴到 Excel 工作表中的任何位置?您可能只想考虑对单元格进行条件格式设置,并在单元格中放置带有输入消息的数据验证。用户可以将其复制并粘贴到他们喜欢的内容中。
0赞 taezar.tw 4/18/2021 #3

我认为这种术语的正确术语称为“占位符”。这是我在另一个论坛中找到的简单方法。 在文本框的 format 属性中,键入以下内容:

@;"Your ghost text to disappear"

下图是原作者帖子的截图。screenshot of original author's post