MyTetra Share
Делитесь знаниями!
Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)
Время создания: 16.03.2019 23:43
Текстовые метки: TextBox, ComboBox
Раздел: Разные закладки - VBA - Форма
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514993694inddbi27jp/text.html на raw.githubusercontent.com

Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)

 

Очень часто при работе с формами(UserForm) приходится заполнять значениями КомбоБоксы(ComboBox) и ТекстБоксы(TextBox). Иногда однотипными данными. Или очистить их все после выполнения какого-либо действия. А может проверить, все ли элементы заполнены, прежде чем продолжать действие. Если КомбоБоксов/ТекстБоксов пару штучек - не проблема

TextBox1 = "" TextBox2 = ""


1

2

TextBox1 = ""

TextBox2 = ""

и всех делов. А если их порядка двадцати? Или больше? Мало того, что писать это все долго, так еще и код растягивается, как портянка. Но это можно сделать гораздо проще и удобнее. Воспользоваться можно несколькими способами. Этот способ наиболее популярен, если необходимо произвести однотипные действия со всеми ТекстБоксами на форме:

Sub All_TextBoxes() Dim oControl As Control For Each oControl In UserForm1.Controls If TypeOf oControl Is MSForms.TextBox Then oControl.Value = "" Next oControl End Sub


1

2

3

4

5

6

Sub All_TextBoxes()

    Dim oControl As Control

    For Each oControl In UserForm1.Controls

        If TypeOf oControl Is MSForms.TextBox Then oControl.Value = ""

    Next oControl

End Sub

В примере элементы формы очищаются, но в код можно подставить любое действие - добавление нового элемента списка(для ComboBox), поменять представление данных в TextBox, проверить наличие данных в проверяемом элементе и т.д. Тут уж зависит от поставленной задачи. Конечно, подобным способом можно проделать разные действия и с остальными элементами формы. Только надо будет заменить тип для проверки элементов:

ComboBox - MSForms.ComboBox CheckBox - MSForms.CheckBox CommandButton - MSForms.CommandButton Frame - MSForms.Frame Image - MSForms.Image Label - MSForms.Label ListBox - MSForms.ListBox MultiPage - MSForms.MultiPage SpinButton - MSForms.SpinButton TabStrip - MSForms.TabStrip ToggleButton - MSForms.ToggleButton


1

2

3

4

5

6

7

8

9

10

11

ComboBox - MSForms.ComboBox

CheckBox - MSForms.CheckBox

CommandButton - MSForms.CommandButton

Frame - MSForms.Frame

Image - MSForms.Image

Label - MSForms.Label

ListBox - MSForms.ListBox

MultiPage - MSForms.MultiPage

SpinButton - MSForms.SpinButton

TabStrip - MSForms.TabStrip

ToggleButton - MSForms.ToggleButton

Это не единственный способ проделывания однотипных действий с элементами формы. Код ниже использует имена элементов для обращения к ним:

Sub All_TextBoxes() Dim li As Long For li = 1 To 10 UserForm1.Controls("TextBox" & li).Value = li Next li End Sub


1

2

3

4

5

6

Sub All_TextBoxes()

    Dim li As Long

    For li = 1 To 10

        UserForm1.Controls("TextBox" & li).Value = li

    Next li

End Sub

Недостаток данного метода: имена элементов должны строго соответствовать используемым в коде и лишь нумерация на конце имени должна различаться. За нумерацию отвечает переменная li и, конечно, цикл, в котором задается начальное и конечные значения. В примере ТекстБоксам с именами от "TextBox1" до "TextBox10" будут подставлены значения номеров самих ТекстБоксов. Но такой недостаток может быть очень полезным. Например, если необходимо проделать действия не над всеми ТекстБоксами, а лишь над некоторыми из них. Тогда даете им определенные имена имена и все. И в зависимости от имени можно проделывать различные действия: стирать значения, менять свойства элементов и т.д.
И есть еще один плюс такого подхода: когда необходимо заполнить значения ТекстБоксов значениями ячеек. Скажем надо заполнить 10 ТекстБоксов(с именами TextBox1, TextBox2, TextBox3 и т.д.) из ячеек диапазона A2:A11 листа с именем "Лист2"(т.е. из 10 ячеек, начиная с ячейки A2). Код будет выглядеть так:

Sub Fill_TextBoxes_FromCells() Dim li As Long For li = 1 To 10 UserForm1.Controls("TextBox" & li).Value = Sheets("Лист2").Range("A" & li).Value 'или применить Cells вместо Range 'UserForm1.Controls("TextBox" & li).Value = Sheets("Лист2").Cells(li, 1).Value Next li End Sub


1

2

3

4

5

6

7

8

Sub Fill_TextBoxes_FromCells()

    Dim li As Long

    For li = 1 To 10

        UserForm1.Controls("TextBox" & li).Value = Sheets("Лист2").Range("A" & li).Value

        'или применить Cells вместо Range

        'UserForm1.Controls("TextBox" & li).Value = Sheets("Лист2").Cells(li, 1).Value

    Next li

End Sub

Подробнее про обращение к диапазонам из VBA можно узнать из этой статьи: Как обратиться к диапазону из VBA

Скачать пример

  Tips_Macro_WorkWithGroupControls.xls (51,5 KiB, 2 725 скачиваний)

Прикрепленные файлы:
Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования