Как инициировать нажатие клавиши enter для всех текстовых полей на нескольких листах? — VBA

#excel #vba #textbox

#excel #vba #текстовое поле

Вопрос:

В моей рабочей книге есть три листа (с именами Sheet1 ~ Sheet3) с ТЕКСТОВЫМИ полями.

У этого есть модуль.

 Public dontDoThat As Boolean ' a public variable, visible throughout all your project you'll use to give way to synchronizing activity

Option Explicit

    Sub Synchronize(txt As String, shtName As String)
        dontDoThat = True ' set your public variable to True and prevent subsequent TextBox1_Change() events to run it again


        Dim sht As Variant
        For Each sht In Array("Sheet1", "Sheet2", "Sheet3")
            If sht <> shtName Then Worksheets(sht).TextBox1.Text = txt

        Next

        dontDoThat = False ' set your public variable to False and allow subsequent TextBox1_Change() events to run it
    End Sub
  

Этот код может синхронизировать ТЕКСТОВОЕ поле на всех листах.

Но это только для текста.

Если я введу некоторый текст в ТЕКСТОВОЕ поле 1 листа 1, тот же текст будет отображаться в ТЕКСТОВОМ поле 1 всех других листов.

но функция поиска не работает на других листах.

После того, как я ввел некоторый текст в текстовом поле 1 листа 1 и когда я нажимаю клавишу ввода, функция поиска работает только в листе 1.

Я хочу инициировать нажатие клавиши enter для текстовых полей на всех листах.

И на этих листах также есть TEXTBOX2. Таким образом, я хочу знать, как применить синхронизацию также к TEXTBOX1 и TEXTBOX2.

Мне нужна чья-нибудь помощь.

Ответ №1:

Neo, я уже делал нечто подобное раньше — когда вы создаете автофильтр либо с помощью события Change, либо с помощью указанного события KeyDown (обычно клавиша Enter — vbKeyReturn). Поскольку вы используете событие KeyDown, использование коллекций не было бы чрезмерно исчерпывающим. Вы можете, скажем, объединить все ваши текстовые поля в коллекции либо по сходству имен, либо по имени типа.

В частности, почему я думаю, что у вас возникли проблемы, возможно, выполните цикл по коллекции Worksheets с реальным объектом Worksheet, а не с вариантом. И, поскольку они являются объектами Worksheets, вы можете использовать OLEObjects.

 Dim sht As WorkSheet
Dim x as Integer

x = 1    

For Each sht In ThisWorkbook.WorkSheets
    Do Until sht.OLEObjects("TextBox amp; x") is Nothing
        If sht.Name <> shtName Then sht.OLEObjects("TextBox amp; x").Object.Text = txt
        x = x   1
    Loop
Next
  

И даже внутри этого цикла вы можете выполнить еще один цикл для перебора нескольких текстовых полей. Сообщите нам, как вы хотите действовать дальше. Надеюсь, это поможет…