#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
И даже внутри этого цикла вы можете выполнить еще один цикл для перебора нескольких текстовых полей. Сообщите нам, как вы хотите действовать дальше. Надеюсь, это поможет…