Доброго времени суток! Сегодня мы поговорим о работе с формами VBA, а также рассмотрим практически понятия фильтров и флагов в VBA.
Формы в VBA
Сначала немного теории. Форма — это во многом просто контейнер для хранения других элементов управления. Своего рода, посредник между пользователем и программистом. Форма в VBA нужна для того, чтобы ограничить пользователя нажиманием определённых кнопок и не допустить лишнего вмешательства в код программы.
Немного основных свойств объекта Форма(UserForm):
Name – данное свойство содержит имя формы, или, точнее сказать, имя объекта. Нужно понимать, что данное значение доступно только в теле программы и никак не влияет на конечный результат.
BackColor – содержит цвет фона.
BorderColor – цвет рамки.
Caption – свойство определяет заголовок формы, фактически, это тот же заголовок окна программы. По умолчанию, данное свойство содержит то же значение, что и свойство Name.
Enabled – принимает логическое True или False, и определяет, доступна ли форма.
ShowModal – может принимать только логические значения. True – пока не будет закрыта текущая форма, другая форма или возврат в документ будут недоступны.
Font – определяет шрифт.
ForeColor – определяет цвет переднего плана формы, например, цвет текста.
Флаги и фильтры
Флаги — также называемые checkbox в программировании. Могут принимать только логические значения. Обычно флаги ставят напротив вопросов (как ответ Да/Нет) или функций (выполнять/не выполнять).
Фильтры — в двух словах,процесс проверки на какое либо условие.
Теперь рассмотрим пример, отражающий в себе работу с формами, с флагами и фильтрами в VBA.
Дана таблица 4х5, в каждой ячейке которой записаны числа, "+"
, "-"
, слова, начинающиеся с больших и маленьких букв и символы, не относящиеся к алфавиту. Необходимо создать пользовательскую форму с набором разных вариантов фильтров.
Выглядит таблица примерно так:
Создаём формы
Добавим форму в редакторе VBA: Insert > UserForm.
С помощью MultiPage в Toolbox делаем 2 страницы.
На первой странице будет располагаться фильтр по первым буквам слов. С помощью TextBox и SpinButton.
На второй странице сделаем с помощью CheckBox и Label разные варианты фильтров. А также добавляем основную кнопку расчётов.
Названия объектов изменятся с помощью Caption.
Всё это должно выглядеть примерно так.
Теперь создадим форму вывода после фильтрации.
Создадим Listbox, Label и Button.
Код
В коде очень много команд настройки и проверки именно для формы, чтобы исключить ошибки в результате. Мы разберём только основные алгоритмы, весь код вы найдёте в исходнике ниже.
Под кнопку расчёта идёт такой код:
Private Sub CommandButton1_Click() Dim i As Integer, j As Integer, x As Integer Const v = 7 x = 0 Dim flag(v) As Boolean For i = 0 To Me.Controls.count - 1 j = InStr(1, Me.Controls.Item(i).Name, "CheckBox") If j <> 0 Then flag(x) = Me.Controls.Item(i).Value x = x + 1 End If Next i
С помощью данного цикла мы находим все CheckBox и записываем их значения в массив, чтобы нам было удобнее работать.
Const N = 5 Const M = 4 '_________________________________Очищаем форму 2 и создаём 4 столбца UserForm2.ListBox1.Clear UserForm2.ListBox1.ColumnCount = 4 '_________________________________ Dim massiv(N, M) As Variant Dim bool(N, M) As Boolean For i = 0 To N - 1 For j = 0 To M - 1 If flag(5) Then massiv(i, j) = Cells(i + 1, j + 1) If flag(0) Then If flag(1) And Not flag(2) Then If pr_chislo(Cells(i + 1, j + 1)) Then massiv(i, j) = Cells(i + 1, j + 1) If pr_text(Cells(i + 1, j + 1), flag(6), flag(3), flag(4)) Then massiv(i, j) = Cells(i + 1, j + 1) End If If Not flag(1) And flag(2) Then If pr_plus(Cells(i + 1, j + 1)) Then massiv(i, j) = Cells(i + 1, j + 1) If pr_text(Cells(i + 1, j + 1), flag(6), flag(3), flag(4)) Then massiv(i, j) = Cells(i + 1, j + 1) End If If flag(1) And flag(2) Then ........
Так как код очень громоздкий, то настоятельно рекомендую вам скачать исходники ниже.
Вначале очищаем форму. Затем прописываем в цикле условия в зависимости от «поднятых» флагов. Команды pr_chislo, pr_plus, pr_text вызывают соответствующие булевые функции, которые будут в исходнике ниже.
For i = 0 To N - 1 For j = 0 To M - 1 If massiv(i, j) = "" Then massiv(i, j) = "<Empty>" Cells(7 + i, j + 1) = CStr(massiv(i, j)) Next j Next i
На основе возвращаемых от функций значений построим таблицу. Та ячейка, которая не прошла фильтрацию, записывается как <Empty>
For i = 0 To N - 1 UserForm2.ListBox1.AddItem massiv(i, 0) Next i For i = 0 To N - 1 For j = 1 To M - 1 UserForm2.ListBox1.List(i, j) = massiv(i, j) Next j Next i UserForm2.Show End Sub
Записываем наш массив во вторую форму.
На этом мы закончим.
К сожалению, отобразить весь код не предоставилось возможным, однако, не расстраивайтесь! Мы ответим на все ваши вопросы в комментариях.
Скачать исходник
Будьте первым, кто оставит комментарий