Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Использованиеокнавводаданных

Окно ввода данных — это простое диалоговое окно, которое позволяет пользователю ввести единственное значение. Например, можно применить окно ввода данных, чтобы предоставить пользователю возможность ввести текст, числа или даже диапазон значений. Для создания окна ввода используются две функции 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. Создание собственных диалоговых окон

Метод Excel I n p u t B o x является достаточно гибким. Использование суммы приведенных выше значений позволяет" возвратить несколько типов данных. Например, для отображения окна ввода, которое принимает текстовый или числовой тип данных, установите код в значение 3 (т.е. 1+2 или "число"+"текст"). Если в качестве кода типа применить значение 8, то пользователь сможет ввести в поле адрес ячейки или диапазона ячеек. Кроме того, пользователь имеет возможность указать диапазон на текущем рабочем листе.

Процедура EraseRange, которая приведена ниже, использует метод InputBox . Таким образом, пользователь может указать удаляемый диапазон (рис. 12.2). Адрес диапазона вводится вручную, мышь необходима для выделения диапазона на листе.

Метод I n p u t B o x с кодом 8 возвращает объект Range (обратите внимание на ключевое слово Set) . После этого выбранный диапазон очищается (с помощью метода C l e a r ) . По умолчанию в поле окна ввода отображается адрес текущей выделенной ячейки. Если в окне ввода щелкнуть на кнопке Отмена, то оператор On E r r o r завершит процедуру.

Sub EraseRange()

Dim UserRange As Range DefaultRange = Selection.Address On Error GoTo Canceled

Set UserRange = Application.InputBox _ (Prompt:="Удаляемый диапазон:", _ Title:="Удаление диапазона", _ Default:=DefaultRange, _

Type:-8)

UserRange.Clear

UserRange.Select

Canceled:

End Sub

Еще одним преимуществом применения метода Excel I n p u t B o x является автоматическая проверка правильности введенных данных программой Excel. Если в примере GetRange ввести данные, не представляющие диапазон адресов, то Excel отобразит специальное сообщение и предоставит пользователю возможность повторить ввод данных (рис. 12.3).

Рис. 12.2. Испо.чьювание метода InputBox для выделенияиудалениядиапазона

Рис. !2.3. Метод Excel InputBox производит автоматическуюпроверкуправильностивведенныхданных

Функция VBA MsgBox

Функция VBA MsgBox представляет пользователю простой способ отображения сообщения. Также эта функция задает ответную реакцию пользователя на запрос (передает результат щелчка на кнопке ОК или Отмена). Функция MsgBox применяется во многих примерах настоящей книги в качестве способа отображения значений переменных.

Ниже приведен синтаксис функции MsgBox.

 

MsgBox {За прос [, КНОПКИ] [, Заголовок] [, Справка,

Раздел])

Часть IV. Работа с пользовательскими формами

321

Запрос — определяет текст, который будет отображаться в окне сообщения (обязательный параметр).

Кнопки— содержит числовое выражение, которые определяет кнопки, отображаемые в окне сообщения (необязательный параметр). Возможные значения приводятся в табл. 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. Создание собственныхдиалоговых окон

Соседние файлы в папке 2 семестр