Опубликован: 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
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002