Есть кое-что, если вы хотите защитить его от дурака. Не говоря уже о том, что это 100% решение, которое вы хотите, но в этом коде есть несколько вещей, о которых вы должны подумать ...
Private bIsChanging As Boolean
Private Sub TextBox4_Change()
Dim dblValue As Double, bIsError As Boolean
If TextBox4.Text = "" Then Exit Sub
If bIsChanging Then Exit Sub
bIsError = True
If IsNumeric(TextBox4.Text) Then
dblValue = CDbl(TextBox4.Value)
If dblValue >= 0 And dblValue <= 50 Then
bIsError = False
End If
End If
If bIsError Then
MsgBox "Please enter the number between 1 and 50."
End If
End Sub
Private Sub TextBox4_Enter()
On Error Resume Next
Dim dblNewValue As Double, strFormat As String
If TextBox4.Text = "" Then Exit Sub
dblNewValue = CDbl(Replace(TextBox4.Value, "%", ""))
strFormat = "0"
If dblNewValue - (1 * (dblNewValue \ 1)) <> 0 Then
strFormat = "0.00"
End If
bIsChanging = True
TextBox4.Value = Format(dblNewValue, strFormat)
bIsChanging = False
End Sub
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next
bIsChanging = True
TextBox4.Value = Format(TextBox4.Value / 100, "0.00%")
bIsChanging = False
End Sub
Он использует события входа и выхода, чтобы попытаться переформатировать ячейку от входа к выходу.
Я надеюсь, что это поможет, и я надеюсь, что я проверил это достаточно, чтобы убедиться, что он работает хорошо. : -)