TextBox и SetFocus VBA Excel

У меня есть 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

Какой код конкретно вызывается или используется в форме? У вас есть текстовое поле с именем txtMain? Что вы подразумеваете под подобным кодом? Следует ли предполагать, что опубликованный вами код используется для события AfterUpdate каждого текстового поля?

Storax 16.06.2024 16:34

Привет, полный код очень длинный. Я использую событие AFTER UPDATE и для других текстовых полей, и в этом случае работает код, выполняющий другие действия.

Pasquale Prudente 16.06.2024 17:17

Я не уверен, что понимаю ваш вопрос... Учитывая, что приведенный выше код работает, но вы хотите, чтобы он был аналогичен для некоторых других флажков, будет ли это правильным предположением? Если да, вам необходимо предоставить дополнительную информацию: имя соответствующих текстовых полей (по крайней мере, шаблон, поскольку они содержат текст «txtBMain» или что-то еще), имена или конкретный шаблон * для флажков, которыми нужно управлять. каждым таким контролем. Затем я могу помочь вам с классом-оболочкой, способным идентифицировать текстовое поле, имеющее необходимое событие После обновления, и действовать в соответствии с **извлеченной предоставленной логикой**.

FaneDuru 19.06.2024 10:16

Я имел в виду, что имя каждого текстового поля, содержащего пример события AfterUpdate, должно быть помещено в массив (или вам нужно указать некоторую логику, на основе которой будет идентифицироваться при выделении кода события) и другую логику, чтобы связать имя необходимого текстового поля используется для итерации setFocus правильного.

FaneDuru 19.06.2024 10:21
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что все это происходит в форме:

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 и т. д., мне сложно их адаптировать. Вместо этого, если бы я захотел использовать тег элемента управления, можно ли было бы выполнить итерацию с использованием этого тега?

Pasquale Prudente 16.06.2024 19:59

Вместо этого используйте управляющий массив .

Storax 16.06.2024 20:08
Ответ принят как подходящий

Другие вопросы по теме