【问题标题】:Make units visible when mousing into textbox or combobox将鼠标移入文本框或组合框时使单位可见
【发布时间】:2019-02-03 09:04:12
【问题描述】:

我有一个需要输入各种文本框和组合框的用户表单。输入用于测量并具有与之关联的单位。当您单击每个特定的文本/组合框时,我希望用户窗体显示预期使用哪些单位。

目前,我的代码适用于文本框,但无法识别组合框。这是我的代码。

Private Sub TextboxActions_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If InStr(1, TextboxActions.Name, "OD") > 0 Then
    UserForm1.inUnit.Visible = True
    UserForm1.mmUnit.Visible = False
    UserForm1.eaUnit.Visible = False

ElseIf InStr(1, TextboxActions.Name, "CE") > 0 Then
    UserForm1.inUnit.Visible = False
    UserForm1.mmUnit.Visible = True
    UserForm1.eaUnit.Visible = False

Else
    UserForm1.inUnit.Visible = False
    UserForm1.mmUnit.Visible = False
    UserForm1.eaUnit.Visible = True
End If
End Sub

使用它,当用户单击文本框时,它将显示单位 in、mm 或 ea。我希望组合框也是如此,但目前单击组合框时没有任何反应。

【问题讨论】:

  • 什么是inUnit、mmUnit、eaUnit?它们是文本框旁边的标签吗?如果是这样,为什么不使用一个名为 Units 的标签,而只需更改标题?
  • 正确--inUnit、mmUnit 和 eaUnit 是标签的名称。标签只出现在用户窗体底部的一个位置,而不是每个文本框的旁边。

标签: excel vba combobox textbox userform


【解决方案1】:

使用 3 个 Enter() 事件对我有用:

Private Sub ComboBox1_Enter()

UserForm1.Label1.Visible = True
UserForm1.Label2.Visible = False
UserForm1.Label3.Visible = False

End Sub
Private Sub ComboBox2_Enter()

UserForm1.Label1.Visible = False
UserForm1.Label2.Visible = True
UserForm1.Label3.Visible = False

End Sub
Private Sub ComboBox3_Enter()

UserForm1.Label1.Visible = False
UserForm1.Label2.Visible = False
UserForm1.Label3.Visible = True

End Sub

在 ComboBoxes 中单击的示例(在顶部用户窗体 ComboBox1 处于活动状态,在第二个用户窗体 ComboBox3 处于活动状态等)

【讨论】:

  • 使用此方法是否需要为每个组合/文本框创建一个新子项?我的用户表单有大约 50 个盒子。我正在尝试创建一个函数来显示 EA、IN 或 mm(用户窗体中的文本对象),具体取决于框的名称中是否包含“CE”或“OD”。希望澄清
  • 明天让我编辑我的答案 - 这稍微改变了情况。您可能需要一个Userform 级别事件。
  • 在查看了一些选项之后,我认为您最好为每个组合框设置一个 enter 事件......其他解决方法看起来太复杂了。抱歉,我帮不上什么忙了。
【解决方案2】:

首先,我会使用Enter 事件而不是Mouse up 事件,因此当您使用 Tab 键进入控件时也会发生同样的事情。对于每个控件的Enter 事件,只需调用此 ShowUnit 函数并为其提供控件名称。

Private Sub CE2_Enter()
    Call ShowUnit(CE2)
End Sub

Private Sub OD1_Enter()
    Call ShowUnit(OD1)
End Sub

Private Sub ShowUnit(ByRef oControl As Control)
    If InStr(1, oControl.Name, "OD") > 0 Then
        UserForm1.inUnit.Visible = True
        UserForm1.mmUnit.Visible = False
        UserForm1.eaUnit.Visible = False

    ElseIf InStr(1, oControl.Name, "CE") > 0 Then
        UserForm1.inUnit.Visible = False
        UserForm1.mmUnit.Visible = True
        UserForm1.eaUnit.Visible = False

    Else
        UserForm1.inUnit.Visible = False
        UserForm1.mmUnit.Visible = False
        UserForm1.eaUnit.Visible = True
    End If
End Sub

编辑:更改了控件的名称以说明如何使用代码并从我的测试值返回 instr() 函数中的“OD”和“CE”。

如需进一步说明,请参见下图以了解发生了什么。蓝色是您如何使用 GUI 来确保您正在引用控件事件。红色表示我们将完整的控制权传递给 ShowUnit 函数。 Purple 显示我们正在读取 Controls Name 属性以搜索“OD”或“CE”注意,这些是区分大小写的,不使用 instr(1, UCASE(oControl.Name), "OD") > 0,因此如果您的控件名称是 odSomeName,它不会生成 inUnit 标签可见。

【讨论】:

  • 这个对我不起作用。我将“文本”改回“OD”,“组合”改回“CE”,并尝试单击文本框和组合框,但现在都没有显示单位。我想知道是否需要重命名一些对象才能完成这项工作?
  • 您是否使用 ComboBox1 和 TextBox1 作为框的名称?在我制作的用户表单中,大约有 50 种不同的文本和组合框。我正在尝试创建一个通用函数,该函数将显示 EA、IN 或 mm,具体取决于框的名称中是否包含“CE”或“OD”。希望澄清
  • @DaveFriesen 我已经更新了我的答案以进一步澄清。以及将我的测试值从 Textbox1 & ComboBox1 更改为 OD1 和 CE2
  • 感谢您的澄清。如果我理解正确,这是否意味着我的用户表单中的每个组合/文本框都需要一个新的子项,并在子项的主题中包含该框的名称?
  • 是的,没错。您需要将每个控件Enter 事件定向到ShowUnit 过程。我不相信有一种方法可以覆盖 VBA 中所有控件的输入事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
相关资源
最近更新 更多