2 семестр / vba_2002
.pdfИспользованиеокнавводаданных
Окно ввода данных — это простое диалоговое окно, которое позволяет пользователю ввести единственное значение. Например, можно применить окно ввода данных, чтобы предоставить пользователю возможность ввести текст, числа или даже диапазон значений. Для создания окна ввода используются две функции InputBox: одна в VBA, а вторая в Excel.
Функция InputBox в VBA
Данная функция имеет следующий синтаксис:
InputBox (Запрос [, Заголовок] [, Яо_умолчани:ю] [, xpos] [ rypos] [, Справка, Раздел])
• Запрос— указывает текст, отображаемый в окне ввода (обязательный параметр).
•Заголовок— определяет заголовок окна ввода (необязательный параметр).
•По^умолчанию— задает значение, которое отображается в окне ввода по умолчанию {необязательный параметр).
•xpos, ypos— определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
• Справка, Раздел— указывают файл и раздел в справочной системе (необязательные параметры).
Функция InputBox запрашивает у пользователя единственное значение. Она всегда возвращает строку, поэтому вам может понадобиться преобразовать результат в числовое значение.
Текст, отображаемый в окне ввода, может достигать 1024 |
|
символов (длина может изменяться в зависимости от шири- |
|
ны используемых символов). Кроме этого, вы можете ука- |
|
зать заголовок диалогового окна, значение по умолчанию и |
|
координаты окна ввода на экране. Также в данном коде |
|
указывается раздел справочной системы со всеми вспомо- |
|
гательными сведениями. Если определить этот раздел, то в |
Рис, }2.}. Результат выполнен |
диалоговом окне будет отображена кнопка Справка. |
функции VBA InputBox |
|
|
В следующем примере, показанном на рис, 12.1, исполь- |
|
зуется функция VBA InputBox, которая запрашивает у пользователя полное имя (имя и фамилию). Затем программа выделяет имя и отображает приветствие в окне сообщения.
Sub GetName()
Dim UserName As String Dim FirstSpace As Integer Do Until UserName о и"
UserName = InputBox("Введите свое имя: ", _ "Регистрация")
Loop
FirstSpace = InStr(UserName, " ") If FirstSpace <> 0 Then
UserName = Left(UserName, FirstSpace - 1) End If
MsgBox "Привет, " & UserName End Sub
Обратите внимание: функция InputBox вызывается в цикле Do Until. Это позволяет убедиться в том, что данные введены в окно. Если пользователь щелкнет на кнопке Отмена
ЧастьIV. Работаспользовательскимиформами |
319 |
(Cancel) или не введет текст, то переменная UwerName будет содержать пустую строку, а окно ввода данных отобразится повторно. Далее в процедуре будет осуществляться попытка получить имя пользователя в результате поиска первого символа пробела (для этого используется функция I n S t r ) . Таким образом, можно воспользоваться функцией L e f t для получения всех символов левее символа пробела. Если символ пробела не найден, то используется все введенное имя.
Как отмечалось ранее, функция I n p u t B o x всегда возвращает строку. Если строка, предоставленная в качестве результата выполнения функции InputBox, выглядит, как число, ее можно преобразовать с помощью функции VBA Val. В противном случае следует применить функцию InputBox, которая содержится в Excel.
Метод InputBox в Excel
Использование метода Excel I n p u t B o x (иместо функции VBA InputBox) предоставляет три преимущества:
•можно задать тип возвращаемого значения;
•можно указать диапазон листа, обведя мышью ячейки листа;
•производится автоматическая проверка правильности введенных данных.
Вданном случае метод I n p u t B o x имеет следующий синтаксис:
object.InputBox(Запрос,Заголовок,По_умолчанию,Слева,Сверху,Справка, Раздел, Тип)
ШЗапрос— указывает текст, отображаемый в окне ввода (обязательный параметр).
• Заголовок — определяет заголовок окна ввода (необязательный параметр).
•По_умолчаиию — задает значение, которое отображается в окне ввода но умолчанию (необязательный параметр).
•Слева, Сверху —определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
• Справка, Раздел— указывают файл и раздел в справочной системе (необязательные параметры).
• Тип— указывает код типа данных, который будет возвращаться методом (необяза* тельный параметр). Его возможные значения перечислены в табл. 12.1.
Таблица 12.1. Кодытиповвозвращаемых методомExcelInputBoxданных
Код Значение
0Формула
1Число
2Строка (текст)
•1 |
Булево значение ( И С Т И Н А ИЛИ ЛОЖЬ) |
8 |
Ссылка на ячейку как объект диапазона |
16 |
Значение ошибки, такое, как # н / д |
64 |
Массив значений |
320 Глава 12. Создание собственных диалоговых окон
•Запрос — определяет текст, который будет отображаться в окне сообщения (обязательный параметр).
•Кнопки— содержит числовое выражение, которые определяет кнопки, отображаемые в окне сообщения (необязательный параметр). Возможные значения приводятся в табл. 12.2.
•Заголовок— содержит заголовок окна сообщения (необязательный параметр).
•Справка, Раздел— указывают файл и раздел справочной системы (необязательные параметры).
Окна сообщений несложно изменить. Как правило, для этого применяется параметр Кнопки. (В табл. 12.2 приведен список констант, которые можно использовать в качестве значений этого параметра.) С его помощью указываются отображаемые кнопки, отмечается необходимость использования значка, определяется кнопка по умолчанию.
Таблица 12.2. Константы, используемые для выбора кнопок в функции MsgBox
|
Значение |
Описание |
|
|
|
|
|
vbOKonly |
0 |
|
Отображает только кнопку OK |
vbOKCancel |
1 |
|
Отображает кнопки ОК и Отмена |
vbAborCRetrylgnore |
2 |
|
Отображает кнопки Прервать, Повтор и Пропустить |
vbYesNoCancel |
3 |
|
Отображает кнопки Да, Нет и Отмена |
vbYesNo |
4 |
|
Отображает кнопки Да и Нет |
vbRetryCancel |
5 |
|
Отображает кнопки Повтор и Отмена |
vbCritical |
16 |
|
Отображает значок важного сообщения |
vbQuestion |
32 |
|
Отображает значок важного запроса |
vbExclamation |
48 |
|
Отображает значок предупреждающего сообщения |
vblnformation |
64 |
|
Отображает значок информационного сообщения |
vbDefaultButtonl |
0 |
|
По умолчанию выделена первая кнопка |
vbDefaultButton2 |
256 |
|
По умолчанию выделена вторая кнопка |
vbDefaultButton3 |
512 |
|
По умолчанию выделена третья кнопка |
vbDefaultButton4 |
768 |
|
По умолчанию выделена четвертая кнопка |
vbSystemModal |
4098 |
|
Все приложения приостанавливают свою работу до момента, по- |
|
|
|
ка пользователь ответит на запрос в окне сообщения (работает |
|
|
|
не во все>: случаях) |
Вы можете использовать функцию MsgBox в качестве процедуры {для отображения сообщения), а также присвоить возвращаемое этой функцией значение переменной. Функция MsgBox возвращает результат, который представляет кнопку, на которой щелкнул пользователь. Следующий пример отображает сообщение и не возвращает результат.
Sub MsgBoxDemo{)
MsgBox "Щелкните на кнопке ОК для продолжения" End Sub
Чтобы получить результат из окна сообщения, присвойте возвращаемое функцией MsgBox значение переменной. В следующем коде используется ряд встроенных констант (табл. 12.3), которые упрощают управление возвращаемыми функцией MsgBox значениями.
322 |
Глава 12. Создание собственных диалоговых окон |
Sub GetAnswer()
Ans = MsgBox("Продолжить ?", vbYesNo)
Select Case Ans
Case vbYes
•...[код в случае Ans равно Yes]...
|
Case vbNo |
1 |
...[код в случае Ans равно No]... |
End |
Select |
End Sub |
|
I Таблица 12.3. Константы, возвращаемые функцией MsgBox
Константа |
Значение |
Нажатая кнопка |
|||
|
|
|
|
|
|
vboK |
1 |
|
|
ОК |
|
vbCancel |
2 |
|
|
Отмена |
|
vbAbort |
3 |
|
|
Прервать |
|
vbRetry |
4 |
|
|
Повтор |
|
vblgnore |
S |
Пропустить |
|||
vbYea |
6 |
|
|
Да |
|
vbNo |
7 |
|
|
Нет |
|
|
|
|
|
|
|
Вам не обязательно использовать переменную для хранения результата выполнения функции MsgBox. Следующая процедура приводит к отображению окна сообщения с кнопками Да и Нет. Пока пользователь не щелкнет на кнопке Да, процедура будет продолжаться.
Sub GetAnswer2O |
|
|
|
|
If MsgBox("Продолжить?", |
vbYesNo) <> vbYes |
Then Exit Sub |
1 |
. . . [ к о д для случая, когда |
на кнопке Да не |
щелкнули]... |
End |
Sub |
|
|
Следующий пример функции использует комбинацию констант для отображения окна сообщения с кнопкой Да, кнопкой Нет и значком вопросительного знака. Вторая кнопка используется по умолчанию (рис. 12.4). Для простоты константы добавлены в переменную Config.
Private Function ContinueProcedure() As Boolean |
|
|
|||||
Dim Config As Integer |
|
|
|
|
|
||
Dim Ans As |
Integer |
|
|
|
|
|
|
Config = vbYesNo + vbQuestion + vbDefaultButton2 |
|
||||||
Ans = MsgBox("Произошла ошибка. Продолжить?", Config) |
|||||||
If Ans = vbYes Then ContinueProcedure = True _ |
|
|
|||||
|
Else ContinueProcedure = False |
|
|
|
|||
End Function |
|
|
|
|
|
|
|
Функция ContinueProcedure может вызываться из другой |
|
|
|||||
процедуры. Например, приведенный далее оператор вызывает функ- |
|
||||||
цию ContinueProcedure (которая отображает окно сообщения). |
|
|
|||||
Если функция возвращает значение ЛОЖЬ (т.е. пользователь щелк- |
|
||||||
нул на кнопке Нет), то процедура будет завершена. В противном |
|
|
|||||
случае выполняется следующий оператор: |
|
|
|
|
|||
If Not |
ContinueProcedure Then |
Exit |
Sub |
Рис. 12.4. Параметр Кно- |
|||
- |
- |
, |
|
|
|
пки функции MsgBox on- |
|
Если в сооощении необходимо указать разрыв строки, восполь- |
А |
ределяет кнопки, которые |
|||||
|
|
* |
, |
.г |
£ |
|
|
зуйтесь константой vbCrLf (или vbNewLine) в необходимом мес- |
|
отоараэ1са10тся в о т е со. |
|||||
те. Отобразим сообщение в три. строки: |
|
|
|
о&щения |
|||
ЧастьIV.Работаспользовательскимиформами |
|
|
323 |
Sub MultiLineO
Dim Msg As String
Msg = "Это первая строка" & vbCrLf Msg = Msg & "Вторая строка" & vbCrLf Msg = Msg & "Последняя строка" MsgBox Msg
End Sub
Вы также можете использовать в сообщении символ табуляции — для этого применяется константа vbTab. В приведенной далее процедуре окно сообщения используется для отображения диапазона значений размером 20x8 (рис. 12.5). В этом случае столбцы разделены с помощью константы vbTab. Новые строки вставляются с помощью константы vbCrLf. Функция MsgBox принимает в качестве параметра строку, длина которой не превышает 1023 символов. Такая длина задает ограничение на количество ячеек, которое можно отобразить в сообщении.
Sub ShowRange()
Dim Msg As String
Dim r As Integer, с As Integer
Msg = ""
For r = 1 To 2 0
For с = 1 To 8
Msg = Msg & Cells{r, c) & vbTab
Next с
Msg = Msg & vbCrLf
Next r
MsgBox Msg
End Sub
Глава 15 содержит пример кода VBA, который эмулирует поведение функции
MsgBox.
Еще один тип окна сообщения
Excel может получать доступ к Windows Scripting Host (Wscript) и отображать еще один тип окна сообщения. Эта операция реализуется благодаря методу Popup объекта shell . Последний тип окна сообщения отличается от стандартного: он автоматически закрывается по истечению определенного временного интервала, кроме того, он позволяет отображать окно сообщения без использования кнопок.
Следующий пример иллюстрирует подобное окно сообщения. Если пользователь не закроет его в течение пяти секунд, то окно закроется автоматически.
Sub PopupDemo()
Dim WshShell As IWshShell Dim Msg As String
Set WshShell = CreateObject("Wacript.Shell") Msg = "Это сообщение исчезнет через 5 секунд." Title = "Просто напоминание."
WshShell.Popup Msg, 5, Title, 7 + vblnformation Set WshShell - Nothing
End Sub
Первый оператор set создает объект Shell и присваивает его переменной WshShell. Первый аргумент метода Popup представляет отображаемый в окне текст. Второй аргумент указывает количество секунд, в течение которых диалоговое окно отображается на экране. Третий аргумент содержит текст, который представлен в заголовке окна. Последний аргумент задает список кнопок и значков, которые отображаются в окне (он работает так же, как и аргумент кнопки функции MsgBox).
324 |
Глава 1Z Создание собственных диалоговых окон |
Если у вас возникнет необходимость в использовании альтернативного окна сообщений, помните, что администраторы систем часто отключают поддержку Windows Scripting Host, так как он обеспечивает активный канал для проникновения в систему вирусов. Если поддержка Windows Scripting Host не включена, то генерируется сообщение об ошибке.
Рис. 12.5. Текствэтомокнесообщения содержит символы табуляции и разрывастрок
Метод Excel GetOpenFilename
Если приложению необходимо получить от пользователя имя файла, то можно воспользоваться функцией inputBox, но этот подход часто приводит к возникновению ошибок. Более надежным считается использование метода GetOpenFilename объекта A p p l i c a t i o n , который позволяет удостовериться, что приложение получило корректное имя файла (а также его полный путь).
Данный метод отображает нормальное диалоговое окно Открытие документа (которое отображается при выборе команды Файл^Открыть), но при этом указанный файл не открывается. Вместо этого метод возвращает строку, которая содержит путь и имя файла, выбранных пользователем. По окончании данного процесса с именем файла можно делать все, что угодно, Этот метод имеет следующий синтаксис (все параметры необязательные):
obj ect.GecOpenFilename(Фильтр_файла, Индекс_фильтра, Заголовок,
ПОДПИСЬ_КНОПКИ, Множественный_Вы5ор)
•Фш1ьтр_файла — содержит строку, определяющую критерий фильтрации файлов (необязательный параметр).
•Индекс_фильтра — указывает индексный номер того критерия фильтрации файлов, который используется по умолчанию (необязательный параметр).
•Заголовок— содержит заголовок диалогового окна (необязательный параметр), Если этот параметр не указать, то будет использован заголовок Открытие документа.
•ПОДПИСЬ_КНОПКИ— применяется только в компьютерах Macintosh.
•Множественным__выбор— необязательный параметр. Если он имеет значение ИСТИНА, можно выбрать несколько имен файлов. По умолчанию данный параметр имеет значение ЛОЖЬ.
Аргумент Фильтр_файла определяет содержимое выпадающего списка Тип файлов. Аргумент состоит из строки, определяющей отображаемое в диалоговом окне значение, а также строки действительной спецификации тина файлов, в которой находятся групповые символы. Оба элемента аргумента разделены запятыми. Если этот аргумент не указать, то будет использовано значение по умолчанию:
" Все файлы {*.*},*.*"
ЧастьIV. Работаспользовательскимиформами |
325 |
Обратите внимание на первую часть строки Все файлы {*.*). Это текст, отображаемый в выпадающем списке тип файлов. Вторая часть строки * . * указывает тип отображаемых файлов.
В следующих инструкциях переменной F i l t присваивается строковое значение. Эта строка впоследствии используется в качестве аргумента Фильтр_файла метода GetOpenFilename . В данном случае диалоговое окно предоставит пользователю возможность выбрать один из четырех различных типов файлов (кроме варианта Все файлы). Если задать значение переменной F i l t , то будет использоваться оператор конкатенации строки VBA. Этот способ упрощает управление громоздкими и сложными аргументами.
Filt = "Текстовые файлы (*.txt),*.txt,n & _ "Файлы печати!*.prn), *.prn," & _ "Разделенные запятой(*.csv),*.csv," & _ "ASCII (*.asc),*.asc," & _
"Все файлы(•.*),*•*"
Аргумент Индекс^фильтра указывает значение аргумента Фильтр_файла по умолчанию. Аргумент Заголовок определяет текст, который отображается в заголовке окна. Если параметр Множественный_выбор имеет значение ИСТИНА, то пользователь может выбрать
вокне несколько файлов, имя каждого из которых заносится в массив.
Вследующем примере у пользователя запрашивается имя файла. При этом в поле типа файлов используется пять фильтров.
Sub GetImportFileName{)
Dim Filt As String
Dim Filterlndex As Integer
Dim FileName As Variant
Dim Title As String
1Настройка списка фильтров
Filt = "Текстовые файлы (*.txt),*.txt," & _ "Файлы печати {*.prn},*.prn," & _ "Разделенные запятой (*.csv),*.csv," & _ "ASCII (*.asc),*.asc,• & _
"Все файлы {*.*),*.*"
1По умолчанию используется фильтр *.* Filterlndex = 5
'Заголовок окна
Title = "Выберите импортируемый файл"
|
Получение имени файла |
|
FileName = Application.GetOpenFilename _ |
|
(FileFilter:=Filt, _ |
|
Filterlndex:=FiltzerIndex, _ |
|
TiCle:=Title) |
1 |
При отмене выйти иэ окна |
|
If FileName = False Then |
|
MsgBox "Файл не выбран." |
|
Exit Sub |
|
End If |
1 |
Отображение полного имени и пути |
|
MsgBox "Вы выбрали " & FileName |
End |
Sub |
На рис. 12.6 показано диалоговое окно, которое выводится на экран при выполнении этой
процедуры. |
|
326 |
Глава 12. Создание собственныхдиалоговых окон |
Рис. 12.6. Метод GetOpenFilename отображает пользовательскоедиалоговоеокно
Приведенный далее пример напоминает предыдущий. Разница заключается в том, что пользователь может, удерживая клавиши <Shift> или <Ctrl>, выбрать в окне несколько файлов. Обратите внимание, что событие использования кнопки Отмена определяется по наличию переменной массива FileName. Если пользователь не щелкал на кнопке Отмена, то результирующий массив будет состоять как минимум из одного элемента. В этом примере список выбранных файлов отображается в окне сообщения.
Sub GetImportFileName2()
Dim Filt As String
Dim Filterlndex As Integer
Dim FileName As Variant
Dim Title As String
Dim i As Integer
Dim Msg As String
1Настройка фильтров файлов
Filt = "Текстовые файлы {*.txt),*.txt," & _ "Файлы печати (*.prn),*.prn," & _ "Разделенные запятой (*.csv),*.csv," & _ "ASCII (*.asc),*.asc," &_
"Все файлы (*.*),*.*"
1По умолчанию используется фильтр *.* Filterlndex = 5
1Заголовок окна
Title = "Выберите импортируемый файл"
1Получение имени файла
FileName = Application.GetOpenFilename _ (FileFilter:=Filt, _ Filterlndex:=FilterIndex, _ Title:=Title, _
MultiSelect:=True)
1Закрытие окна при использовании кнопки Отмена If Not IsArray(FileName) Then
MsgBox "Файл не выбран."
Exit Sub
End If
Часть IV. Работа с пользовательскими формами |
.127 |
' |
Отображение полного имени и пути |
|
|
For i = LBound(FileName) To UBound(FileName) |
t |
|
Msg = Msg & FileName(i) & vbCrLf |
|
|
Next i |
|
|
MsgBox "Вы выбрали:" & vbCrLf & Msg |
|
End |
Sub |
|
Обратите внимание, что переменная FileName определена как массив переменного типа (а не как строка в предыдущем примере). Причина заключается в том, что потенциально F i I eName может содержать массив значении, а не только одну строку.
Метод Excel GetSaveAsFilename
Данный метод имеет много общего с методом G e t O p e n F i l e n a m e . Он отображает диалоговое окно Сохранение документа и позволяет пользователю выбрать (или указать) имя сохраняемого файла. В результате возвращается имя файла, но никакие действия не предпринимаются.
Этот метод имеет следующий синтаксис:
object.GetSaveAsFilename(Начальиое_Имя, Фмлътр_файла, Индекс^фильтра, Заголовок, Текст^кнопки)
•Начальное_Ммя— указывает предполагаемое имя файла (необязательный параметр).
•Фильтр_файла — содержит критерии фильтрации отображаемых в окне файлов (необязательный параметр).
•Индекс_фильтра — код критерия фильтрации файлов, который используется по умолчанию (необязательный параметр).
•Заголовок—определяет текст заголовка диалогового окна (необязательный параметр).
•Текст_кнопки — предназначен только для платформ Macintosh.
Получение имени папки
Если необходимо получить имя файла, то самым простым решением будет использование метода GetOpenFilename, как было показано выше. Но если необходимо получить имя папки, то ваши действия будут полностью зависеть от используемой версии Excel.
В настоящем разделе рассматривается два способа получения имени папки. Первый метод более сложен, но выполняется в Excel 97 и поздних версиях. Второй метод намного проще, но используется только в Excel 2002.
Использование функций Windows API для получения имени папки
В данном разделе рассматривается функция G e t D i r e c t o r y , которая отображает диалоговое окно, показанное на рис. 12.7. Эта функция возвращает строку, представляющую имя выбранной пользователем папки. Если пользователь щелкнет на кнопке Отмена, то функция возвратит пустую строку. Этот метод поддерживается в Excel 97 и более поздних версиях.
Функция G e t D i r e c t o r y принимает один необязательный строковый аргумент, который отображается в диалоговом окне. Если аргумент не указать, то вместо него диалоговое окно будет содержать сообщение Выберите папку.
328 |
Глава 12. Создание собственныхдиалоговых окон |