Введение в 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

вычисляющей следующую функцию с двумя условиями:

Введение в Visual Basic For Applications - student2.ru

Заметим, что знак подчеркивания «_» в конце строки обозначает, что следующая строка является продолжением предыдущей.

Пусть в ячейку А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 в конце. Ниже приведен синтаксис всех четырех конфигураций:

’ Условие False в начале. ’ Do Until условие ...блок кода Exit Do ...блок кода Loop  

’ Условие True в начале.

Do While условие

...блок кода

Exit Do

...блок кода

Loop

’ Условие False в конце. ’ Do ...блок кода Exit Do ...блок кода Loop Until условие
’ Условие True в конце.

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() созда

Наши рекомендации