А что это за странные слова: переключатели должны быть размещены "в одном месте формы"? Конечно, это не официальная терминология VBA, но можно сказать следующее: одна часть формы является самой формой. Каждая добавленная вами рамка элемента управления создаст другую часть формы. И каждая вкладка элемента управления, состоящего из нескольких вкладок, также является отдельной частью формы (о элементах управления, состоящих из нескольких вкладок, которые создаются для ноутбуков и которые похожи на обычные диалоговые окна Windows, я расскажу в главе 19). Можно разместить рамку внутри другой рамки или на вкладке элемента управления, состоящего из нескольких вкладок. Каждая вложенная рамка занимает свою часть формы.
Если в форме есть несколько рамок, VBA рассматривает переключатели, которые не находятся внутри любой рамки, как одну группу, а переключатели, находящиеся в рамке, - как отдельную группу. На рис. 10.20 видно, что я имею в виду.
Рис. 10.20. Три отдельные группы переключателей
Для того чтобы выбрать переключатель, достаточно просто щелкнуть на нем. Однако обычно после выбора переключателя немедленно ничего не происходит. Диалоговое окно останется открытым. Это позволит пользователю еще раз подумать и, может быть, выбрать другой переключатель. И только после того, как пользователь щелкнет на кнопке ОК, он подтвердит свой выбор.
Перед программистом стоит задача: как понять, какой переключатель выбран? Для этого вы должны проверить значение свойства Va l ue для каждого переключателя в группе. Правда, есть способ обойти это. Для этого можно воспользоваться инструкцией If. . .ElseIf:
If OptionEuttonl.Value = True Then
ChosenOption = "Bill"
ElseIf OptionButton2.Value = True Then
ChosenOption = "Bob"
ElseIf OptionButton3.Value = True Then
ChosenOption = "Barney"
Else
ChosenOption = ""
End If
Переключатели полезны, когда приходится иметь дело с большим количеством взаимоисключающих вариантов. Однако, когда необходимо выбрать несколько вариантов, лучше воспользоваться флажками или кнопками с фиксацией. Флажки и кнопки с фиксацией используются для выбора одного из пары противоположных вариантов, например Yes (Да) или No (Нет). On или Off, True или False и Stay или Leave. На практике отличие между флажком и кнопкой с фиксацией состоит в том, как они выглядят.
* Флажок - это маленький квадратик, в котором появляется галочка, если выбран параметр Yes, On или True. (Если квадратик пустой, значит флажок сброшен.)
* Кнопка с фиксацией похожа на обычную кнопку. Единственное отличие состоит в том, что, когда вы щелкаете на ней, она остается нажатой.
На рис. 10.21 показаны несколько флажков и кнопок с фиксацией.
Рис. 10.21. Флажки и кнопки с фиксацией
Флажки часто объединяют в группы для того, чтобы составить список не взаимоисключающих вариантов выбора. На рис. 10.22 приведен пример флажков.
Обратите внимание на то, что каждый отдельный флажок показывает, выбран ли элемент, возле которого он установлен.
Рис. 10.22. Устанавливать и сбрасывать флажки можно независимо
Как обычно, свойство Value содержит информацию, относящуюся к выбору параметров пользователем. Если флажок установлен, свойство Value равно True, если флажок сброшен, свойство Value равно False. Такая же ситуация и с кнопками с фиксацией: свойство Value равно True; если кнопка нажата. В противном случае свойство Value равно False. Для выбора параметров можно воспользоваться следующим кодом:
If tglLightSwitch.Value = True Then
TurnLightOff
Else
TurnLightsOff
End If
[ не всегда код автора безупречен…
If tglLightSwitch.Value = True Then
аналогичен
If tglLightSwitch.Value Then
w_cat ]
Если вы просто хотите изменить текущее состояние флажка или кнопки с фиксацией, лучше всего воспользоваться оператором Not. В следующем коде флажок устанавливается, если он был сброшен, и сбрасывается, если он был установлен:
ChkYesOrNo.Value = Not chkYesOrNo.Value
Выбор параметров из списка и комбинированных окон
Если вы предполагаете, что для элемента может быть четыре-пять взаимоисключающих вариантов выбора, созданное вами диалоговое окно будет слишком загроможденным, ведь в нем может быть 10 -12 флажков. Пользователь может устанавливать флажки в зависимости от собственных предпочтений. Но из-за такого количества элементов в форме станет слишком тесно.
Список- это возможность, предоставляемая Windows для решения многих проблем.
В списке содержится перечень параметров, которые пользователь может выбрать (рис. 10.23).
Рис. 10.23. В данной форме в верхней части располагается список, а в нижней - комбинированное окно
С помощью списка нельзя получить доступ к элементам, которые не содержатся в нем. Кроме того, нельзя представить список VBA в виде раскрывающегося списка в одной строке. Для того чтобы избежать этого ограничения, необходимо воспользоваться комбинированным списком.
Комбинированный список объединяет в себе достоинства простого списка и текстового поля.
Пользователь может выбрать необходимый элемент из списка, а если такового не окажется в списке, ввести его. Основное отличие между списком и комбинированным списком заключается в следующем: для того чтобы раскрыть весь комбинированный список, необходимо щелкнуть на кнопке, на которой изображен треугольник. Скорее всего, вы знакомы с комбинированными списками, но посмотрите на рис. 10.24, чтобы вспомнить, как он выглядит.
С точки зрения пользователя комбинированные списки намного лучше, так как пользователь может легко найти в них необходимый элемент. Однако программисты во многих ситуациях предпочитают офаничивать выбор пользователя, чтобы предотвратить ввод неправильных данных.
Узнав, что такое список, не пользуйтесь им
Я советую использовать комбинированные списки для контроля всех параметров, которые содержатся в списке, независимо от того, вводит или нет пользователь текст, которого нет в данном списке. Забудьте о простых списках.
И вот почему: простой список VBA не может отображать элементы в виде раскрывающегося списка, Вместо этого вы имеете дело с списком, в котором перечислены все доступные варианты выбора сразу. Это не всегда удобно, так как, если в списке слишком много элементов, он займет слишком большую часть формы. Если элементов в списке немного, лучше воспользоваться переключателями или флажками.
В то же время комбинированные списки более компактные, так как они всегда занимают только одну строку. Для того чтобы комбинированный список превратился в обычный простой список, достаточно установить значение свойства Style равным 2
(f mStyleDropDownList). А теперь подумайте: стоит ли мучиться со списками?
Теперь пришла очередь самого трудного. Окно Properties (Свойства) нельзя использовать для ввода вариантов выбора, которые должны находиться в списке или комбинированном списке. Вместо этого вы должны написать код для метода AddItem элемента управления или связать элемент управления с источником данных (он представляет собой электронную таблицу Excel или базу данных Access).
Для того чтобы создать список прямо в коде, используется соответствующая процедура для события Activate данной формы. Она должна содержать несколько инструкций, которые похожи на приведенный ниже пример:
Private Sub UserForm_Activate()
cmbOptionPol l.AddItem "Over population"
cmbOptionPol l.AddItem "Global warming"
cmbOptionPol l.AddItem "No time to smell the roses"
cmbOptionPol l.AddItem "No roses to smell"
cmbOptionPol l.AddItem "Taxes on the rich too high"
cmbOptionPol l.AddItem "Too many social services"
cmbOptionPol l.AddItem "Inadequate social services"
cmbOptionPol l.AddItem "HMOs"
End Sub
Технические подробности размещения элементов из базы данных в списке или комбинированном списке выходят за пределы данной книги, однако вы должны знать, что это возможно.
Для того чтобы найти элемент, который пользователь выбрал или ввел в списке или комбинированном списке, используйте свойство объекта Value в коде. Назначьте свойству соответствующую переменную, как показано ниже: strOption = cmbOptionFoll.Value
Программирование форм
Добавлять элементы управления в формы несложно, а вот, чтобы заставить их делать то, что вам нужно, потребуется немного больше умственной работы и программирования. В этом разделе мы обсудим тонкости процесса программирования форм.
Покажите то, что имеете!
Решив добавить в свою VBA-программу пользовательские формы, вы неизбежно столкнетесь с необходимостью показать эти формы на экране. Иначе зачем эти, пусть даже самые лучшие в мире, формы нужны, если их никто не увидит?
Из-за того, что VBA-программа может при необходимости пользоваться интерфейсом содержащего ее приложения, программа не отображает никакую из ее форм автоматически. В этом отношении VBA отличается от своего собрата Visual Basic, где программа по сути является формой.