Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно
Лекция 17:

Практика MS Excel

17.1.5. Код формы frm_In

Листинг 17.3 содержит код формы frm_In.

Private Sub cmd_Exit_Click()
    frm_In.Hide
    'Скрывая frm_In мы автоматически
    'переходим к frm_Main
End Sub

Private Sub cmd_Rec_Click()
    'Адрес строки для записи
    Dim num_Address
    'Вычисляем номер строки для записи
    num_Address = ActiveSheet.Range("B1") + _
        ActiveSheet.Range("B2")
    'Записываем номер в первую ячейку строки
    ActiveSheet.Cells(num_Address, 1) = _
        ActiveSheet.Range("B1")
    'Запишем дату во вторую ячейку
    ActiveSheet.Cells(num_Address, 2) = _
        Date
    'В третьей ячейке - тип операции
    ActiveSheet.Cells(num_Address, 3) = _
        cbo_Type.Value
    'В четвертой - сумма
    ActiveSheet.Cells(num_Address, 4) = _
        Val(txt_Sum)
    'В пятой - примечание
    ActiveSheet.Cells(num_Address, 5) = _
        txt_Info
    'Запишем новый номер строки
    ActiveSheet.Range("B1") = _
        ActiveSheet.Range("B1") + 1
    'Сбросим все установки на форме
    Initial
End Sub

Private Sub UserForm_Activate()
    'При активации формы
    'инициализируем элементы управления
    Initial
End Sub

Sub Initial()
    'Инициализация элементов управления
    lbl_Date = Date
    lbl_RecNum = ActiveSheet.Range("B1")
    cbo_Type.Clear
    cbo_Type.AddItem "Доход"
    cbo_Type.AddItem "Расход"
    cbo_Type.Value = "Доход"
    txt_Info = ""
    txt_Sum = ""
End Sub
Листинг 17.3. Код формы frm_In

Рассмотрим код формы frm_Out

17.1.6. Код формы frm_Out

Листинг 17.4 содержит код формы frm_Out. Обратите внимание на пользовательскую процедуру Load_Data(). Мы передаем ей параметр num_Index - номер строки, который должен быть отображен. Работа обработчиков нажатия на кнопки перемещения и обработчика, выполняющегося при выборе даты на календаре сводится к вычислению нужного номера строки и вызову этой процедуры.

Private Sub UserForm_Initialize()
    'Загружаем первую строку
    Load_Data (1)
End Sub

Private Sub cmd_Backward_Click()
    'Предыдущая строка
    If Val(lbl_RecNum) > 1 Then
        Load_Data (Val(lbl_RecNum) - 1)
    End If
End Sub

Private Sub cmd_Exit_Click()
    frm_Out.Hide
End Sub

Private Sub cmd_First_Click()
    'Загружаем первую строку
    Load_Data (1)
End Sub

Private Sub cmd_Forward_Click()
    'Следующая строка
    If Val(lbl_RecNum) < ActiveSheet.Range("B1") Then
        Load_Data (Val(lbl_RecNum) + 1)
    End If
End Sub

Private Sub cmd_Last_Click()
    'Загружаем последнюю строку
    Load_Data (ActiveSheet.Range("B1") - 1)
End Sub

Private Sub cld_First_Click()
    'Просматриваем таблицу,
    'находим первую запись
    'за выбранную дату и выводим эту запись
    For i = 1 To ActiveSheet.Range("B1") - 1
        If ActiveSheet.Cells _
        (i + ActiveSheet.Range("B2"), 2) = _
        cld_First.Value Then
            Load_Data (i)
            Exit For
        End If
    Next i
End Sub

Private Sub cmd_Rec_Click()
    'Адрес строки для записи
    Dim num_Address
    'Вычисляем номер строки для записи
    num_Address = Val(lbl_RecNum + _
        ActiveSheet.Range("B2"))
    'Так как мы разрешили модифицировать
    'лишь сумму и примечание - запишем их
    'в текущую строку
    'Запишем сумму
    ActiveSheet.Cells(num_Address, 4) = _
        Val(txt_Sum)
    'Запишем примечание
    ActiveSheet.Cells(num_Address, 5) = _
        txt_Info
End Sub

Sub Load_Data(num_Index As Integer)
    'Принимает номер строки и выводит
    'Данные из этой строки
    'Адрес строки для чтения
    Dim num_Address
    'Вычисляем номер строки для чтения
    num_Address = num_Index + _
        ActiveSheet.Range("B2")
    'Выводим номер записи
    lbl_RecNum = _
        ActiveSheet.Cells(num_Address, 1)
    'Выводим дату
    lbl_Date = _
        ActiveSheet.Cells(num_Address, 2)
    'Выводим тип операции
    lbl_Type = _
        ActiveSheet.Cells(num_Address, 3)
    'Выводим сумму
    txt_Sum = _
        ActiveSheet.Cells(num_Address, 4)
    'Выводим примечание
    txt_Info = _
        ActiveSheet.Cells(num_Address, 5)
End Sub
Листинг 17.4. Код формы frm_Out

Теперь рассмотрим код модуля формы frm_Balance

17.1.7. Код формы frm_Balance

В листинге 17.5. вы можете найти код модуля формы frm_Balance. Здесь мы вычисляем баланс доходов и расходов по всей таблице. Вычисления ведутся в коде обработчика события Activate.

Private Sub cmd_OK_Click()
    frm_Balance.Hide
End Sub

Private Sub UserForm_Activate()
    'Адрес строки
    Dim num_Address
    'Переменная для хранения суммы доходов
    Dim num_Earn
    'Переменная для хранения суммы расходов
    Dim num_Spend
    For i = 1 To ActiveSheet.Range("B1") - 1
        num_Address = i + ActiveSheet.Range("B2")
        'Если в строке хранится значение дохода
        'добавим его в num_Earn
        If ActiveSheet.Cells(num_Address, 3) = "Доход" _
            Then
                num_Earn = num_Earn + _
                    ActiveSheet.Cells(num_Address, 4)
            End If
        'Если в строке хранится значение расхода
        'добавим его в num_Spend
        If ActiveSheet.Cells(num_Address, 3) = "Расход" _
            Then
                num_Spend = num_Spend + _
                    ActiveSheet.Cells(num_Address, 4)
            End If
    Next i
    lbl_Balance = num_Earn - num_Spend
    If num_Earn > num_Spend Then _
        lbl_Msg = "Доходы больше расходов."
    If num_Earn = num_Spend Then _
        lbl_Msg = "Доходы равны расходам."
    If num_Earn < num_Spend Then _
        lbl_Msg = "Доходы меньше расходов."
End Sub
Листинг 17.5. Код формы frm_Balance
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Анатолий Федоров
Анатолий Федоров
Россия, Москва
Михаил Алексеев
Михаил Алексеев
Россия