Как вызвать ввод нажатия всех текстовых полей на нескольких листах? - VBA - PullRequest
0 голосов
/ 11 марта 2019

В моей книге три листа (с именем 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

Этот код может синхронизировать TEXTBOX на всех листах.

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

Если я наберу некоторый текст в TEXTBOX1 листа 1, этот текст будет отображаться в TEXTBOX1 всех других листов.

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

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

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

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

Мне нужна помощь.

1 Ответ

0 голосов
/ 11 марта 2019

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

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

Dim sht As WorkSheet
Dim x as Integer

x = 1    

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...