Skip to content

Работа с формами в VBA (Excel)

Доброго времени суток! Сегодня мы поговорим о работе с формами VBA, а также рассмотрим практически понятия фильтров и флагов в VBA.

Формы в VBA

Сначала немного теории. Форма — это во многом просто контейнер для хранения других элементов управления. Своего рода, посредник между пользователем и программистом. Форма в VBA нужна для того, чтобы ограничить пользователя нажиманием определённых кнопок и не допустить лишнего вмешательства в код программы.

Немного основных свойств объекта Форма(UserForm):

Name – данное свойство содержит имя формы, или, точнее сказать, имя объекта. Нужно понимать, что данное значение доступно только в теле программы и никак не влияет на конечный результат.
BackColor – содержит цвет фона.
BorderColor – цвет рамки.
Caption – свойство определяет заголовок формы, фактически, это тот же заголовок окна программы. По умолчанию, данное свойство содержит то же значение, что и свойство Name.
Enabled – принимает логическое True или False, и определяет, доступна ли форма.
ShowModal – может принимать только логические значения. True – пока не будет закрыта текущая форма, другая форма или возврат в документ будут недоступны.
Font – определяет шрифт.
ForeColor – определяет цвет переднего плана формы, например, цвет текста.

Флаги и фильтры

Флаги — также называемые checkbox в программировании. Могут принимать только логические значения. Обычно флаги ставят напротив вопросов (как ответ Да/Нет) или функций (выполнять/не выполнять).
Фильтры — в двух словах,процесс проверки на какое либо условие.

Теперь рассмотрим пример, отражающий в себе работу с формами, с флагами и фильтрами в VBA.

Дана таблица 4х5, в каждой ячейке которой записаны числа, "+", "-", слова, начинающиеся с больших и маленьких букв и символы, не относящиеся к алфавиту. Необходимо создать пользовательскую форму с набором разных вариантов фильтров.

Выглядит таблица примерно так:
Работа с формами в VBA(Excel)

Создаём формы

Добавим форму в редакторе VBA: Insert > UserForm.
С помощью MultiPage в Toolbox делаем 2 страницы.
На первой странице будет располагаться фильтр по первым буквам слов. С помощью TextBox и SpinButton.
На второй странице сделаем с помощью CheckBox и Label разные варианты фильтров. А также добавляем основную кнопку расчётов.
Названия объектов изменятся с помощью Caption.
Всё это должно выглядеть примерно так.
Работа с формами в VBA (Excel)
Теперь создадим форму вывода после фильтрации.
Создадим Listbox, Label и Button.
Работы с формами в VBA (Excel)

Код

В коде очень много команд настройки и проверки именно для формы, чтобы исключить ошибки в результате. Мы разберём только основные алгоритмы, весь код вы найдёте в исходнике ниже.

Под кнопку расчёта идёт такой код:

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

Записываем наш массив во вторую форму.
На этом мы закончим.

К сожалению, отобразить весь код не предоставилось возможным, однако, не расстраивайтесь! Мы ответим на все ваши вопросы в комментариях.
Скачать исходник

Опубликовано вVBA

Будьте первым, кто оставит комментарий

    Добавить комментарий