Программирование в Excel
Выбор региона:
-
Все регионы
-
Россия
- Москва
- Санкт-Петербург
- Адыгея
- Башкортостан
- Бурятия
- Алтай
- Дагестан
- Ингушетия
- Кабардино-Балкария
- Калмыкия
- Карачаево-Черкесия
- Карелия
- Коми
- Марий Эл
- Мордовия
- Саха (Якутия)
- Северная Осетия
- Татарстан
- Тыва (Тува)
- Удмуртская Республика
- Хакасия
- Чеченская Республика
- Чувашская Республика
- Алтайский край
- Краснодарский край
- Красноярский край
- Приморский край
- Ставропольский край
- Хабаровский край
- Амурская область
- Архангельская область
- Астраханская область
- Белгородская область
- Брянская область
- Владимирская область
- Волгоградская область
- Вологодская область
- Воронежская область
- Ивановская область
- Иркутская область
- Калининградская область
- Калужская область
- Кемеровская область
- Камчатская область
- Кировская область
- Костромская область
- Курганская область
- Курская область
- Ленинградская область
- Липецкая область
- Магаданская область
- Московская область
- Мурманская область
- Нижегородская область
- Новгородская область
- Новосибирская область
- Омская область
- Оренбургская область
- Орловская область
- Пензенская область
- Пермский край
- Псковская область
- Ростовская область
- Рязанская область
- Самарская область
- Саратовская область
- Сахалинская область
- Свердловская область
- Смоленская область
- Тамбовская область
- Тверская область
- Томская область
- Тульская область
- Тюменская область
- Ульяновская область
- Челябинская область
- Ярославская область
- Еврейская авт. область
- Ненецкий АО
- Ханты-Мансийский АО
- Чукотский АО
- Ямало-Ненецкий АО
- Забайкальский край
- Украина
- Белоруссия
- Грузия
- Туркмения
- Узбекистан
- Таджикистан
- Молдавия
- Киргизия
- Казахстан
- Армения
- Азербайджан
- США
- Израиль
- Чехия
- Германия
- Литва
- Эстония
- Латвия
- Другие регионы
- Без региона
-
Россия
Сегодня в 14:55 | 24 | Россия / Мордовия
1.1. Создание, редактирование и запись программ
1.1.1. Запись макроса
Каждый создаваемый в Excel документ (книга) имеет структуру или проект, на верхнем уровне которого находится сама Книга, внутри которой расположены Листы. При создании программ на VBA в электронных таблицах Excel создается еще одна структурная единица – Модуль. Внутри модуля размещаются макросы, содержащие собственно исходный текст (код) программы.
Excel дает исключительно полезную возможность научиться программировать на VBA путем автозаписи макроса. То есть действия, выполняемые через пользовательский интерфейс, можно перевести в программный код на Visual Basic путем записи макроса. Записанный таким образом простейший макрос послужит основой для создания более сложного макроса и поможет изучить объекты, свойства и методы Excel.
Чтобы записать макрос:
1. Сделайте видимой панель инструментов Visual Basic, для чего выберите из меню View (Вид) в окне приложения (а не Visual Basic Editor) команду Toolbars (Панели инструментов) и установите флажок в строке Visual Basic (если он уже не установлен).
2. На панели инструментов Visual Basic щелкните кнопку Record Macro (Записать макрос).
3. В диалоговом окне Record Macro (Запись макроса) в поле Macro Name (Имя макроса) замените имя макроса, предлагаемое по умолчанию, на нужное Вам и щелкните кнопку ОК.
В списке Store Macro In (Макрос доступен для)* укажите, где хранить новый макрос. Выберите - This Workbook (Эта книга).
4. Выполните операции, для которых Вы хотите сгенерировать код на Visual Basic.
5. На панели инструментов Stop Recording (Остановка записи) щелкните кнопку Stop Recording (Остановить запись).
Итак, макрос записан. Чтобы просмотреть его код, выберите из меню Тооls (Сервис) команду Macro (Макрос), а затем — строку Macros (Макросы). В диалоговом окне Macros (Макрос) выберите имя нужного макроса и щелкните кнопку Edit (Изменить). Откроется окно редактора Visual Basic (Visual Basic Editor), содержащее текст макроса. Для просмотра проекта всей книги следует выбрать из меню View (Вид) команду «Окно проекта».
1.1.2. Как найти макрос в проекте
Для перехода в текст любой процедуры используйте «Окно проекта». Найдите объект - модуль, содержащий Ваш макрос. Все модули находятся в папке Modules (Модули) проекта Книги.
Найдя объект с интересующим Вас кодом, дважды щелкните его, и Вы увидите содержащиеся в нем процедуры. Этот способ пригоден для перехода как к процедурам, созданным Вами самостоятельно, так и к записанным макросам.
Ваш макрос помещается в модуль Module1 в папке Modules проекта данной рабочей книги.
1.1.3. Написание новой процедуры
Если Вы хотите написать код, не связанный с каким-либо объектом или событием, создайте процедуру в стандартном модуле. Процедура — это блок кода между операторами Sub и End Sub или Function и End Function.
Чтобы создать пустой стандартный модуль, перейдите в окно проекта, щелкните в любом месте проекта, к которому Вы хотите добавить модуль, и выберите из меню Insert (Вставка) команду Module (Модуль).
Чтобы открыть существующий стандартный модуль, выберите его в окне проекта и щелкните кнопку View Code (Программа).
Чтобы добавить процедуру к модулю, укажите его в окне проекта, выберите из меню Insert (Вставка) команду Procedure (Процедура), в диалоговом окне Add Procedure (Вставка процедуры) установите любые нужные параметры и щелкните кнопку ОК. (Справку об этих параметрах Вы получите, нажав клавишу F1.) Введите для примера в поле Name (Имя) строку Test1, в разделе Type (Тип) выберите переключатель Sub [Подпрограмма (Sub)], в разделе Scope (Область определения) — переключатель Public [Общая (Public)] , а затем “нажмите” кнопку ОК. После этого в Вашем модуле должна появиться такая процедура:
Public Sub Test1() End Sub
Добавив процедуру к модулю, можно написать ее код. В следующем примере в эту процедуру вставлена строка, которая выводит на экран сообщение:
Public Sub Test1() MsgBox "This is the Test1 procedure running" End Sub
Чем макрос отличается от процедуры
Хотя термины макрос и процедура иногда используют как синонимы, на самом деле они обозначают разные понятия. Процедура — термин более широкий; он применим к любому блоку кода, заключенному между операторами Sub и End Sub или Function и End Function. A макрос — специфический термин, относящийся только к открытым (public) процедурам Sub без параметров. Так что все макросы — процедуры, но не все процедуры — макросы. К макросам относятся процедуры, генерируемые при записи макросов, а также все процедуры, которые можно запускать из диалогового окна Macros (Макрос) приложения Excel.
1.1.4. Процедуры типа Sub и Function
В Visual Basic можно создавать процедуры двух типов: Sub и Function. Процедура типа Sub — блок кода, заключенный между операторами Sub и End Sub; он выполняет какую-то операцию, но значения не возвращает. Вот пример процедуры этого типа
Sub DisplayWelcome() MsgBox "Welcome" End Sub
Процедура типа Function — блок кода, заключенный между операторами Function и End Function; он тоже выполняет определенную операцию, но при этом обязательно возвращает какое-нибудь значение. Вот пример процедуры этого типа:
Function AddThree(OriginalValue As Long) AddThree = OriginalValue + 3 End Function
1.1.5. Закрытые и открытые процедуры
Открытую процедуру, объявленную с применением ключевого слова Public, разрешается вызывать из любой процедуры любого модуля приложения. Закрытую процедуру, объявленную с помощью ключевого слова Private, можно вызывать только из процедур, содержащихся в том же (что и закрытая процедура) модуле. Процедуры Sub и Function могут быть либо закрытыми, либо открытыми. Следующие процедуры закрытые:
Private Sub Test1() MsgBox "This is the Test1 procedure running" End Sub
Private Function AddThree(OriginalValue As Long) AddThree = OriginalValue + 3 End Function
А эти — открытые:
Public Sub Test1() MsgBox "This is the Test1 procedure running" End Sub
Public Function AddThree(OriginalValue As Long) AddThree = OriginalValue + 3 End Function
Если в объявлении процедуры не указано ни Private, ни Public, то по умолчанию она считается открытой. Хотя для создания открытой процедуры использовать ключевое слово Public не обязательно, включение его в объявление процедуры упрощает понимание того, какие процедуры открытые, а какие закрытые.
1.1.6. Использование значения, возвращаемого функцией
Чтобы функция возвращала значение, в ней должен быть оператор, который присваивает это значение имени функции. В следующем примере значение, присваиваемое ConeSurface, и будет значением, возвращаемым функцией:
Function ConeSurface(radius, height) Const Pi = 3.14159 coneBase = Pi * radius ^ 2 coneCirc = 2* Pi* radius coneSide = Sqr(radius ^ 2 + height ^ 2) * coneCirc / 2 ConeSurface = coneBase + codeSide End Function
Данные, необходимые процедуре типа Sub или Function для выполнения ее задачи (в предыдущем примере —radius и height), передаются как аргументы. Значение, возвращаемое процедурой типа Function, можно сделать частью более сложного выражения. Приведенный ниже оператор (из какой-то другой процедуры) использует значения, возвращаемые функциями ConeSurface и ScoopSurface:
totalSurface = ConeSurface(3. 11)+2* ScoopSurface(3)
1.1.7. Выполнение процедуры Sub
Вы можете сделать так, чтобы процедура Sub выполнялась при определенном событии, запустить ее из Visual Basic Editor, из окна Вашего приложения или вызвать из другой процедуры.
- Чтобы процедура Sub автоматически выполнялась всякий раз, когда возникает определенное событие, добавьте ее вызов к процедуре обработки этого события.
- Чтобы запустить процедуру Sub из Visual Basic Editor, установите курсор ввода в любой участок процедуры и либо нажмите клавишу F5, либо щелкните кнопку RunSub/UserForm (Запуск_подпрограммы/UserForm) на панели инструментов Standard (Стандарт) или Debug (Отладка).
- Чтобы запустить процедуру Sub, которая является макросом, выберите ее имя в диалоговом окне Macros (Макрос) приложения и щелкните кнопку Run (Выполнить).
- Чтобы вызвать процедуру Sub из другой процедуры, используйте ее имя по аналогии со встроенными ключевыми словами. Вот пример процедуры, вызывающей процедуру DisplayWelconne:
Sub TestCall() DisplayWelcome End Sub
Процедуру, объявленную закрытой, нельзя вызывать из процедур за пределами модуля, в котором она находится. В то же время открытую процедуру можно вызывать извне ее модуля.
Когда Вы вызываете процедуру, расположенную не в текущем модуле, Visual Basic просматривает другие модули и выполняет первую найденную открытую процедуру с указанным именем. Если имя открытой процедуры не уникально, лучше явно задать модуль, в котором она находится. В следующем примере вызывается процедура Sub с именем “DisplayWelcome” из модуля “TestTools”:
TestTools.DisplayWelcome
При необходимости можно указать и проект, в котором находится процедура. Вот пример вызова процедуры Sub с именем “DisplayWelcome” из модуля “TestTools”, относящегося к проекту “TestDocument”:
TestDocument.TestTools.DisplayWelcome
Здесь Вы указываете кодовое имя проекта, а не имя документа, с которым связан этот проект. Выяснить кодовое имя (и изменить его) можно в поле, расположенном справа от строки (Name) в окне свойств для данного проекта. Чтобы вывести на экран это окно, выделите подсветкой нужный проект в окне проекта и выберите из меню View (Вид) команду Properties Window (Окно свойств). Кодовое имя проекта можно изменить и по-другому — ввести новое имя в поле Project Name (Имя проекта) на вкладке General (Общие) диалогового окна Project Properties (Свойства проекта). Чтобы открыть это диалоговое окно, щелкните правой кнопкой мыши нужный проект в окне проекта и выберите из контекстного меню команду Properties (Свойства...) (название этой команды дополняется именем проекта). Справку о параметрах, устанавливаемых в диалоговом окне Project Properties (Свойства проекта), Вы получите, нажав клавишу F1.
Если Вы хотите, чтобы процедуру можно было вызывать из других модулей проекта, но не из других проектов, объявите ее открытой, а модуль, в котором она находится, — закрытым. Для этого добавьте в раздел (Declarations) [(Описания)] данного модуля оператор Option Private Module.
Чтобы процедуры одного проекта можно было вызывать из другого проекта, в последнем должна быть ссылка на проект, содержащий вызываемый код. Создаются такие ссылки с помощью диалогового окна References (Ссылки), которое открывается через меню Tools (Сервис).
1.1.8. Передача аргументов в процедуру
Если процедуре необходимы дополнительные данные, и их нельзя, получить из контекста, в котором она выполняется, то эти данные следует передать ей как аргументы. Чтобы указать, что процедура принимает аргументы, перечислите их между скобками за именем процедуры в ее объявлении. Аргументы отделяются запятыми.
Объявляя аргумент, можно задать его тип данных с помощью ключевого слова As (изменяет ли процедура значение аргумента, определяется ключевыми словами ByVal и ByRef), а также определить, обязателен ли аргумент, для чего предназначено ключевое слово Optional.
Взгляните, как объявлена процедура Sub, принимающая 3 аргумента:
Sub UpdateRecord(ByVal custId As Long. ByRef custName As String, _ Optional custRepeat As Boolean)
Первый аргумент, custId, обязателен и передается по значению как тип Long. Если аргумент передается в процедуру по значению, процедура получает лишь копию переменной, переданной вызывающей процедурой. Если вызываемая процедура модифицирует это значение, то изменится только копия, а не сама переменная в вызывающей процедуре.
Второй аргумент, сustName, тоже обязателен, но передается по ссылке как тип String. В этом случае процедура имеет доступ к исходной переменной в памяти, и поэтому способна изменить ее значение.
Третий аргумент, custRepeat, не обязателен и передается по ссылке как тип Boolean. (По умолчанию аргументы всегда передаются по ссылке.)
Вот пример вызова процедуры UpdateRecord:
Dim newld As Long Dim newName As String Dim newRepeat As Boolean newld = 3452 newName = "Mary Boyd" newRepeat = True UpdateRecord newld, newName, newRepeat
Имя переменной, передаваемой в процедуру, необязательно должно совпадать с именем аргумента в объявлении этой процедуры.
1.1.9. Именованные аргументы
Если у созданной Вами процедуры или у встроенных функции, оператора, метода есть несколько необязательных параметров, то, возможно, Вам будет удобнее передавать аргументы по их именам, а не позициям.
Например, метод Open объекта Workbooks в Microsoft Excel, открывающий рабочую книгу, принимает 13 аргументов. Если Вам нужно написать код, открывающий рабочую книгу Book2.xls и добавляющий ее в список последних открытых файлов, Вы могли бы использовать оператор:
Workbooks.Open "book2.xls" , , , , , , , , , , , , True
Но он так и провоцирует на ошибки, ведь в такой массе запятых запутаться немудрено. Да и код читать очень трудно — не понятно, к чему относится конкретный аргумент. Поэтому гораздо лучше написать так:
Workbooks.Open FileName:="books2.xls", AddToMru:=True
В этом случае, так как у каждого аргумента свое имя, можно присвоить значение аргументу, используя его имя и операцию :=. Работая с именованными аргументами, нет нужды запоминать порядок их следования. Скажем, в предыдущем операторе аргументы можно указать в обратном порядке:
Workbooks.Open AddToMru:=True, FileName:="books2.xls"
Вы вправе применять именованные аргументы и в своих процедурах. Visual Basic автоматически связывает имена аргументов с соответствующими процедурами. Допустим, Вы создали процедуру FormatList, которая принимает два обязательных и два необязательных аргумента:
Sub FormatList(startRow As Integer, startCol As Integer, _ Optional redText, Optional sortList)
Другая процедура (DoList) вызывает FormatList с передачей аргументов по именам:
Sub DoListO FormatList redText :=True, startCol :=2, startRow:=2 End Sub
Здесь аргументы расставлены не в том порядке, в каком они объявлены, а один аргумент опущен.
Примечание: Использование именованных аргументов не отменяет необходимости передачи обязательных аргументов.
1.1.10. Написание процедур для обработки событий
Некоторые объекты в приложениях Office-97 распознают предопределенный набор событий, инициируемых системой или пользователем. К числу таких событий относятся Open и Close для документов Word; Open, BeforePrint, BeforeSave и BeforeСlose для рабочих книг Microsoft Excel; Calculate и SelectionChange для рабочих листов Microsoft Excel; Click, Initialize и Terminate для пользовательских диалоговых окон; Click, GotFocus и LostFocus для элементов управления на базе ActiveX.
Вы можете управлять тем, как приложение реагирует на предопределенное событие, написав соответствующий код для объекта. Этот код или процедура обработки события выполняется всякий раз, когда возникает данное событие.
1.1.11. Где хранится код обработки события
Процедура обработки события хранится в документе, рабочей книге, рабочем листе, слайде или UserForm — там, где генерируется обрабатываемое ею событие. Например, процедура, выполняемая при пересчете таблицы “Last Quarter” из рабочей книги “Sales” будет сохранена в рабочем листе “Last Quarter” в проекте, связанном с рабочей книгой “Sales”. Чтобы просмотреть код, хранящийся в документе, рабочей книге, рабочем листе, слайде или UserForm, щелкните соответствующий объект в окне проекта и “нажмите” кнопку View Code (Программа).
1.1.12. Средства, ускоряющие написание программ
Многие ключевые слова Visual Basic очень длинные, и их трудно написать без ошибок. Чтобы сократить время на набор кода и уменьшить число вероятных опечаток, в Visual Basic предусмотрены средства, ускоряющие ввод ключевых слов и выражений.
Набрав несколько букв, достаточных для того, чтобы Visual Basic распознал ключевое слово, нажмите клавиши Ctrl+Пробел или щелкните кнопку Complete Word (Завершить слово) на панели инструментов Edit (Правка) — Visual Basic допишет его сам.
С помощью диалогового окна Options (Параметры), вызываемого через меню Tools (Сервис), можно включить автоматическую проверку синтаксиса после набора каждой строки — тогда Visual Basic будет “на лету” сообщать об ошибках и предлагать варианты их исправления.
Кроме того, кнопки List Properties/Methods (Список свойств/методов), List Constants (Список констант). Quick Info (Сведения), Parameter Info (Параметры) и Complete Word (Завершить слово) на панели инструментов Edit (Правка) помогут узнать синтаксис ключевого слова или выражения. Подробнее об этих средствах см. справочную систему и главу 2 “Введение в модели объектов”.
1.1.13. Как написать легкочитаемую программу
Сделать код на Visual Basic легкочитаемым можно разными способами. Например, добавляйте в свои программы комментарии, начиная их с апострофа ('). Выполняя программу, Visual Basic игнорирует все, что находится между апострофом и символом конца строки.
' эта процедура вычисляет расходы, связанные с наймом сотрудника Dim baseSalary As Currency ' зарплата без учета премий и надбавок baseSalary = employeeLevel * 2500 ' employeeLevel передается как аргумент
Чтобы добавить признак комментария в начало всех строк выделенного блока кода, щелкните кнопку Comment Block (Закомментировать блок) на панели инструментов Edit, а чтобы удалить его из начала всех строк выделенного блока, щелкните кнопку Uncomment Block (Раскомментировать блок).
Длинные операторы разбивайте на несколько строк, используя признак продолжения строки — пробел в сочетании со знаком подчеркивания ( _ ).
Признак продолжения строки недопустим в строковом литерале. Если Вам нужно разбить строковую константу на несколько строк, используйте оператор конкатенации (&):
MsgBox "This is a string that I have to break up " & _ "so that I can continue it on another line"
За признаком продолжения строки нельзя ставить комментарий.
Выделяйте отступами логические уровни в коде. Чтобы сдвинуть выделенный блок кода на один уровень вправо, нажмите клавишу Tab или щелкните кнопку Indent (Увеличить отступ) на панели инструментов Edit (Правка). При этом относительные позиции строк в выделенном блоке сохраняются. А чтобы сдвинуть выделенный блок на один уровень влево, нажмите клавиши Shift + Tab или щелкните кнопку Outdent (Уменьшить отступ) на той же панели инструментов.
Для быстрого перехода из одного места программы в другое используйте закладки. Установить закладку на строке можно щелчком кнопки Toggle Bookmark (Закладка) на панели инструментов Edit. Слева от строки появится голубой прямоугольник со скругленными краями — он и обозначает закладку. Для перехода между закладками используйте кнопки Next Bookmark (Следующая закладка) и Previous Bookmark (Предыдущая закладка) на панели инструментов Edit.
1.2. Переменные, константы и типы данных
В Visual Basic, как и во всех языках программирования высокого уровня, для хранения значений используются переменные и константы. Переменные могут содержать данные любых поддерживаемых типов.
1.2.1. Типы данных в Visual Basic
Фундаментальные типы данных, поддерживаемые Visual Basic:
Тип данных
Описание
Диапазон
1
2
3
Byte
1-байтовое двоичное число
от 0 до 255
Integer
2-байтовое целое
от -32 768 до 32 767
Long
4-байтовое целое
от -2 147 483 648 до 2 147 483 647
Single
4-байтовое число с плавающей точкой
от-3.402823Е38до-1.401298Е-45 (отрицательные значения) от 1.401298Е-45 до 3.402823Е38 (положительные значения)
Double
8-байтовое число с плавающей точкой
От -1.79769313486231Е308 до -4.94065645841247Е-324 (отрицательные значения) от 4.94065645841247E-324 до 1.79769313486231Е308 (положительные значения)
Currency
8-байтовое число с фиксированной десятичной точкой
от –922 337 203 685 477.5808 до 922 337 203 685 477.5807
String
строка символов
от нуля до почти двух миллиардов символов
Variant
дата/время, число с плавающей точкой, целое, строка или объект; занимает 16 байтов плюс по 1 байту на каждый символ, если значе-нием является строка
даты: от 1 января 100 года до 31 декабря 9999 года числовые значения: тот же диапазон, что и для Double строки: тот же диапазон, что и для String позволяет также хранить значения Error или Null
Boolean
2 байта
True или False
Date
8-байтовое значение даты/времени
от 1 января 100 года до 31 декабря 9999 года
Object
4 байта
Ссылка на любой объект
1.2.2. Объявление константы, переменной или массива
Константа, используемая вместо литерала, объявляется оператором Const. При этом можно указать ее тип, область действия и присвоить ей значение:
Const MyVar = 459 Public Const MyString = "HELP" Private Const Mylnt As Integer = 5 Const MyStr = “Hello”, MyDouble As Double = 3.6547
По умолчанию константа считается закрытой. Если при объявлении константы тип данных явно не указан. Visual Basic назначает ей тип, который соответствует выражению, присвоенному константе. Подробнее на эту тему см. описание операторов Const, Public, Private и As в справочной системе.
Переменная объявляется с помощью ключевых слов Dim, Public, Private или Static. Чтобы явно задать тип переменной, используйте ключевое слово As.
Private I Dim Amt Static YourName As String Public BillsPaid As Currency Private YourName As String, BillsPaid As Currency Private Test. Amount, J As Integer
Если переменная не объявлена статической, ее значение после выполнения процедуры не сохраняется, и занятая ею память освобождается. По умолчанию Visual Basic присваивает переменным тип Variant.
Объявление массива аналогично объявлению переменной; при этом тоже используются ключевые слова Dim, Public, Private или Static. Верхние и нижние границы каждой размерности определяются целочисленными значениями, а тип элементов массива задается с помощью ключевого слова As. Прежде чем задействовать массив, Вы должны явно объявить его — неявное объявление массива недопустимо.
Объявляя массив, Вы определяете верхнюю и нижнюю границы каждой размерности в круглых скобках за именем массива. Если Вы указали только одно значение, оно считается верхней границей, а для нижней подставляется значение по умолчанию. Последнее значение равно 0, если только Вы не приравняли его единице оператором Option Base. Приведенные ниже операторы объявляют одномерные массивы, содержащие 15 и 21 элемент соответственно:
Dim counters(14) As Integer Dim sums(20) As Double
Разумеется, нижнюю границу можно задать явно. При этом значения верхней и нижней границы разделяются ключевым словом То:
Dim counters(1 То 15) As Integer Dim sums(100 To 120) As String
Здесь индекс counters изменяется от 1 до 15, а индекс sums — от 100 до 120.
Чтобы получить значения нижней и верхней границы уже существующего массива, воспользуйтесь функциями LBound и UBound.
Число размерностей массива может достигать 60. Для примера объявим трехмерный массив, у которого первая размерность равна 4, вторая — 10, а третья — 15. Общее число элементов массива равно произведению его размерностей, т. е. 600.
Dim multiD( 1 to 4, 1 to 10, 1 to 15)
Динамический массив объявляется так же, как и фиксированный, но без указания размерностей в скобках после имени массива:
Dim dynArray() As Integer
А затем где-то в процедуре Вы определяете нужное число элементов массива оператором ReDim:
ReDim DynArray(X+1)
Ключевое слово Preserve позволяет изменять размер массива без потери его текущего содержимого. Например, чтобы увеличить размер массива на один элемент без потери значений существующих элементов, сделайте так:
ReDim Preserve myArray(UBound(myArray) + 1)
Подробнее на эту тему см. описание оператора ReDim в справочной системе.
1.2.3. Объявление объектной переменной
Вы объявляете объектную переменную, указывая либо универсальный тип Object, либо конкретное имя класса. Следующий оператор объявляет объектную переменную типа Object:
Dim mySheet As Object
Если тип переменной задан как Object, Visual Basic не знает, с объектами какого типа Вы будете использовать ее в дальнейшем. Поэтому Visual Basic при компиляции не сможет проверить, существует ли такой объект, корректно ли применяются его методы и свойства, и не сумеет связать эту информацию с объектной переменной — иначе говоря, Visual Basic не выполнит раннее связывание (early binding) объектной переменной. Лишь когда Вы запустите программу, и этой переменной будет присвоена ссылка на конкретный объект, Visual Basic получит нужную информацию и выполнит позднее связывание (late binding). Универсальные объектные переменные полезны только в том случае, когда Вам заранее не известен конкретный тип объекта или когда за переменной периодически закрепляются объекты разных классов. Так что по возможности указывайте при объявлении объектной переменной имя конкретного класса, например, так:
Dim mySheet As Worksheet Dim myPres As Presentation Dim myRange As Range Dim myApp As Application
Тип объектной переменной (в дополнение к конкретному имени класса) можно квалифицировать именем приложения, которое предоставляет данный объект (см. пример ниже). Это полезно в программе, использующей объекты из нескольких библиотек (особенно если в них содержатся объекты с одинаковыми именами).
Dim wndXL As Excel.Window Dim wndWD As Word.Window Dim appWD As Word.Application
Для закрепления объекта за переменной предназначен оператор Set:
Dim myRange As Excel. Range Set myRange = Worksheets("Sheet1").Range("A1")
Если Вы не объявили объектную переменную явно и в момент присвоения забыли указать ключевое слово Set, Visual Basic не закрепит объект за этой переменной, а присвоит ей значение свойства объекта по умолчанию. В следующем примере переменная myRange получает значение свойства по умолчанию объекта Range (каковым является свойство Value):
myRange = Worksheets("Sheet1").Range("A1") ' пропущен оператор Set!
1.2.4. Встроенные константы
Библиотека объектов каждого приложения Office 97 предоставляет набор встроенных констант, которые можно использовать для задания значений свойств или передачи аргументов свойствам и методам. Набор встроенных констант, отражающих допустимые значения какого-либо свойства или параметра, передаваемого методу или свойству, представляется перечислимым типом. Для многих свойств и методов в качестве типа возвращаемого значения или параметра Вы увидите в Object Browser (средство просмотра объектов) именно перечислимый, а не базовый тип данных. Чтобы открыть в Visual Basic Editor окно Object Browser (Просмотр объектов), нажмите клавишу F2. С его помощью можно просмотреть, какие константы составляют перечислимый тип, и каковы их значения. Например, в списке Classes (Классы) щелкните строку Application, а в списке Members Of (Компонент) — строку Display Alerts. В нижней части окна Object Browser (Просмотр объектов) Вы увидите следующий текст:
Property DisplayAlerts As WdAlertLevel
WdAlertLevel — перечислимый тип, объединяющий константы, которые представляют все допустимые значения свойства DisplayAlerts. Перечислимый тип нетрудно узнать по имени, поскольку оно всегда начинается с префикса, обозначающего библиотеку объектов, в которой определен этот тип, — например: Mso, Wd, Xl, Ac, Pp, VB или Fm. (Имена встроенных констант начинаются с тех же префиксов, что и имена перечислимых типов.) Чтобы просмотреть константы перечислимого типа, щелкните подчеркнутую строку WdAlertLevel. После этого WdAlertLevel станет текущим в списке классов Object Browser, и константы этого типа появятся в списке Members Of (Компонент). Если щелкнуть одну из констант, в нижней части окна Object Browser (Просмотр объектов) будет показано значение, которое представляет данная константа. Подробнее об использовании диалогового окна Object Browser см. главу 2 “Введение в модели объектов”.
Встроенные константы используются в программах вместо литеральных значений. Следующие две строки кода, каждая из которых устанавливает в Word режим показа всех предупреждений и сообщений при выполнении процедуры, эквивалентны:
Application.DisplayAlerts = -1 Application.DisplayAlerts = wdAlertsAII
Константы легче читать, чем литеральные значения. Кроме того, если эти значения в будущих версиях приложений изменятся, Вам вряд ли придется модифицировать программу, использующую константы. Вполне вероятно, что литеральное значение -1 больше не будет соответствовать параметру, заставляющему выводить все предупреждения и сообщения, но константа wdAlertsAll — будет обязательно.
1.3. Управляющие конструкции
Эти конструкции управляют ходом выполнения программы. В их отсутствие она выполняется последовательно. Но такое допустимо лишь в самых простейших программах. Поэтому любой язык программирования позволяет изменять порядок выполнения операторов за счет ветвления и циклов.
1.3.1. Операторы ветвления
В программах на Visual Basic можно проверять условия и выполнять действия в зависимости от результатов проверки. Предназначенные для этого операторы Visual Basic перечислены в таблице:
Чтобы проверить:
Используйте:
Одно условие и выполнить оператор или блок операторов
If...Then
Одно условие и выбрать один из двух блоков операторов
lf...Then...Else
Более одного условия и выполнить один из нескольких блоков операторов
If... Then. ..Elself
Одно условие и выполнить один из нескольких блоков операторов
Select Case
1.3.1.1. lf...Then
Позволяет выполнять один или несколько операторов, если условие истинно. Можно использовать однострочный или блочный синтаксис. Следующий пример иллюстрирует обе формы:
If thisVal < 0 Then thisVal = 0
If thisVal > 5 Then thatVal = thisVal + 25 thisVal = 0 End If
В однострочной форме оператор End If не применяется. А если Вы хотите выполнить более одной строки кода, когда опенка условного выражения дает True, Вам нужен блочный вариант — lf...Then...End If.
1.3.1.2. If...Then...Else
Позволяет определить 2 блока операторов. Первый блок выполняется, когда условие истинно, а второй — когда оно ложно.
If age < 16 Then MsgBox "You are not old enough for a license. " Else MsgBox "You can be tested for a license. " End If
1.3.1.3. lf...Then...Elself
Для проверки дополнительных условий не обязательно вкладывать операторы If...Then друг в друга — можно добавить операторы ElseIf, и тогда Ваш код станет легче читаемым и лаконичным. Допустим, Вам нужно рассчитать премии сотрудникам с учетом их вклада в общее дело. Процедура типа Function из следующего примера использует для этого серию операторов ElseIf:
Function Bonus(jobClass, salary, rating) If jobClass = 1 Then Bonus = salary * 0.1 * rating / 10 ElseIf jobClass = 2 Then Bonus = salary * 0.09 * rating / 10 ElseIf jobClass = 3 Then Bonus = salary * 0.07 * rating / 10 Else Bonus = 0 End If End Function
Оператор If...Then...ElseIf очень гибок. Вы можете начать с простого оператора If...Then, а потом добавлять операторы Else и ElseIf по мере необходимости. Но если все операторы ElseIf сравнивают одно и то же выражение с разными значениями, лучше воспользоваться оператором Select Case.
1.3.1.4. Select Case
Оператор Select Case заменяет серию операторов ElseIf в том случае, когда одно выражение сравнивается с несколькими значениями. Он обеспечивает ветвление по условию, аналогичное возможностям оператора If...Then...ElseIf; но делает код эффективнее и читабельнее.
Например, чтобы добавить еще несколько уровней в предыдущий фрагмент, нужно было бы ввести дополнительные операторы ElseIf, однако мы перепишем функцию на основе оператора Select Case:
Function Bonus(jobClass, salary, rating) Select Case jobClass Case 1 Bonus = salary * 0.1 * rating / 10 Case 2 Bonus = salary * 0.09 * rating / 10 Case 3 Bonus = salary * 0.07 * rating / 10 Case 4, 5 ' можно включать несколько значений... Bonus = salary * 0.05 * rating / 5 Case 6 To 8 ' ...или задавать диапазон Bonus = 150 Case Is > 8 ' ...или сравнивать с другими значениями Bonus = 100 Case Else Bonus = 0 End Select End Function
Заметьте, что в конструкции Select Case вычисляется только одно выражение — в самом ее начале. Оператор If...Then...ElseIf, напротив, позволяет проверять разные выражения в каждом ElseIf. Поэтому оператор If...Then...ElseIf можно заменить оператором Select Case, только если все ElseIf вычисляют одно выражение.
1.3.2. Операторы циклов
Они используются для организации повторного выполнения блоков кода. Операторы циклов, предусмотренные в Visual Basic, описаны в следующей таблице.
Чтобы:
Используйте:
Проверить условие в начале цикла, если оно True, перейти к выполнению цикла и продолжать, пока условие не станет False
Do While...Loop
Проверить условие в начале цикла, если оно False, перейти к выполнению цикла и продолжать, пока условие не станет True
Do Until..Loop
Выполнить цикл один раз, проверить условие в конце цикла и, если оно True, продолжать, пока условие не станет False
Do...Loop While
Выполнить цикл один раз, проверить условие в конце цикла и, если оно False, продолжать, пока условие не станет True
Do...Loop Until
Выполнить цикл заданное число раз, используя счетчик цикла с определенными начальным и конечным значениями, а также шагом приращения
For...Next
Выполнить цикл по разу для каждого объекта из набора(collection)
For Each...Next
Примечание: В Visual Basic есть и оператор While...Wend, но вместо него лучше использовать более гибкие варианты оператора Do...Loop — например, Do While...Loop или Do...Loop While.
1.3.2.1. Do...Loop
Позволяет выполнять блок операторов неопределенное число раз, — когда Вам заранее не известно, сколько понадобится итераций. Существует несколько вариантов этого оператора, но в каждом из них проверяется условие и по результатам проверки определяется, надо ли продолжать цикл. Как и в операторе lf...Then, условие должно быть значением или выражением, которое можно вычислить как True или False. Далее мы рассмотрим все вариации Do...Loop. Подробнее на эту тему см. описание оператора Do...Loop в справочной системе.
1.3.2.2. Do While...Loop
Оператор Do While...Loop позволяет проверить условие перед началом цикла и выполнять цикл до тех пор, пока оно True.
Проверяемое в цикле Do While...Loop условие рано или поздно должно стать False, иначе цикл будет бесконечным. Чтобы остановить бесконечный цикл, нажмите клавиши Ctrl + Break.
Процедура Function из следующего примера подсчитывает число вхождений одной строки в другую, выполняя цикл до тех пор, пока не будут найдены все вхождения. Поскольку проверка осуществляется в начале цикла, тот выполняется, только если заданная строка присутствует в другой строке.
Function CountStrings( longstring, target) position = 1 Do While lnStr(position, longstring, target) ' возвращает True или False position = lnStr(position, longstring, target) + 1 Count = Count + 1 Loop CountStrings = Count End Function
1.3.2.3. Do Until...Loop
Позволяет проверять условие в начале цикла и выполнять цикл, пока оно не станет True. Если проверка с самого начала даст True, операторы в теле цикла пропускаются. Благодаря этому цикл в следующем примере не выполняется, если Response равна vbNo.
Response = MsgBox("Do you want to process more data?", vbYesNo) Do Until Response = vbNo ProcessUserData ' вызываем процедуру для обработки данных Response = MsgBox("Do you want to process more data?", vbYesNo) Loop
1.3.2.4. Do … Loop While
Если операторы цикла следует выполнить хотя бы раз, используйте Do...Loop While, чтобы проверять условие в конце цикла. Операторы выполняются, пок
|



Высшая математика – просто и доступно!