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进行更改。