Введение в Visual Basic For Applications
Введение в Visual Basic For Applications
Если вы хорошо знакомы с программным продуктом Excel, то можно быть уверенным в том, что составление любого документа в Excel теперь не вызовет проблем. Ни одна задача не сможет поставить вас в тупик. Однако, если вы стремитесь к совершенству, то Visual Basic For Applications (VBA) – это то, что вам нужно.
Visual Basic For Applications – это сочетание одного из самых простых языков программирования и всех вычислительных возможностей Excel. С помощью VBA вы сможете легко и быстро создавать разнообразные приложения, даже не являясь специалистом в области программирования. VBA содержит графическую среду, позволяющую наглядно конструировать экранные формы и управляющие элементы. VBA позволяет с легкостью решать многие задачи, о возможности выполнения которых средствами Excel вы раньше даже не подозревали.
Создание макроса для Microsoft Excel/Visual Basic for Windows 95
Чтобы автоматизировать повторяющиеся действия, можно создать макрос.
1. В меню Сервисвыберите пункт Запись макроса, затем команду Начать запись.
2. Чтобы присвоить название макросу, отличное от предлагаемого в Microsoft Excel по умолчанию, наберите требуемую последовательность символов в поле “Имя макроса”.
3. Чтобы создать краткое описание макроса, введите нужный текст в поле “Описание”.
4. Чтобы задать дополнительные характеристики макроса, нажмите кнопку “Параметры”, затем установите необходимые значения предлагаемых элементов управления.
5. Нажмите кнопку “OK”.
6. Выполните записываемые действия.
7. Прекратите запись макроса^ Сервис- макрос- Закончить запись
Вывод исходного текста записанного макроса.
Исходный текст макроса на языке программирования Visual Basic находится в отдельном модуле книги.
1. В меню Сервисвыберите команду Макрос.
2. Введите в поле “Имя макроса/ссылка” название макроса.
3. Нажмите кнопку “Изменить”.
Процедуры (макросы) имеют стандартное оформление:
Sub имя_процедуры (список_параметров)
Тело_процедуры
End Sub
Например, процедура Сигналиспользует оператор Beep для синтеза звукового сигнала:
Sub Сигнал
Beep
End Sub
Использование относительных ссылок при записи макроса.
По умолчанию, при записи макроса используются абсолютные ссылки, например, $A$1. Макрос, записанный с абсолютными ссылками, при запуске всегда обрабатывает те же ячейки, которые обрабатывались при его записи.
Для того, чтобы с помощью макроса обрабатывать произвольные ячейки, следует записать его с относительными ссылками. Макрос, записанный с относительными ссылками, при запуске использует адреса, вычисленные относительно левой верхней ячейки текущей области. В меню Сервисвыберите пункт Запись макроса, затем команду Относительные ссылки. Относительные ссылки будут использоваться до конца текущего сеанса работы в Microsoft Excel или до повторного выбора команды Относительные ссылки.
Советы.
1. Перед началом записи макроса откройте необходимую книгу, выберите нужный лист и выделите требуемые ячейки или объекты.
2. Чтобы получить доступ к кнопке “Начать запись макроса”, выведите на экран панель инструментов “Visual Basic”.
3. Чтобы назначить клавиши для запуска макроса, нажмите кнопку “Параметры” в окне диалога Запись макроса. Назначенная комбинация может состоять из клавиши CTRL или клавиш CTRL+SHIFT и клавиши любого символа. Помните, что сделанные назначения клавиш перекрывают стандартные назначения в Microsoft Excel пока открыта книга, в которой записаны данные макросы.
Модуль Visual Basic можно переименовать. Установите указатель на ярлычок модуля и дважды нажмите кнопку мыши.
Типы данных
Переменные и типы данных определяют, где и как данные хранятся в памяти компьютера. В языке со строгим контролем типов вы обязаны указывать тип каждой переменной перед ее использованием. Хотя Visual Basic не является языком со строгим контролем типов, он предоставляет возможность управлять использование памяти вашего компьютера более эффективно, задавая в явном виде типы всех ваших переменных.
Определяя тип данных для величины, тем самым определяется соотношение между разрядностью, размером и используемой памятью.
Встроенные типы данных
В Visual Basic имеется одиннадцать встроенных типов данных, представленных в табл. 1.
Таблица 1.
Встроенные типы данных Visual Basic
Тип данных | Размер (байтов) | Разрядность (цифр) | Диапазон |
Boolean | True или False | ||
Integer | от -32768 до 32767 | ||
Long | от -2147483648 до 2147483647 | ||
Single | от -3,402823Е+38 до -1,401298Е-45 и от 1,401298Е-45 до 3,402823Е+38 | ||
Double | от -1,79769313486232Е+308 до -4,94065645841247Е-324 и от 4,94065645841247Е-324 до 1,79769313486232Е+308 | ||
Currency | от -922337203685477,5808 до 922337203685477,5807 | ||
Date | от 01.01.100 до 31.12.9999 | ||
String | 1+1 на символ | от 0 до 65535 символов | |
Object | Любой определенный объект | ||
Array | Определяется размером | количеством и элементов | |
Variant | Определяется данными | записанными | Любой встроенный тип данных |
Тип данных Booleanиспользует два байта (16 бит) памяти. Этот тип данных имеет только два возможных значения: True (истина) или False (ложь), которые могли бы быть представленными одним битом, но в действительности тип Boolean хранится как Integer ("0"- False, "-1" - True).
Тип данныхIntegerиспользует два байта памяти для хранения смещенного целого числа. Целое число без знака может принимать только положительное значение, а смещенное целое число может принимать как положительное, так и отрицательное значение.
Тип данных Long- это целое число двойной длины, которое использует четыре байта, имеет двойное разрешение по сравнению с данными типа Integer и использует в два раза больше памяти.
Тип данныхSingle представляет собой действительное число с плавающей точкой. Использовать этот тип данных нужно осторожно, особенно при вычислении денежных величин, так как он имеет только семь цифр разрешения. Если вы использовали два из этих разрядов для центов, оставляя таким образом только пять для долларов, то максимальное значение будет $34,028.23. При попытке записать число больше, чем это, произойдет ошибка переполнения.
Тип данныхDouble - этоSingle двойного размера, с двойной разрешающей способностью, требующий вдвое больше памяти, и в восемь раз большим диапазоном чисел.
Тип данныхCurrency- это специальное восьмибайтное число, в котором десятичная точка всегда располагается между четвертой и пятой цифрами справа. Этот тип специально создан для минимальных ошибок округления. При использовании типов данных с плавающей точкой ошибка округления может привести к получению величины, равной 4,999 999 999 вместо 5,0. Иногда эта разница бывает существенна.
Тип Dateпредназначен для хранения дат и времени в восьми байтах памяти. Даты записываются в виде целых чисел дней от 01.01.1900, а время - как дробная часть дня. Таким образом, значение 34398.75 в формате Date означает 5 марта 1994 года и время 18:00. Используя этот тип данных имейте в виду, что хотя диапазон Visual Basic расширен от 01.01.100 до 31.12.9999, диапазон Excel - всего лишь от 01.01.1900 до 31.12.2078.
Тип данных Stringиспользуется для хранения строк текста по одному байту памяти на каждый символ плюс один, чтобы отметить конец строки.
Тип данных Object использует четыре байта памяти для хранения ссылки на любой объект Visual Basic.
Тип данных Arrayв действительности не является отдельным типом данных. Он скорее определяет индексный список величин одного из других типов данных, т.е. массив.
Тип данных Variant используется в Visual Basic как тип данных по умолчанию, т.е. если тип данных для хранения величины не указан, то используется тип данных Variant. Variant имеет возможность хранить практически любую величину и бывает полезен для коротких, простых программ.
Переменные и их объявление
Переменные - это поименованные области в памяти компьютера. После вычисления какого-либо значения его нужно записать в память, чтобы затем можно было к нему обращаться. Использование переменных дает Visual Basic возможность создавать прямое соответствие между областью памяти и заданным именем.
Математические функции
Функция | Описание |
Atn | Возвращает арктангенс числа |
Sin | Возвращает синус угла в радианах |
Cos | Возвращает косинус угла в радианах |
Tan | Возвращает тангенс угла в радианах |
Exp | Возвращает е^х |
Log | Возвращает натуральный логарифм числа (основание е=2.71828…) |
Sqr | Возвращает квадратный корень числа |
Randomize | Инициирует генератор случайных чисел |
Rnd | Возвращает случайное число |
Abs | Возвращает абсолютную величину числа |
Sgn | Возвращает знак числа |
Fix | Округляет число отсечением дробной части |
Int | Округляет число до ближайшего меньшего целого |
Математические функции, приведенные в таблице, обычно требуют в качестве аргумента единичное значение, некоторым образом его трансформируют и возвращают также одно число. Тригонометрические функции Sin ( ), Cos ( ), Tan ( ) применяются к углам в радианах и преобразовывают их в соответствующую тригонометрическую величину.
Строковые функции
Функция | Описание |
StrComp | Сравнивает две строки |
LCase | Преобразовывает строку в нижний регистр |
UCase | Преобразовывает строку в верхний регистр |
Space | Создает строку пробелов |
String | Создает строку символов |
Len | Определяет длину строки |
Instr | Ищет подстроку |
Lset | Выравнивает строку по левому краю |
Rset | Выравнивает строку по правому краю |
Str | Преобразовывает число в строку |
Val | Преобразовывает строку в число |
Пример:
В= «ЯнвФевМарАпрМайИюнИюлАвгСенОктНояДек»
Lсase, после преобразований:
B = «янвфевмарапрмайиюниюлавгсеноктноядек»
Uсase, после преобразований:
B = «янвфевмарапрмайиюниюлавгсеноктноядек»
Len (B), после вычислений B = 36
instr (B,"Июл"), после выполнения функции: B = 19
Операторы
Оператор присваивания
Оператор присваивания - это основа всех вычислений в VBA, так как любая рассчитанная величина должна стать переменной, чтобы ее можно было хранить. Знак «=» является оператором присваивания, который предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, идентификатор которой расположен в левой части. В правой части располагается выражение в виде формулы, в качестве которой может выступать отдельная величина или выражение, состоящее из переменных, констант, операций и функций. Переменная, располагающаяся слева, может быть простой переменной, элементом массива или свойством объекта.
Примеры операторов присваивания:
Filename = " c:\vba\exampl.xls"
Sales = Units * Prise
Profit = Sales - Cost
Coords (3,2) = 19.37
Selection.Values = 25
Rang("B1") . Formula = "=B4*B3-1"
ActiveCell.FormulaR1C1 = "Таблица погашения ссуды"
ActiveWindow . ScrollRow = 1
Первые три оператора присваивают значениям переменным, четвертый присваивает значение элементу массива, а все остальные присваивают значения свойствам.
Таким способом нельзя присвоить значения только объектам - они требуют специального оператора присваивания. Например, приведенная ниже процедура создает объектную переменную, присваивает ей объект Rang, ссылающийся на ячейку В5, и затем использует эту объектную переменную для присваивания значений ячейке:
Sub ObjVar ()
dim theRang as Object
Set theRang = ActiveSheet.Range(‘B5’)
theRang.Value = 10
EndSub
Исключением является оператор присваивания « : = ». В отличие от ранее описанного оператора присваивания «=», он применяется только по отношению к параметрам процедуры.
Sub Assistant (a, b)
c = a + b
Msgbox Cstr (c)
End Sub
Sub Main( )
Assistant a:= 1, b:= 3
End Sub
В данном примере при вызове процедуры Assistant передача параметров осуществляется присвоением значений именам параметров с помощью оператора присваивания «:=». При выполнении данной процедуры переменной С присваивается значение суммы переданных параметров с использованием оператора присваивания «=».
End If
В условном операторе допустимо использование как блока операторов, так и любого из операторов. В операторе условия Опреатор_1 или Блок_операторов_1 выполняется если <условие> истинно, в противном случае выполняется Оператор_2 или Блок_операторов_2.
Условие - это выражение логического типа. Результат выражения всегда имеет булевский тип. Выражение может быть простым и сложным. При записи простых условий могут использоваться все возможные операции отношения, указанные в таблице 1.
Таблица 1. Логическое отношение.
Операция | Название | Выражение | Результат |
= | равно | А = В | True, если А равно В |
<> | не равно | A<>B | True, если А не равно В |
> | больше | A>B | True, если А больше В |
< | меньше | A<B | True, если А меньше В |
>= | больше или равно | A>=B | True, если А больше или равно В |
<= | меньше или равно | A<=B | True, если А меньше или равно В |
Сложные условия образуются из простых путем применения логических операций и круглых скобок. Список логических операций приведен в таблице 2.
Ветвь Else в условном операторе является необязательной. Таким образом, возможен следующий синтаксис оператора условия:
If <условие> Then <оператор или блок_операторов>
End If
Заметим, что в операторе условия после Then можно разместить блок операторов, для того, чтобы все они выполнялись, если условие истинно. В этом случае они должны располагаться в одну строчку и быть разделены двоеточием. Например,
If A>10 Then A=A+1 : B =B+A : C=C+B
End If
Рассмотрим пример функции пользователя с использованием оператора условного перехода If-Then-Else.
Function G(y)
If y<=0 Then G = (1+y^2)/(1+y^4)^(1/2)_
Else G = 2*y +sin (y)^2/(2+y)
End If
End Function
вычисляющей следующую функцию с двумя условиями:
Заметим, что знак подчеркивания «_» в конце строки обозначает, что следующая строка является продолжением предыдущей.
Пусть в ячейку А1 записано число 0,2 и вам нужно вычислить в ячейке В1 значение функции G при У=0,2. Для этого достаточно в ячейку В1 ввести формулу = G(А1). Тот же результат можно получить, если ввести в ячейку В1 следующую формулу
= если (А<=0*; (1+А1^2)/(1+A1^4)^(1/2); 2*A1+sin(A1)^2/(2+a1))
В условном операторе может проверяться несколько условий. В этом случае условный оператор имеет вид:
If <условие_1> Then <Блок_операторов_1>
Else If <условие_2> Then <блок_операторов_2>
Else If <условие_3> Then ...
else <блок_операторов>
End If
В данном условном операторе выполняется блок_операторов_i, если истинно условие_i, в противном случае выполняется блок_операторов.
Оператор выбора Select Case
Оператор выбора Select Case удобно использовать, когда одна величина участвует во многих сравнениях для выбора одного из блоков кода. Наиболее часто используется, когда сравниваемая величина является целым числом - селектором или индексом. Значение селектора или индекса выбирает тот блок кода, который будет выполняться.
Синтаксис:
Select Case <тестируемое _выражение>
Case <условие_выбора_1>
<блок_операторов_1>
... ... ...
Case <условие_выбора_n>
<блок_операторов_n>
Case Else
<блок_операторов_n>
End Select
После каждого оператора Case может находиться произвольное количество других операторов, и все они будут выполняться, если условие оператора Case истинно. При использовании одного оператора его можно поместить а одну строку с операторами Case.
Так же как и в блочной структуре IF, можно использовать специальный оператор Case, определяющий любые величины, которые не совпадают ни с одним из других операторов Case. Для этого условие Case Else включается последним блоком перед оператором End Select. Все величины, не совпавшие ни с одним оператором Case, совпадут с оператором Case Else.
Is является ключевым словом VBA, обозначающим тестируемое выражение в операторе Case. В операторе Case допустимы составные условия, например
Case 4,7 to 8, Is >=16
Проверяет, принадлежит ли тестируемое выражение отрезку от 7 до 8 или равняется значению 4, или оно не меньше, чем 16.
Пример перевода числового значения дня недели в строковое представление.
Sub perevod()
x = Sheets("Лист1").Range("e30").Value
Select Case x
Case 1
Sheets("Лист1").Range("e31").Value = "Понедельник"
Case 2
Sheets("Лист1").Range("e31").Value = "Вторник"
Case 3
Sheets("Лист1").Range("e31").Value = "Среда"
Case 4
Sheets("Лист1").Range("e31").Value = "Четверг"
Case 5
Sheets("Лист1").Range("e31").Value = "Пятница"
Case 6
Sheets("Лист1").Range("e31").Value = "Суббота"
Case 7
Sheets("Лист1").Range("e31").Value = "Воскресенье"
Case Else 'is<=0, is>7
Sheets("Лист1").Range("e31").Value = "Не день недели"
End Select
End Sub
Циклы
Для сокращения размера кода, который необходимо написать для решения задачи используют повторяемые структуры известные под общим названием как циклы. Циклы бывают трёх типов:
Вычисляемые
Логически прерываемые
Объектного типа
Вычисляемый цикл предназначен для повторения одного блока кода заданное количество раз. Вычисляемые циклы применяются в тех случаях, когда заранее известно, сколько раз нужно выполнить блок кода. Например, если требуется форматировать десять последовательных ячеек таблицы, то можно применить вычисляемый цикл, позволяющий поочерёдно изменить формат каждой из ячеек.
Рассмотрим два вычисляемых цикла: For .. Next и For Each .. Next. Вычисляемые циклы разделяются Visual Basic с помощью циклической структуры For-Next и For Each-Next.
Цикл For… Next
For переменная_цикла = начало To конец Step шаг
.
. блок кода
.
Exit For
.
. блок кода
.
Next переменная _цикла
В данном случае переменная_цикла является именем переменной, которая считает количество шагов цикла. Переменные начало и конец определяют начальное и конечное значение переменная_цикла, а шаг – величину наращивания переменная_цикла после каждого выполнения цикла.
Когда в программе встречается цикл For-Next, переменная_цикла получает значение начало, затем выполняется блок кода вплоть до оператора Next. Далее переменная_цикла увеличивается на величину шаг и сравнивается со значением конец. Если значение переменная_цикла больше, чем значение конец, то цикл прерывается и управление переходит к оператору, следующему за оператором Next. Если значение переменная_цикла меньше или равно значению конец, то блок кода цикла выполняется ещё раз. Так продолжается до тех пор, пока значение переменная_цикла не станет больше значения конец.
Когда встречается оператор Exit For, цикл немедленно прерывается и управление переходит к оператору, следующему за оператором Next. Обычно оператор Exit For применяется для прекращения процесса поиска чего-нибудь, когда вы искали это циклически и нашли.
Если зарезервированное слово Step и величина шаг опущены, то величина переменная_цикла наращивается на 1 после каждого шага цикла. Если величина конец меньше величины начало и величина шаг отрицательна, цикл считается по убывающей, а не по возрастающей.
Использование счётчика цикла
Счётчик цикла - это обычная переменная, доступная в любом месте цикла и используемая в блоке его кода для выбора различных величин или ячеек. Счётчиком цикла обычно является целое число, используемое в качестве индекса массива переменных или в качестве аргумента метода Cells для выбора ячейки таблицы.
После завершения цикла значение счётчика больше значения конец (или меньше значения конец, если цикл считался по убывающей). Этот фактор удобно использовать, чтобы определить, завершился ли цикл нормально или был преждевременно прерван оператором Exit For.
Особенность:
Поскольку переменная цикла является обычной переменной, то её можно изменить в любом месте блока кода цикла. Однако изменений переменной цикла необходимо избегать: такие изменения легко могут привести к непредсказуемым результатам.
Например, следующая конструкция будет выполняться всегда:
Sub Beep
For I = 1 To 10
I = I-1
Beep
Next I
End Sub
В качестве примера рассмотрим процедуру, которая заполняет текущий выбор случайными числами, применяя два встроенных цикла For-Next для области ячеек в текущем выборе. Эту процедуру можно использовать и в целях подготовки некоторых ячеек для различных вычислений либо для заполнения области ячеек различными вычисляемыми значениями, полученными с помощью различных функций или формул – в зависимости от ваших потребностей.
Dim numRows As Integer, numCols As Integer
Dim theRow As Integer, theCol As Integer
Sub StikRandom ()
‘Определение размера текущего выбора.
numRows = Selection.Rows.Count
numCols = Selection.Columns.Count
Randomize ‘Инициализация генератора случайных чисел.
For theRow = 1 To numRows
For theCol = 1 To numCols
Selection.Cells (theRow, theCol).Value = Rnd
Next theCol
Next theRow
End Sub
Цикл For Each…Next
Данный вид цикла называется объектным и предназначен для обработки элементов в выделенном наборе. Циклы объектного типа реализуются структурой For Each...Next. Процесс выполнения данного цикла аналогичен циклу For…Next. Однако, в качестве переменной цикла используется не счётчик, определяющий количество повторов, а объект из выделенного набора. В качестве набора может быть использована как область ячеек, так и массив.
For Each <элемент> in <набор>
<Тело цикла>
Next <элемент>, где
<элемент> и <набор> являются переменными типа Variant.
В этом синтаксисе элемент представляет собой переменную типа Variant, что обеспечивает возможность содержать объект. Переменная набор является некоторым набором объектов. В процессе выполнения цикла объект выбирается из набора и помещается в переменную элемент, и это позволяет использовать переменную элемент в блоке кода цикла для осуществления необходимых действий с объектом. Аналогично циклу For...Next оператор Exit For прерывает цикл до его окончания.
C использованием цикла For Each - Next, рассмотрим пример заполнения области случайным набором действительных чисел.
Dim c
Sub Oblast
For Each C in Selection
C.Value=RND * 10
Next C
End Sub
При условии заполненной некоторыми значениями области, в качестве примера рассмотрим процедуру, которая циклически обрабатывает содержимое этих ячеек, копирует эти значения в массив, определят среднее арифметическое элементов массива и отражает это значение в окне сообщения.
Dim c
Dim s As Long
Dim Mas( ) as integer
Dim nrow as integer
Dim ncolumn as integer
Sub Массив
Nrow=Selection.Rows.Count
Ncolumn=Selection.Columns.Count
ReDim Mas (nrow,ncolumn)
‘заполнение массива соответствующими элементами
For i=1 to nrow
For j=1 to ncolumn
Mas (i,j)=cells(i,j).Value
Next j
Next i
‘вычислим сумму элементов набора-массив
S=0
For Each C in Mas
S=S+C
Next C
MsgBox “Сумма=” & S
‘вывод результата суммы на экран в виде окна
End Sub
цикл Do - Loop.
Цикл Do - Loop является наиболее универсальным из логически прерываемых циклов. существуют четыре конфигурации этого цикла: условие True в начале, условие True в конце, условие False в начале и условие False в конце. Ниже приведен синтаксис всех четырех конфигураций:
|
’ Условие True в начале.
’
Do While условие
...блок кода
Exit Do
...блок кода
Loop
’
|
’
Do
...блок кода
Exit Do
...блок кода
Loop While условие.
’
’
Цикл While и Until.
Зарезервированные слова While и Until определяют логику условия, причем While указывает, что цикл будет выполняться до тех пор, пока условие принимает значение True, а Until указывает, что цикл будет выполняться до тех пор, пока условие не станет True. Отношение между While и Until можно выразить следующим образом:
While условие = Until Not условие
Применение оператора Exit Do.
Оператор Exit Do предназначен для преждевременного прекращения цикла и обычно применяется в логической структуре (вроде оператора If), которая проверяет альтернативное условие прерывания цикла, например ошибку.
Запись условия в начале цикла.
Запись условия в начале или в конце цикла определяет, где это условие будет определяться. Когда условие определяется в начале цикла, цикл выполняется (или не выполняется), если условие исходно удовлетворено. Такой вид цикла удобно применять в тех случаях, когда когда цикл не должен выполняться до тех пор, пока условие не будет выполнено.
Например, при чтении дискового файла можно использовать функцию EOF() для проверки очередной части файла в поисках маркера его конца. Если вы попытаетесь прочесть маркер конца файла, ваша программа остановится с ошибкой; таким образом, перед тем, как прочесть из файла какие либо данные, необходимо проверять очередную часть файла в поисках маркера конца файла. Чтобы сделать это, можно использовать нечто подобное
Open “Myfile.txt” For Input As #1 ’ Открытие файла.
Do Until EOF(1) ’ Проверка на конец файла.
Input #1, A$ ’ Если нет, то чтение данных.
.
. ’ Код преобразования величины A$
.
Loop
Close #1 ’ Закрытие файла по концу работы.
В этом фрагменте кода функция EOF() проверяет маркер конца файла. Если вы еще не дошли до конца файла, функция EOF() возвратит False и цикл выполниться, прочитав из файла строку и обработав ее. Если функция EOF() обнаружит маркер конца файла, то она возвратит True и цикл прервется.
Запись условия в конце цикла.
Запись условия в конце цикла означает, что цикл выполнится хотя бы один раз. Этот вид цикла применяеися в тех случаях, когда когда цикл должен быть выполнен хотя бы один раз, чтобы сформировать условие, которое затем будет проверятьсяю. Он используется в основном для поиска, например, конкретного значения в массиве.
Так, следующая процедура находит в массиве первый положительный элемент:
’ Поиск первого положительного элемента массива.
’
Function FirstPos(theArray) As Single
Dim J As Integer, Value As Single
J = LBound(theArray) -1 ’Инициализация J
Do ’Начало цикла
J = J + 1 ’Наращивание J
Value = theArray(J) ’Выбор элемента массива
Loop Until Value > 0 ’Проверка элемента
FirstPos = Value
End Function
В этой процедуре theArray является переменной типа Variant, и следовательно, позволяет передать из таблицы массив. Функция Lbound() возвращает нижний предел индекса массива. Переменная J устанавливается не единицу меньше этого предела, так как в начале цикла она будет увеличена на 1, что и даст значение нижнего предела индекса массива. Цикл начинается оператором Do, затем наращивается переменная J и из массива выделяется элемент с соответствующим индексом. В конце цикла этот элемент проверяется, и если он положительный, то цикл прерывается, причем переменная Value равна положительному элементу массива, а переменная J - индексу этого элемента массива.
Такая процедура предполагает, что один из элементов массива будет иметь положительное значение. Если это точно неизвестно, то необходимо проверять значение переменной J и прерывать цикл, когда J превысит верхний предел индекса массива. Иначе вы получите ошибку выполнения 9 «Subscript out of range». Что бы проверить переменную J, процедуру нужно модифицировать следующим образом:
’
’ Поиск первого положительного элемента массива
’
Function FirstPos2(theArray) As Single
Dim J As Integer, Value As Single
J = LBound(theArray) -1 ’Инициализация J
Do ’Начало цикла
J = J + 1 ’Наращивание J
If J > UBound (theArraay) Then ’Превышение верхнего предела?
Value = CVFrr (xlErrValue) ’Установка кода ошибки, если нет ни одного положительного элемента
Exit Do ’Прерывание цикла
End If
Value = theArray(J) ’Выбор элемента массива
Loop Until Value > 0 ’Проверка элемента
FirstPos2 = Value
End Function
В этой версии процедуры значение переменной J после каждого наращивания сравнивается с верхним пределом индекса массива, полученном с помощью функции UBond(). Если переменная J превысит верхний предел, то переменной Value будет присвоен код ошибки #VALUE!, чтобы показать, что ни один элемент массива не соответствует заданному условию. В этом случае цикл будет прерван оператором Exit Do. Обратите внимание на то, что теперь функция возвращает значение типа Variant, - это позволяет передать код ошибки.
Диалоговые окона
Встроенные диалоговые окона
Передача данных программе и получение данных от программы зачастую представляет собой непростую задачу. В зависимости от конкретного применения программы создается код, реализующий пользовательский интерфейс, и эта часть программы является едва ли не самой важной. В профессионально разработанных программах объем кода, реализующего пользовательский интерфейс, занимает около 90 % общего объема кода, и только 10 % используется для обработки данных. Анализируя Excel или любую другую коммерческую программу, вы легко убедитесь в справедливости этого утверждения.
Visual Basic представляет возможность применять диалоговые окна для получения данных от пользователя и для передачи ему информации. Кроме собственных встроенных диалоговых окон, Visual Basic может использовать все диалоговые окна Excel или Project.
Выделяют следующие виды окон:
· Встроенные диалоговые окна сообщений;
· Встроенные диалоговые окна ввода данных;
· Диалоговые окна Excel.
Применение функции MsgBox()
Функция MsgBox() обеспечивает создание диалогового окна, подобного простому окну сообщения. Если окно сообщения всего лишь отображает сообщение для пользователя. то диалоговое окно требует от пользователя некоторых действий по вводу данных. Оно отображает строку текста, а затем ожидает, пока пользователь нажмет командную кнопку (их возможное число не ограничено).
Таблица 2
Код | Константа | Командная кнопка |
vbOk | OK | |
vbCancel | Cancel | |
vbAbort | Abort | |
vbRetry | Retry | |
vbIgnore | Ignore | |
vbYes | Yes | |
vbNo | No |
Применение функции InputBox
Эта функция создает диалоговое окно другого типа. Базовое окно ввода содержит окно редактирования, командную кнопку ОК и Cancel. Любой текст, записываемый в текстовое окно диалогового окна, будет возвращен функцией после того, как пользователь нажмет кнопку ОК, иначе будет возвращена пустая строка.
Первый аргумент функции InputBox() – строка текста, применяемая в качестве запроса на ввод в диалоговом окне; второй – заголовок; третий – default – содержит любой текст по умолчанию, который Вы можете отобразить в окне редактирования при открытии диалогового окна. Функция не использует аргумент buttons. Все аргументы должны быть строками текста, и значение, возвращаемое функцией, также является строкой текста. Для того, чтобы использовать возвращенное функцией значение в качестве числа, нужно преобразовать его из символьного представления в двоичное с помощью функции Val().
Так, следующая процедура отображает два диалоговых окна: первое для ввода имени пользователя, а второе – для ввода возраста пользователя; затем вычисляет и отображает возраст пользователя в днях:
Sub Age()
Dim theReply As String, thePrompt As String
Dim theTitle As String, theDefault As String
Dim theAge As Single, OKFlag As Boolean
Dim theName As String
thePrompt=”Введите Ваше имя.”
theTitle=”Персональный информационный диалог”
theDefault=”Имя”
‘Цикл ожидания ввода имени пользователя.
Do
theReply=InputBox(thePompt, theTitle, theDefault)
if theReply=”” Then Exit Sub
theReply=Trim(theReply) ‘Удаление пробелов с двух сторон строки.
‘Проверка на строку пробелов или пробел в строке.
If (theReply=””) Or (InStr(theReply,” “)<>0) Then
MsgBox “Непонятно, попробуйте еще раз.”, , theTitle
OKFlag=False
Elsejf theReply-theDefault Then MsgBox “Ну, хоть что – нибудь напишите!” , , _theTitle
OKFlag=False
Else
theName=theReply
OKFlag=True
End if
Loop Until OKFlag
thePrompt=”Привет, “&theReply&”, а лет Вам сколько?”
‘Цикл ожидания корректного числа.
Do
theReply-InputBox(thePrompt, theTitle)
If theReply=”” Then Exit Sub
theAge=Val(theReply) ‘Преобразование строки в число.
If Not IsNumeric(theReply) Then
MsgBox “Введите какое-нибудь число, пожалуйста, иначе не отстану!”, , _theTitle)
OKFlag=False
Else if (theAge<1) Or (theAge>120) Then
MsgBox “Ого, сколько Вам стукнуло, честно врете!”, , theTitle
OKFlag=False
Else
OKFlag=True
End if
Loop Until OKFlag
MsgBox “Вам приблизительно “&Format(theAge*365, “#,###”)&”дней”, , _theTitle
End Sub
Диалоговые окна приложения
Программы на Visual Basic могут вызывать все диалоговые окна, существующие в Excel. Однако эти диалоговые окна действуют не так, как описанные выше, и возвращают программе на Visual Basic без изменений какой-либо таблицы или ячейки. Если Вы вызываете диалоговое окно Excel, то оно не возвращает значения программе Visual Basic, а осуществляет свои нормальные функции.
Предуприждение:
В связи с тем, что диалоговые окна приложения применяются к текущему отображаемому объекту, не отображайте диалоговое окно вне контекста: так как это приведет к ошибке выполнения.
Для вызова диалогового окна приложения пользуйтесь набором Dialogs объекта Application. Для поиска доступных диалоговых окон и констант воспользуйтесь Object Browser, выбрав объект Constants из библиотеки Excel (нужные константы начинаются с xlDialog).
Следующая процедура отображает диалоговое окно FormatNumber:
Sub TestDialog2()
Application.Dialogs(xlDialogFormatNumber).Show
End Sub
Чтобы выполнить эту процедуру, запишите ее на странице модуля, переключитесь на таблицу, укажите директиву Tools/Macro, выберите процедуру TestDialog2(), затем нажмите кнопку Run.
Заключение
Диалоговые окна являются основным средством организации обмена небольшими объемами данных между пользователями и выполняющейся программой. Две функции MsgBox() и InputBox() созда