Самоучитель VBA

       

Практика



  • Выберите команду Сервис, Макрос, Редактор Visual Basic (Tools, Macro, Edit Visual Basic), откроется окно редактора Visual Basic.

  • Выберите команду Вставить User Form (Insert UserForm).

  • Используя панель элементов и окно свойств, заполните пользовательскую форму элементами управления (рис. У1.1), создав требуемое диалоговое окно приложения.

    Рис. У1.1. Вид редактора Visual Basic при создании пользовательской формы для игры в орел и решка

  • Для написания кода программы, связанного с пользовательской формой, достаточно дважды щелкнуть, например, кнопку Бросание монеты. Откроется редактор кода на листе модуля userFormi. Более того, он откроется на том месте, где программируются действия, связанные с элементом управления, который вы дважды щелкнули. Если код еще не набран, то при открытии редактора кода появятся инструкции заголовка и окончания процедуры, которая будет ассоциирована с элементом управления. В данном случае в редакторе кода будет:

    Private Sub CommandButtonl_Click() End Sub

    Конечно, редактор кода заботится о вас, создавая инструкции заголовка и окончания процедуры. Но не требуйте от него невозможного, а именно, чтобы он телепатически прочитал ваши мысли и ввел их в виде кода в тело процедуры. Код в тело процедуры кроме вас никто вводить не будет. Как это ни печально, но вы должны вводить их вручную, при этом используя интеллектуальные качества редактора кода и средства визуального программирования, которые существенно упростят процесс создания программы.

  • Когда-то Конфуций сказал: "То что слышу — забываю, то что вижу -запоминаю, а то что делаю — поминаю", а Мао Дзе Дун добавил: "Для того чтобы стул сдвинулся, его надо сдвинуть". Итак, вдохновившись этими двумя мудростями, наберем текст следующей программы на листе модуля UserForm1.
  • ' Переменные уровня модуля



    '

    Dim Банк As Long

    Dim Партия As Long

    Dim НомерМаксимум As Long

    Dim НомерМинимум As Long

    Dim Максимум As Long

    Dim Минимум As Long

    '

    Private Sub CommandButtonl_Click()



    ' Определяет номер очередной партии

    Партия = Партия + 1

    ' Запрещается изменение пользователем значения

    ' в поле Банк в течение игры

    TektBoxl.Enabled = False

    '

    ' Проверяется, являются ли вводимыми в поле Банк данные числом

    If IsNumeric(TextBoxl.Text) = False Then

    MsgBox "Введите ставку", vbExclamation, "Орел и решка"

    TextBoxl.Enabled = True

    TextBoxl.SetFocus

    Exit Sub End If Банк = CLng(TextBoxl.Text)

    ' Проверяется, не превышает ли Банк максимально допустимую величину

    If Банк > 10000 Or Банк <= 0 Then

    MsgBox "Ставка должна быть в диапазоне [1,10000]", vbExclamation, "Орел и решка"

    TextBoxl.Enabled = True TextBoxl.SetFocus

    Exit Sub

    End If

    '

    ' Бросается монета

    '

    Randomize

    Монета = Int(2'* Rnd)

    ' Сравнение результата бросания монеты компьютером

    ' с ситуацией, когда игрок загадал "орел"

    '

    If OptionButtonl.Value = True Then

    If Монета = 0 Then

    Банк = Банк - 1

    TextBoxl,Text = CStr(BaHK)

    End If

    If Монета = 1 Then

    Банк = Банк + 1

    TextBoxl.Text = CStr(Банк)

    End If

    End If

    ' Сравнение результата бросания монеты компьютером

    ' с ситуацией, когда игрок загадал "решка"

    If OptionButton2.Value = True Then

    If Монета = 1 Then Банк = Банк - 1

    TextBoxl.Text = CStr(Банк)

    End If

    If Монета = 0 Then Банк = Банк + 1

    TextBoxl.Text = CStr(Банк)

    End If

    End If TextBox2.Text = CStr(Партия)

    ' Определяется, превышает ли текущее значение поля Банк максимальную

    ' величину

    '

    If Банк > Максимум Then

    Максимум = Банк

    НомерМаксимум = Партия

    TextBox3.Text = CStr(Максимум)

    TextBox5.Text = CStr(НомерМаксимум)

    End If

    ' Определяется, превышает ли минимальное значение поля Банк текущее

    ' значение

    '

    If Банк < Минимум Then

    Минимум = Банк

    НомерМинимум = Партия

    TextBox4.Text = CStr(Минимум)

    TextBox6.Text = CStr(НомерМинимум)

    End If

    End Sub

    '

    Private Sub CommandButton2_Click()

    '

    ' Процедура закрытия диалогового окна

    '

    UserForml.Hide End Sub



    Private Sub UserForm_Initialize()

    ' Процедура инициализации диалогового окна

    Максимум = 0

    Минимум = 10000

    Партия = 0

    '

    ' Поле Банк доступно для ввода информации пользователем

    ' при инициализации диалогового окна

    '

    TextBoxl.Enabled = True

    '

    ' Поля Партия, Максимум, Минимум и Игра не доступны для

    ' ввода информации пользователем

    '

    TextBox2.Enabled = False

    TextBox3.Enabled = False

    TextBox4 ..Enabled = False

    TextBox5.Enabled = False

    TextBox6.Enabled = False

    ' При инициализации диалогового окна выбран переключатель Орел

    OptionButtonl.Value = True

    End Sub

    Ниже описывается, для чего предназначена каждая из процедур данной программы.



    UserForm_Initialize



    1. Активизирует диалоговое окно.

    2. Поле Банк доступно для ввода информации пользователем при инициализации диалогового окна.

    3. В поля Партия, Максимум, Минимум и Игра разрешен только программный ввод данных.

      При инициализации диалогового окна выбран переключатель орел.



    Нажатие кнопки

    Бросание монеты

    запускает на выполнение процедуру

    CommandButton1 Click



    1. В переменной партия учитывается номер очередной партии.

    2. В поле Банк разрешен только программный ввод данных. Перед началом игры первой партии проверяется, является ли вводимое данное числом в диапазоне от 1 до 10 000. Если это условие не выполняется, отображается соответствующее сообщение (рис. У 1.2), предлагающее пользователю откорректировать данные. В поле Банк снова разрешен ввод данных пользователем. После чего происходит выход из процедуры для повтора ввода данных.

      Генерируется бросание модели. Определяется, кто выиграл в текущей партии. Корректируется информация о максимальном и минимальном выигрыше в течение игры, если какие-то изменения в этой информации имели место. Вся информация о текущем состоянии игры отображается в полях ввода.



    Нажатие кнопки Отмена запускает на выполнение процедуру

    CommandButton2 Click



    Закрывает диалоговое окно.

    Для запуска приложения достаточно нажать кнопку Запуск подпрограммы/UserForm или выбрать команду Запуск, Запуск подпрограммы/UserForm.



    На экране появится диалоговое окно игры. Игрок вводит в поле Банк сумму денег, и потом, выбирая соответствующий переключатель в группе выбор, загадывает орел или Решка. Нажатие кнопки Бросание монеты приводит к подбрасыванию компьютером монеты. Текущий счет игрока отображается в поле Банк. В поле партия выводится номер текущей партии, а в полях максимум и минимум выводятся максимальный и минимальный счет игрока втечение предыдущих партий. На рис. У 1.3 приведено диалоговое окно орел-решка на 30-м ходе игры при начальном банке в 100 единиц. Отображаемая информация в диалоговом окне Орел-Решка показывает, что 30 партий изнурительной игры принесли игроку выигрыш только в 2 единицы. Если бы игрок не жадничал и остановил игру на 18 ходе, то его выигрыш был бы в два раза больше. А если бы игрок струсил, когда стал проигрывать, и вышел из игры на 3 ходе, то его проигрыш составил бы 3 единицы.



    Рис. У1.2. Возможное сообщение о неправильном вводе данных в поле Банк



    Рис. У1.3. Диалоговое окно Орел-Решка




    Содержание раздела