我刚学习VBA并使用了旧书中的一些代码(Excel 2010)。可能是Excel 2016有一些更改使得此代码不再起作用。
我没有为类或Subs获得编译错误。行为是没有发生。应该发生的是,ComboBox或TextBox的BackColor应该改变颜色,好像它处于焦点或离开焦点一样。
正如我所说,由于某些原因,当我运行代码时没有任何反应。没有出现任何错误或警告,因此它就好像代码正在运行,然后什么都不做。
这是我的代码。评论应该说清楚。我希望有人可以向我解释发生了什么以及为什么当我通过UserForm选项卡时焦点发生变化时,此代码不会导致颜色变化。
第一个代码块是一个独立的类模块,名为" 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
以下Subs在UserForm代码中
Option Explicit
Private WithEvents objForm As clsCtlColor
'*********************************************************************************************************************
'*Subs for managing the BackColor of comboxes and TextBoxes depending on focus.***************************************
'*********************************************************************************************************************
'initializes the Userform with the clsCtlColor class
Private Sub UserForm_Initialize()
Set objForm = New clsCtlColor
End Sub
'Changes the BackColor of the Active Control when the form is activated.
Private Sub UserForm_Activate()
If TypeName(ActiveControl) = "ComboBox" Or _
TypeName(ActiveControl) = "TextBox" Then
ActiveControl.BackColor = &H99FF33
End If
objForm.CheckActiveCtrl Me
End Sub
'Changes the BackColor of the Active Control when it gets the focus.
Private Sub objForm_GetFocus()
ActiveControl.BackColor = &H99FF33
End Sub
'Changes the BackColor back to white when the control loses focus.
Private Sub objForm_LostFocus(ByVal strCtrl As String)
Me.Controls(strCtrl).BackColor = &HFFFFFF
End Sub
'Clears the objForm when the form is closed.
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Set objForm = Nothing
End Sub
在类模块中,是一个错误语句,在发生错误时终止Sub。但是,我评论它仍然,我看到没有编译错误。所以,我只能得出结论,这是一个运行时问题。
非常感谢任何帮助。
更新
如果我在TextBox上使用这两个潜艇,我会得到我正在寻找的效果:
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
我讨厌的是我的UserForm有超过一百个TextBox,我需要为每个TextBox编写这两个子 - 所以就像200 ++ Subs!
我仍在尝试采用上述更一般的工作方法 我注意到的一件事是,如果我将上面两个sub中的RGB值更改为Hex值,它们将不再起作用。我尝试在更一般的RGB方法中更改十六进制颜色值,但没有区别。
又一次更新:
有人指出我在班级LostFucus
中输了一个错字。我在两个地方改为LostFocus
。但是,代码仍然无效。然后问题是我的代码是否在userform模块中。它是。然后我尝试了一个实验。我创建了一个新的工作簿,并将代码导入到一个全新的类和用户表单中。我添加了三个文本框。胡言乱语!有效!但是,它不能以我希望它的形式工作。我已经搜索了表单本身和文本框的属性,我可以看到我的表单和虚拟表单之间没有任何不同。
这一定非常简单,我一直在寻找!
答案 0 :(得分:0)
在我的可怜显示器上大量头疼和尖叫之后,我终于找到了解决方案,但截至目前,我对微软因使用UserForms工作的奇怪感到非常失望。以下是解决问题的方法:
我还没有设置标签顺序!
我意识到Tab键顺序打开了我的表单,第一个制表位是为我表单上的MultiPage中的TextBox设置的。我设置了Tab键顺序,以便第一个TextBox在UserForm上处于活动状态,并且所有内容都与表单主体上的着色一起使用。
在我看来,这是奇怪的开始。
当到达表单主体上的最后一个TextBox并按下Tab键时,会选择多页本身。只有在第二次单击选项卡后,才会选择多页中的第一个TextBox,然后颜色不会应用,因为它们完全位于表单主体中。同样的情况也适用于Frames。此外,似乎没有一种简单的方法可以简单地从第1页的末尾到第2页的开头。
对我来说非常失望,因为我会认为这不是现在的样子。我假设我可以设置1000个文本框,使用框架和多页面来组织事物(因此我可以保持一个窗口的窗口而不必滚动窗体上下)然后设置一个可以导航的选项卡顺序所有的TextBoxes,无论他们在哪个组织容器。我认为它会是这样的,因为它让人感觉!我想点击进入第一个TextBox,直到表单完全填满后才直接触摸我的鼠标。否则,制作UserForm的努力真的没有意义!我可以在电子表格中点击并点击,而无需设计表格和编写代码的麻烦!
多么糟糕!
我想我能做到这一点!&#34;通过编写一堆代码将选择从容器跳转到容器...... MICROSOFT - 这不应该是这个笨蛋和傻瓜!