Excel-使用VBA更改用户表单文本框和组合框的背景色

Excel-使用VBA更改用户表单文本框和组合框的背景色,vba,excel,combobox,textbox,Vba,Excel,Combobox,Textbox,我刚刚学习VBA,并使用了一本旧书Excel2010中的一些代码。可能是Excel 2016进行了一些更改,使此代码不再工作 我没有得到类或子类的编译错误。行为是什么也没发生。应该发生的是,组合框或文本框的背景色应该改变颜色,就像处于焦点或离开焦点一样 正如我所说的,由于某种原因,当我运行代码时,什么都没有发生。没有出现错误或警告,因此代码好像正在运行,然后什么也不做 这是我的密码。评论应该说清楚。我希望有人能向我解释这是怎么回事,以及为什么当我在用户表单中进行制表时,当焦点改变时,这段代码不会

我刚刚学习VBA,并使用了一本旧书Excel2010中的一些代码。可能是Excel 2016进行了一些更改,使此代码不再工作

我没有得到类或子类的编译错误。行为是什么也没发生。应该发生的是,组合框或文本框的背景色应该改变颜色,就像处于焦点或离开焦点一样

正如我所说的,由于某种原因,当我运行代码时,什么都没有发生。没有出现错误或警告,因此代码好像正在运行,然后什么也不做

这是我的密码。评论应该说清楚。我希望有人能向我解释这是怎么回事,以及为什么当我在用户表单中进行制表时,当焦点改变时,这段代码不会导致颜色改变

第一段代码是一个名为clsCtlColor的独立类模块

Public Event GetFocus()
Public Event LostFucus(ByVal strCtrl As String)
Private strPreCtr As String


'Base Class for chaging Backcolor of ComBoxes and TextBoxes when focus is changed.
Public Sub CheckActiveCtrl(objForm As MSForms.UserForm)

With objForm
    If TypeName(.ActiveControl) = "ComboBox" Or _
        TypeName(.ActiveControl) = "TextBox" Then
        strPreCtr = .ActiveControl.Name
        'On Error GoTo Terminate
        Do
            DoEvents
            If .ActiveControl.Name <> strPreCtr Then
                    If TypeName(.ActiveControl) = "ComboBox" Or _
                    TypeName(.ActiveControl) = "TextBox" Then
                    RaiseEvent LostFucus(strPreCtr)
                    strPreCtr = .ActiveControl.Name
                    RaiseEvent GetFocus
                End If
            End If
        Loop
    End If
End With

Terminate:
    Exit Sub

End Sub
在类模块中,是一个On Error语句,在发生错误时终止子模块。然而,我把它注释掉了,仍然没有看到编译错误。因此,我只能断定这是一个运行时问题

任何帮助都将不胜感激

更新:

如果我在文本框中使用这两个sub,我会得到我想要的效果:

Private Sub TextBox1_Enter()
TextBox1.BackColor = RGB(153, 255, 51)
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.BackColor = RGB(255, 255, 255)
End Sub
我讨厌的是,我的用户表单有100多个文本框,我需要为每个文本框编写这两个sub,就像200个++sub

我仍在努力获得上述更普遍的工作方法。 我注意到的一件事是,如果我将上面两个sub中的RGB值更改为十六进制值,它们将不再工作。我尝试用更通用的RGB方法更改十六进制颜色值,但没有任何区别

还有一个更新:

有人指出我在LostFucus课上有一个打字错误。我在两个地方改成了LostFocus。但是,代码仍然不起作用。然后问题是我的代码是否在userform模块中。它是。然后我尝试了一个实验。我创建了一个新的工作簿,并将代码导入到一个全新的类和用户表单中。我添加了三个文本框。Abracadabra!成功了!然而,它并没有以我想要的形式工作。我已经搜索了表单本身和文本框的属性,我看不到我的表单和虚拟表单之间有什么不同


这一定是很简单的东西,我看得太多了

在对我可怜的显示器进行了大量的挠头和尖叫之后,我终于找到了解决方案,但到目前为止,我对微软使用用户表单的古怪行为感到非常失望。以下是解决问题的方法:

我还没有设置标签顺序

我意识到tab顺序打开了我的表单,表单上的多页文本框设置了第一个tab停止。我设置了选项卡顺序,以便第一个文本框在UserForm上处于活动状态,并且所有内容都与表单主体上的颜色一起工作

在我看来,这就是奇怪的开始

当到达表单主体上的最后一个文本框并按下tab键时,将选择多页本身。只有在第二次点击tab键后,才会选择多页中的第一个文本框,然后颜色就不会应用,因为它们在表单的主体中。同样的情况也适用于帧。而且,从第1页的末尾到第2页的开头似乎没有简单的制表符

这让我非常失望,因为我本以为事情不是这样的。我假设我可以设置1000个文本框,使用框架和多页来组织内容,这样我就可以将窗口保持在一个大小,而不必上下滚动表单,然后设置一个选项卡顺序来导航所有文本框,而不管它们在什么组织容器中。我以为会是这样,因为这是有道理的!我想点击第一个文本框,在表格填写完毕之前,不要触摸鼠标。否则,创建用户表单的努力就没有意义了!我可以在电子表格中点击,而无需设计表单和编写代码

真倒霉


我想我能做到!通过编写一堆代码将选择从一个容器跳到另一个容器…微软-它不应该如此古怪和愚蠢

类模块LostFucus中有一个输入错误。当我运行代码时,背景在激活时变为绿色,在失去焦点时变为白色。我在类中的两个位置将拼写错误LostFucus改为LostFocus。但是,我仍然看不到任何颜色。你确定把代码放在用户表单模块中了吗?是的,先生。UserForm背后的代码,我在同一模块中有其他代码,这些代码处理那些文本框中输入的文本。除了这个颜色的东西,一切都正常。看看我在原始问题中添加了另一个更新的地方。
Private Sub TextBox1_Enter()
TextBox1.BackColor = RGB(153, 255, 51)
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.BackColor = RGB(255, 255, 255)
End Sub