У меня есть 3 пары текстовых полей. Мне нужно переместить курсор на первое текстовое поле, второе текстовое поле которого не пусто.
Например, у меня шестое текстовое поле не пусто, и мне нужно переместить курсор на пятое текстовое поле. Я попробовал использовать метод SETFOCUS, но курсор не двигается так, как хотелось бы. Я использую событие ПОСЛЕ ОБНОВЛЕНИЯ. Как можно решить эту проблему?
Следуя аналогичному коду
Private Sub txtMain_AfterUpdate()
Select Case True
Case txt2.Text <> ""
txt1.SetFocus
Case txt4.Text <> ""
txt2.SetFocus
Case txt6.Text <> ""
txt5.SetFocus
End Select
End sub
Я попробовал использовать событие Change and Exit
Привет, полный код очень длинный. Я использую событие AFTER UPDATE и для других текстовых полей, и в этом случае работает код, выполняющий другие действия.
Я не уверен, что понимаю ваш вопрос... Учитывая, что приведенный выше код работает, но вы хотите, чтобы он был аналогичен для некоторых других флажков, будет ли это правильным предположением? Если да, вам необходимо предоставить дополнительную информацию: имя соответствующих текстовых полей (по крайней мере, шаблон, поскольку они содержат текст «txtBMain» или что-то еще), имена или конкретный шаблон * для флажков, которыми нужно управлять. каждым таким контролем. Затем я могу помочь вам с классом-оболочкой, способным идентифицировать текстовое поле, имеющее необходимое событие После обновления, и действовать в соответствии с **извлеченной предоставленной логикой**.
Я имел в виду, что имя каждого текстового поля, содержащего пример события AfterUpdate, должно быть помещено в массив (или вам нужно указать некоторую логику, на основе которой будет идентифицироваться при выделении кода события) и другую логику, чтобы связать имя необходимого текстового поля используется для итерации setFocus правильного.


Предполагая, что все это происходит в форме:
Private Sub txtMain_AfterUpdate()
Dim x As Integer
Dim txt As MSForms.TextBox
For x = 2 To 6
If Controls("txt" & x).Text <> "" Then
Controls("txt" & (x - 1)).SetFocus
End If
Next
End Sub
Идея состоит в том, чтобы перебрать все текстовые поля, предполагая, что они имеют одинаковый шаблон в имени: «txt» + номер. Цикл начинается со второго текстового поля, поскольку перед первым нет предыдущего текстового поля.
Private Sub txtMain_AfterUpdate()
Dim ctrl As MSForms.Control
Dim txt As MSForms.TextBox
Dim txtPrev As MSForms.TextBox
Dim prevTag As String
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
Set txt = ctrl
'// Somehow get the value of tag
prevTag = "GET TAG VALUE OF PREVIOUS TEXTBOX"
If txt.Text <> "" Then
Set txtPrev = FindPreviousTextBox(prevTag)
If Not txtPrev Is Nothing Then
txtPrev.SetFocus
Exit For
End If
End If
End If
Next
End Sub
Private Function FindPreviousTextBox(prevTag As String) As MSForms.TextBox
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
If ctrl.Tag = prevTag Then
Set FindPreviousTextBox = ctrl
Exit Function
End If
End If
Next
End Function
Если вы хотите манипулировать тегами, сначала нужно перебрать все элементы управления и проверить наличие текстовых полей. Если элемент управления представляет собой текстовое поле, вы получаете от него свойство Tag. Единственное, нужно каким-то образом получить значение тега предыдущего текстового поля (поскольку я не знаю, как вы это делаете). Я написал в комментарии, что нужно это как-то сделать.
Спасибо за ваш ответ. Однако, поскольку у меня более сложные имена для текстовых полей, такие как txtSerialPh и т. д., мне сложно их адаптировать. Вместо этого, если бы я захотел использовать тег элемента управления, можно ли было бы выполнить итерацию с использованием этого тега?
Вместо этого используйте управляющий массив .
Привет всем и спасибо всем. Я решил использовать KEYDOWN EVENT.
Спасибо
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Какой код конкретно вызывается или используется в форме? У вас есть текстовое поле с именем
txtMain? Что вы подразумеваете под подобным кодом? Следует ли предполагать, что опубликованный вами код используется для событияAfterUpdateкаждого текстового поля?