Возможно, бит длинный намотчик - обычно я использую модуль класса и свойство тега на элементе управления, чтобы решить, что можно ввести в текстовое поле.
Создать форму с четырьмя текстовыми полями.
Дают текстовые поля эти теги:
- 1; CDbl
- 2; CINT
- 3; ПРМ
- 4; CSENTENCE
Цифры столбцы, чтобы вставить значения, когда сохраняется форма (я не описал этот бит здесь).
В тексте описывается, что можно ввести в текстовое поле - CDBL является числовым с 2 знаками после запятой, CINT - числовое число с 0 знаками после запятой, CSTR - для правильного текста, а CSENTENCE - для текста предложения.
Создайте классный класс под названием clsControlText
.
Добавьте этот код в модуль класса:
Public WithEvents txtBox As MSForms.TextBox
Private Sub txtBox_Change()
Static LastText As String
Static SecondTime As Boolean
Const MaxDecimal As Integer = 2
Const MaxWhole As Integer = 1
With txtBox
If InStr(.Tag, ";") > 0 Then
Select Case Split(.Tag, ";")(1)
Case "CDBL", "CCur"
'Allow only numbers with <=2 decimal places
If Not SecondTime Then
If .Text Like "[!0-9.-]*" Or Val(.Text) < -1 Or _
.Text Like "*.*.*" Or .Text Like "*." & String$(1 + MaxDecimal, "#") Or _
.Text Like "?*[!0-9.]*" Then
Beep
SecondTime = True
.Text = LastText
Else
LastText = .Text
End If
End If
SecondTime = False
Case "CINT"
'Allow only whole numbers.
If .Text Like "[!0-9]" Or Val(.Text) < -1 Or .Text Like "?*[!0-9]*" Then
Beep
.Text = LastText
Else
LastText = .Text
End If
Case "CSTR"
'Convert text to proper case.
.Text = StrConv(.Text, vbProperCase)
Case "CSENTENCE"
'Convert text to sentence case (capital after full-stop).
.Text = ProperCaps(.Text)
Case Else
'Allow anything.
End Select
End If
End With
End Sub
Private Function ProperCaps(strIn As String) As String
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Set objRegex = CreateObject("vbscript.regexp")
strIn = LCase$(strIn)
With objRegex
.Global = True
.ignoreCase = True
.Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])"
If .Test(strIn) Then
Set objRegMC = .Execute(strIn)
For Each objRegM In objRegMC
Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM)
Next
End If
ProperCaps = strIn
End With
End Function
Добавьте этот код в форму пользователя:
Private colTextBoxes As Collection
Private Sub UserForm_Initialize()
Dim ctrlSelect As clsControlText
Dim ctrl As Control
Me.Caption = ThisWorkbook.Name
Set colTextBoxes = New Collection
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox"
Set ctrlSelect = New clsControlText
Set ctrlSelect.txtBox = ctrl
colTextBoxes.Add ctrlSelect
End Select
Next ctrl
End Sub
NB: Не все этот код моя. Я нашел ProperCaps
и код для CDBL в другом месте этого сайта - или, возможно, MrExcel.
, что это очень интересный способ пойти об этом! Огромное спасибо! –
Интересно, есть ли способ сделать это с помощью KeyAscii? конечно, должен быть способ?!? –