VBA用户窗体:使用类模块格式化文本框时,SpinButtons不起作用
我有一堆控制文本框中的值的旋钮。 我正在使用一个类来允许他们使用相同的更改事件。 它与非格式化的盒子效果很好。
但是,当我尝试使文本框显示+和 – 数字它无法正常工作。 只有第一个旋钮会起作用。 在下一个spinbutton工作之前,需要将值设置为负数。 没有任何button(除第一个)将正常工作,除非正上方的文本框顺序设置为负数。
我已经尝试使用.Text而不是.Value但它没有区别。
class级模块:
Public WithEvents SpinBtn As MSForms.SpinButton Public WithEvents StatBox As MSForms.TextBox Private Sub StatBox_Change() Call UserForm1.ChangeSpin End Sub Private Sub SpinBtn_Change() Call UserForm1.ChangeStat End Sub
用户表单模块:
Dim collSpin As New Collection Dim collStat As New Collection Public Sub ChangeStat() Dim i As Long For i = 1 To 4 Me.Controls("StatBox" & i).Value = Me.Controls("SpinButton" & i).Value Next End Sub Public Sub ChangeSpin() Dim i As Long For i = 1 To 4 Me.Controls("SpinButton" & i).Value = Me.Controls("StatBox" & i).Value Me.Controls("StatBox" & i) = Format(Me.Controls("StatBox" & i), "+#;-#;+0") 'This is the line that breaks things Next End Sub Private Sub UserForm_Initialize() Dim i As Long Dim ctl As MSForms.Control Dim obEvents As clsSpin Call ChangeSpin 'Collect SpinButtons For Each ctl In Me.Controls If TypeOf ctl Is MSForms.SpinButton Then For i = 1 To 4 If ctl.Name = "SpinButton" & i Then Set obEvents = New clsSpin Set obEvents.SpinBtn = ctl collSpin.Add obEvents End If Next End If Next ctl 'Collect StatBoxes For Each ctl In Me.Controls If TypeOf ctl Is MSForms.TextBox Then For i = 1 To 4 If ctl.Name = "StatBox" & i Then Set obEvents = New clsSpin Set obEvents.StatBox = ctl collStat.Add obEvents End If Next End If Next ctl End Sub
编辑:感谢@ YowE3K为我展示了一个更容易和更清洁的方式!
类:
Public WithEvents SpinBtn As MSForms.SpinButton Public WithEvents StatBox As MSForms.TextBox Private Sub StatBox_Change() 'prevents error when enter + or - If IsNumeric(Me.StatBox.Value) = False Then Else 'defaults to max or min of spinbutton when out of range Select Case Me.StatBox.Value Case Is < SpinBtn.Min Me.SpinBtn.Value = Me.SpinBtn.Min Case Is > SpinBtn.Max Me.SpinBtn.Value = Me.SpinBtn.Max Case Else Me.SpinBtn.Value = Me.StatBox.Value End Select Me.StatBox.Value = Format(Me.StatBox.Value, "+#;-#;+0") End If End Sub Private Sub SpinBtn_Change() Me.StatBox.Value = Format(Me.SpinBtn.Value, "+#;-#;+0") End Sub Private Sub StatBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 43 '+ Case 45 '- Case 48 To 57 '0-9 Case Else KeyAscii = 0 End Select End Sub
窗体:
Dim collSpinStat As New Collection Private Sub UserForm_Initialize() Dim i As Long Dim obEvents As clsSpin For i = 1 To 4 Set obEvents = New clsSpin Set obEvents.SpinBtn = Me.Controls("SpinButton" & i) Set obEvents.StatBox = Me.Controls("StatBox" & i) Me.Controls("StatBox" & i) = Format(Me.Controls("StatBox" & i), "+#;-#;+0") collSpinStat.Add obEvents Next End Sub
看起来你正在尝试将“StatBox”控件与“SpinButton”控件链接起来。 如果是这样,请尝试以下操作:
Class“clsSpin”:
Public WithEvents SpinBtn As MSForms.SpinButton Public WithEvents StatBox As MSForms.TextBox Private Sub StatBox_Change() Me.SpinBtn.Value = Me.StatBox.Value End Sub Private Sub SpinBtn_Change() Me.StatBox.Value = Format(Me.SpinBtn.Value, "+#;-#;+0") End Sub
用户窗体模块:
Dim collSpinStat As New Collection Private Sub UserForm_Initialize() Dim i As Long Dim obEvents As clsSpin For i = 1 To 4 Set obEvents = New clsSpin Set obEvents.SpinBtn = Me.Controls("SpinButton" & i) Set obEvents.StatBox = Me.Controls("StatBox" & i) collSpinStat.Add obEvents Next End Sub
FWIW,我会build议使用标签,而不是TextBoxes。 使用TextBoxes意味着您将需要将代码合并到StatBox_Change
事件中,以testing用户在TextBox中input的值是否实际有效。 使用标签意味着用户必须使用SpinButton进行更改。