我有一堆控制文本框中的值的旋转按钮。我正在使用一个类来允许它们全部使用相同的更改事件。它非常适合未格式化的盒子。
但是,当我尝试使文本框显示 + 和 - 数字时,它无法正常工作。只有第一个旋转按钮可以工作。在下一个旋转按钮起作用之前,需要将其值设置为负数。除非将其正上方的文本框按顺序设置为负数,否则任何按钮(第一个按钮除外)都无法正常工作。
我尝试使用 .Text 而不是 .Value,但没有什么区别。
类模块:
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 向我展示了一种更简单、更干净的方法!
类(class):
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”控件链接起来。如果是这样,请尝试以下操作:
“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,我建议使用标签而不是文本框。使用 TextBox 意味着您需要将代码合并到 StatBox_Change 事件中,以测试用户在 TextBox 中输入的值是否实际上有效。使用标签意味着用户必须使用 SpinButton 进行更改。
关于excel - VBA 用户窗体 : SpinButtons not working when TextBoxes are formatted using Class Module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47724692/