52953.fb2 VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 63

VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 63

Список- это возможность, предоставляемая 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, где программа по сути является формой.

Так или иначе, чтобы отобразить форму и сделать ее доступной пользователю, в VBA-программе вам придется добавить программный код.

Загрузка и отображение форм

Процесс отображения формы в VBA состоит из двух шагов;

* загрузка формы в память;

* отображение формы на экране.

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

Отображение форм осуществляется методом Show. Например, если именем формы является FormICa, то нужно просто напечатать:

FormICa.Show

Заметьте, что Show - это метод объекта Us er Form, поэтому метод добавляется к имени формы после точки-разделителя. Если указанная форма еще не загружена в память, метод Show сначала загрузит форму, а потом сделает ее видимой.

Чтобы загрузить форму в память перед отображением, используйте оператор Load. Load - это не метод, поэтому в данном случае синтаксис другой (по сравнению с использованием Show):

Load ФормАльДеГид

Зачем загружать форму, не отображая ее? Загрузка формы происходит намного дольше, чем ее отображение. Программа любой сложности выполняет немало процедур инициализации (типа чтения данных из файлов, вычисления начальных значений переменных и создания объектов), поэтому при запуске программы некоторая задержка весьма привычна. Если в это время вы загрузите и свои формы, пользователь отнесется к задержке благосклоннее, чем к такой же задержке во время работы программы. Единственный недостаток предварительной загрузки форм заключается в том, что для них нужна память, которая могла бы использоваться для других целей.

Можно загрузить форму и без оператора Load, выполнив оператор, в котором вызывается свойство либо метод формы или любого из помещенных в нее элементов управления. При этом можно вносить в форму изменения перед тем, как она отображается на экране, Хотя окно свойств редактора Visual Basic позволяет безо всякого программирования управлять тем, как форма будет выглядеть и вести себя на экране, здесь нужно отметить следующее: часто вообще нельзя узнать, как должна выглядеть и что должна делать форма (или ее элементы управления), пока программа не начнет выполняться.

Предположим, например, что в заголовке формы должны отображаться текущие дата и время. Вы не можете предугадать, когда именно пользователь запустит вашу программу, поэтому вам придется поручить VBA указать дату и время за вас. Это можно сделать, например, так:

Sub DisplayDateCaptionedForm()

DateCaptionedForm.Caption = Now

DateCaptionedForm.Show

End Sub

Аналогично можно заставить надпись или текстовое поле формы отображать информацию о том, что в данный момент выделено в VBA-приложении. На рис. 10.24 показано то, что можно увидеть в результате выполнения следующей процедуры VBA, связанной с подходящей формой в Visio:

Sub DisplayShowSelectionForm()

Dim ItemCount As integer, Message As String

Items = ActiveWindow.Selection.Count