Как управлять методом KeyPress TextBox в Excel VBA - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть код, который будет создавать текстовые поля внутри многостраничного:

Private Sub CommandButton1_Click()

RowChar = 70
MultiPage1.Pages.Clear

For i = 0 To TextBox1.Value - 1
    MultiPage1.Pages.Add
    MultiPage1.Pages(i).Caption = "Variable" & i + 1

    Call LabelPerPage

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "NameBox")
    With txtbx
        .Top = 20
        .Left = 100
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "MinBox")
    With txtbx
        .Top = 50
        .Left = 100
    End With


    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "LsbBox")
    With txtbx
        .Top = 20
        .Left = 300
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "MaxBox")
    With txtbx
        .Top = 50
        .Left = 300
    End With

    If i = 0 Then
        FormulaString = "= C15"
    Else
        FormulaString = FormulaString & "  " & Chr(RowChar) & "15"
        RowChar = RowChar + 3
    End If
Next i
TextBox2.Value = FormulaString
End Sub

Private Sub LabelPerPage()
    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.Label.1")
    With txtbx
        .Top = 20
        .Left = 50
        .Caption = "NAME:"
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.Label.1")
    With txtbx
        .Top = 50
        .Left = 50
        .Caption = "MIN:"
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.Label.1")
    With txtbx
        .Top = 20
        .Left = 250
        .Caption = "LSB:"
    End With

    Set txtbx = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.Label.1")
    With txtbx
        .Top = 50
        .Left = 250
        .Caption = "MAX:"
    End With
End Sub

Я пытался создать код, который будет создавать страницу, а также текстовое поле в ней, моя проблема в том, что я не могу сделать KeyPress наTextBox, потому что он будет создаваться автоматически только из-за моего кода.

Цель:

1.) Моя цель - использовать KeyPress, если TextBox не может ввести числовое значение илиПисьмо.

2.) Я хочу сравнить 2 текстовых поля, где текстовое поле 1 должно быть минимальным, с текстовым полем 2

** Я надеюсь, что кто-то может мне помочь, потому что я изо всех сил пытался решить его.Я попытался сделать это с кодом:

Вариант 1:

Private Sub MaxBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii > 46 And KeyAscii < 58) Or KeyAscii = 43 Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
MsgBox "Invalid key pressed, you can enter numbers only"
End If
End Sub

Вариант 2:

Private Sub OnlyNumbers()
    If TypeName(Me.ActiveControl) = "MaxBox" Then
        With Me.ActiveControl
            If Not IsNumeric(.Value) And .Value <> vbNullString Then
                MsgBox "Sorry, only numbers allowed"
                .Value = vbNullString
            End If
        End With
    End If
End Sub

Но это не сработает.Заранее спасибо, если кто-то может помочь:)

1 Ответ

0 голосов
/ 10 декабря 2018

Почему бы не потерять keyPress в целом, поскольку единственное, чего вы пытаетесь достичь, это только числовой ввод?Вы можете просто сделать что-то подобное в своем коде пользовательской формы:

Option Explicit
'Variable to capture Change event from your textbox:
Private WithEvents maxbox As MSForms.TextBox

'The creation of the thing; I just created a multipage control to reuse your lines.
Private Sub UserForm_Initialize()
    Dim txtbox as MSForms.TextBox
    Dim i As Integer
    i = 0
    Set txtbox = UserForm1.MultiPage1.Pages(i).Controls.Add("Forms.TextBox.1", "MaxBox")
    With txtbox 
        .Top = 50
        .Left = 50
    End With
    Set maxbox = txtbox
End Sub

'Capture change of maxbox:
Private Sub maxbox_Change()
    'In case somebody entered something non-numeric:   
    If IsNumeric(maxbox.Text) = False Then
        'Remove the input character
        maxbox.Text = Left(maxbox.Text, Len(maxbox.Text) - 1)
        'And alert the user
        MsgBox "numeric only!"
    End If
End Sub

Если вам нужно несколько, вы также можете просто создать собственный класс, в который вы захватываете событие, и добавить collection этого класса вФорма пользователя.Для этого вы можете взглянуть на ответы на этот вопрос

Редактировать: Во второй половине (проверить по Minbox) вы можете использовать тот жесобытие: просто добавьте еще один оператор if, чтобы обеспечить числовое значение > CInt(minbox.text) (или другой числовой тип).

Редактировать 2: Возможно, вы захотите добавить обработку ошибок для Left(maxbox.Text, Len(maxbox.Text) - 1) бит в случае, если длина строки равна 0 (т.е. когда кто-то нажал клавишу Backspace / Delete, чтобы вызвать событие изменения).

...