Вопрос по vba, excel, textbox – Как поставить фокус на текстовое поле по мере необходимости

1

У меня есть текстовое поле на пользовательской форме. Если пользователь не может что-либо ввести в это текстовое поле, мне нужно перехватить это для принудительного ввода. Я могу сделать это достаточно легко, но после уведомления пользователя, что он должен сделать запись, я хочу, чтобы фокус вернулся в текстовое поле. Прямо сейчас это не так. Вот мой код:

Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Select Case KeyCode
    Case 13:
        If Me.txtAnswer.Value = "" Then
            temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!")
            Me.txtAnswer.SetFocus
        Else
            recordAnswer
        End If
    End Select

End Sub

Этот код прекрасно работает, так как окно сообщения появляется, если текстовое поле оставлено пустым. После очистки окна сообщения, если я снова нажму клавишу ВВОД, снова появится окно сообщения, предполагая, что фокус находится на текстовом поле. Однако если я попытаюсь ввести символ (например, число «1»), в текстовом поле ничего не появится.

Кто-нибудь может подсказать, как мне вернуть фокус на это текстовое поле таким образом, чтобы пользователь мог вводить данные? Спасибо!

Странный. recordAnswer делает кучу вещей, в основном это заполняет данные на листе. Эта подпрограмма была тщательно протестирована в полевых условиях, поэтому я знаю, что это не проблема. Я думаю, что я просто оставлю все как есть. Пользователь просто должен нажать на текстовое поле, чтобы вернуть фокус назад. Спасибо! Alex
Это прекрасно работает для меня ... Что делаетrecordAnswer делать? Siddharth Rout
Существует вероятность того, что этот пост на Contextures может помочь:blog.contextures.com/archives/2012/05/08/…, У нее была несколько похожая проблема, и она была решена в комментариях. Doug Glancy

Ваш Ответ

3   ответа
8

Вы не должны беспокоить пользователей сообщениями, когда они печатают в форме. Сделай это в конце.

Private Sub OK_Click()

    '// Validate form
    If txtAnswer.Text = vbNullString Then
        MsgBox "You need to enter an answer!", vbExclamation, "No Answer Found!"
        txtAnswer.SetFocus
        Exit Sub
    End If

    '// You have reached here so form is correct carry on
    recordAnswer

End Sub

Если вы действительно хотите использовать запрашиваемое вами поведение, попробуйте следующее:

Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Select Case KeyCode
    Case 13:
        If Me.txtAnswer.Value = "" Then
            temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!")              
            KeyCode = 0
        Else
            recordAnswer
        End If
    End Select

End Sub

Проблема в том, что в вашем коде вы устанавливаете фокус, но клавиша ввода срабатывает впоследствии. Вам не нужно устанавливать фокус, потому что текстовое поле уже имеет фокус, вам просто нужно отменить клавишу ввода.

Error: User Rate Limit Exceeded Alex
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededExit SubError: User Rate Limit ExceededtxtAnswer.SetFocus
0

лема, и я действительно хотел получить текстовое предупреждение. Мне показалось проще просто сделать невидимую метку в форме, которая будет отображаться, если введены неверные данные. Я также сделал фон метки красным, чтобы пользователь заметил, что что-то не так. Делая это таким образом, курсор оставался видимым и там, где он остановился.

Public Function amount(ByRef cont As MSForms.TextBox) As Integer
'makes sure that a number is used
'could change to account for decimals if necessary
Dim i As Long
On Error Resume Next
i = 0
If (cont.Value = "") Then Exit Function
    Do While i < 1000000
        If (cont.Value = i) Then
            UserForm1.Label257.Visible = False
            Exit Function
        End If
        i = i + 1
    Loop
UserForm1.Label257.Visible = True
amount = 1
End Function

Public Sub qty_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If amount(UserForm1.qty) = 1 Then
    Cancel = True
End If
End Sub

Я надеюсь, что это поможет другим, кто столкнется с этой проблемой позже.

-2

я предполагаю, что счетчик i должен продолжать работать? Извините, немного ржавый, прошло несколько лет с тех пор, как я написал код.

В любом случае, если это так, вы всегда можете запустить его, пока i = 0, делайте (или пока true).

Извините, я впервые публикую здесь, надеюсь, что это имело смысл.

Похожие вопросы