Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Информатика Часть 1

Работа добавлена на сайт samzan.net:


Министерство образования и науки Российской федерации

РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

НЕФТИ И ГАЗА им. И.М. ГУБКИНА

_______________________________

Кафедра информатики

Тихвинский В.И.

VBA for Excel

Методические указания

по курсу «Информатика»

Часть 1.

Москва - 2007


УДК 681.3

Тихвинский В.И. VBA for Excel. Методические указания по курсу «Информатика». Часть 1. Под общей ред. Сидорова В.В. - М.: РГУ нефти и газа им. И.М. Губкина, 2007.-   c.

Методические указания содержат учебный материал по основам программирования в среде VBA for Excel (MS Office), включая заданиями по выполнению лабораторных работ.

Методические указания предназначены для студентов первого курса юридического факультета и факультета экономики и управления.

Рецензент – проф. кафедры АСУ Степин Ю.П.

© Российский государственный университет

нефти и газа им. И.М. Губкина, 2007.

1. VBA for Excel

1.1 Введение

Практически не возможно полностью вместить в одной книге все, о каком либо языке программирования. Тем не менее, мы постарались в данной книге дать максимально полезный объем информации по языку VBA. Книга в основном ориентирована на язык VBA программы Excel, но в конце книги в ее приложениях есть немного информации о работе VBA в Word и Access. Отметим, что большинство операторов VBA Excel работают и в других приложениях MS Office.  

Язык VBA (Visual Basic for Application) относится к визуальным языкам программирования. Это язык встроен в среду MS Office и предназначен для расширения функциональных возможностей ее компонентов. Идеология языка практически не отличается от стандартного VB (Visual Basic). Однако он работает только внутри конкретного приложения в режиме интерпретации, сохраняя при этом все возможности обычного VB. VBA расширен дополнительными языковыми конструкциями, служащими, для обработки специализированных файлов приложений.

Название языка программирования Visual Basic for Application можно перевести дословно следующим образом: “Визуальный Бейсик(Basic) для Приложений”. Английское слово Visual используется в названиях визуальных языков программирования. Basic – это имя программного языка, из которого Visual Basic произошел. “для Приложений” - означает то, что данный язык встроен внутри программных приложений MS Office: Word, Excel, Access, Power Point и др.

Визуальные языки программирования это объектно-ориентированные языки, при помощи которых легко создавать Интерфейс программы. Интерфейс программы - это программные средства, при помощи которых человек общается с компьютерной программой. В среде Windows существуют различные объекты, такие как: кнопки, поля, поля со списками, меню и др., которые являются элементами программного интерфейса. Практически все эти элементы в визуальных языках программирования  просто рисуются программистом, точно так же, как рисуется круг, квадрат, линия в графических редакторах. Такая возможность значительно облегчила и ускорила работу программиста по созданию программного интерфейса.

В VBA имеется возможность написание макросов. Макрос – это компьютерная программа записанная особым образом, в которой записываются действия человека внутри приложения. Макрос даже может написать человек, который не знает языка VBA, но текст программы макроса в большинстве приложений MS Office пишется на рассматриваемом нами языке программирования или он может быть легко оттранслирован в язык VBA. Программист VBA может написать макрос, а затем подправить текст этой программы для своих нужд. Написать макрос в ряде случаев значительно легче, чем написать программу VBA, что значительно облегчает работу программиста по созданию текста программы. (Пример написание подпрограммы через макрос указан нами в Приложение 2 данной книги)  

1.2 Правила оформления конструкций языка VBA  в общем виде

При написании конструкций языка VBA в общем виде мы придерживались в этой книге следующих правил:

  •  Необязательные параметры элементов конструкции берутся в квадратные скобки […].
  •  Если в элементе конструкции может использоваться только один из указанных параметров, то такие параметры разделяются символом /.
  •  Служебные слова в конструкции выделяются жирным шрифтом.
  •  Идентификаторы в конструкции пишутся курсивом.
  •  Строки, которые могут содержать операторы VBA помечаются символом точка “.”.

1.3 Идеология визуальных языков

Как и в классических языках программирования в VBА сохраняются такие языковые конструкции как: Оператор присваивания, Условный оператор и Оператор выбора, Операторы цикла, процедуры и функции.  В отличие от классических языков программирования в VBA весь текст программы состоит из процедур и функций. Работа программы есть последовательное выполнение событийных процедур, которые выполняются как ответная реакция на соответствующие события, происходящие в компьютере (нажатие клавиш клавиатуры, перемещение мыши и др.). Из событийных процедур производится запуск обычных процедур и функций.  В VBA, в отличие от классических языков программирования, подпрограммы, находящие внутри одного и того же модуля, могут вызвать любую подпрограмму модуля  в независимости от порядка их объявления в модуле.

1.4 Основные понятия визуальных языков

Прежде чем прочесть данную главу, рекомендуем вам прочесть  Приложение 9 (Основные понятия визуального программирования на доступных примерах) , это особенно будет полезно, если вы никогда не программировали в визуальных средах.

  •  Класс – особый тип для создания объектов
  •  Объект - экземпляр класса характеризующийся:
  •  Свойством  (Полем, Атрибутом) – определяет состояние объекта, его ширину, высоту, цвет или какое-либо другое состояние, которое не обязательно определяется визуально;
  •  Методом – способ изменения свойств объекта;
  •  Событием – действие (операция) происходящее с объектом (попадание объекта в фокус и потеря им фокуса, нажатие левой клавишей мыши на объекте и т.п.);
  •  Элемент управления, компонент, инструмент – особый объект, предназначенный для визуально управления программой (кнопка, однострочный редактор, поле со списком и т.п.)

Классы в объектно-ориентированном программировании могут происходить от других классов. Такие классы называются потомками, а те классы, от которых они происходят, – родителями. В потомках могут сохраняться методы и свойства от родителей. Такая способность классов называется наследственностью.

Если метод в потомке имеет тоже же имя что и у родителя, но выполняет другую функцию, то эта способность называется полиморфизм.

1.5 Дополнительные понятия языка VBA

  •  Алфавит языка – символы, которые используются в языке программирования. В VBA это латинские буквы и кириллица,  а так же арабские цифры и специальные символы;
  •  Комментарии – не влияют на выполнение программы, но помогают ориентироваться в ней программисту, строка комментариев начинается со знака (‘) - апостроф;
  •  Перенос строки – совокупность знаков «пробел» и  «подчеркивание» - «  _»;
  •  Идентификатор (символическое имя) – имя переменной, именованной константы, поля, метода, процедуры или функции,  а так же имя объекта, через которое происходит обращение к последнему. Идентификатор может содержать один и более символов. Первым символом должна быть обязательно буква. В идентификаторе можно использовать цифры и некоторые специальные символы (например, знак подчеркивания) ;
  •  Продолжение однострочной конструкции – символ двоеточие ”:”, через который можно записать несколько операторов в плечах однострочной конструкции условного оператора. С его помощью можно также записать несколько операторов VBA в одной строке;
  •  Переменная –  область в оперативной памяти компьютера, которая имеет имя; способна содержать в себе информацию определенного типа:
  •  Глобальная переменная – переменная, которая используется во всем модуле в любой подпрограмме;
  •  Локальная переменная - переменная, которая используется только в конкретной подпрограмме;
  •  Именованная константа - область в оперативной памяти компьютера, которая имеет имя, и содержит в себе информацию, которую нельзя изменить во время работы программы;
  •  Неименованная константа – способ записи числовых, строковых и других значений используемых в арифметических и в других  выражениях;
  •  Оператор – команда (инструкция) для компьютера;
  •  Программа – совокупность всех операторов, направленных на то, что бы компьютер выполнял определенные действия;
  •  Подпрограмма – общее название для процедуры и функции. Обособленная часть программы, которая имеет имя и которую можно вызывать для выполнения конкретных операций;
  •  Процедура – часть программы, имеющая имя и которую можно вызвать из другой подпрограммы;
  •  Событийная процедура объекта – часть программы, которая выполняется по свершению определенного события, происходящего с определенным объектом;
  •  Функция – часть программы, предназначенная, как правило, для вычисления значения выражения;
  •  Проект – файл, в котором находится программа. Для VBA for Excel это рабочая книга Excel;
  •  Диалоговые окна – стандартные диалоговые окна, встроенные в язык VBA, которые обеспечивают диалог человека с компьютером;
  •  Форма – диалоговое окно, созданное пользователем;
  •  Модуль – представляет собой именованную область внутри проекта, которая содержит в себе процедуры и функции. Имеется следующая разновидность модулей:
  •  Модуль рабочей книги (стандартное имя ThisWorkbook или в некоторых русских версиях Excel - ЭтаКнига)
  •  Модуль листа рабочей книги (Имя модуля листа совпадает по умолчанию с именем листа)
  •  Модуль макросов (Этот модуль может так же, помимо макросов, содержать в себе процедуры имеющие входные параметры, а так же функции. Имя такого модуля по умолчанию  начинается со слова Модуль. Название этого модуля  в английских версиях Excel начинается со слова Module.)
  •  Модуль формы (Обеспечивает работу диалогового окна созданного пользователем. Имя этого модуля совпадает с именем формы.)
  •  Модуль класса ( Содержит в себе класс, созданный пользователем. Используется для последующего создания экземпляров пользовательского класса.)


2 Переменные и константы

2.1 Структура модуля

Каждый модуль в VBA состоит из двух областей:

  •  General (Общая область) – область для описания глобальных переменных, а так же для объявления не событийных подпрограмм. Эта область состоит из двух соответствующих подобластей:
  •  Declaration (Описания) -  раздел описания глобальных переменных, констант и полей модуля (этот раздел расположен в самом верху редактора модуля)
  •  Раздел описания не событийных подпрограмм – расположен под разделом описания, не событийные процедуры могут описываться вперемешку с событийными, но через специальное, правое поле со списком редактора модуля, не событийная процедура выбирается только в разделе General (Общая область), когда эта область выбрана из левого поля со списком редактора модуля.
  •  Область событийных процедур объектов – расположена под разделом описания. Событийные процедуры могут описываться вперемешку с не событийными, но через специальное, правое поле со списком редактора модуля, событийная процедура выбирается только тогда,  когда выбрано имя объекта в левом поле со списком редактора модуля.


Выбор Общей области или имени объекта

Выбор раздела Описания или имени не событийной подпрограммы, а так же имени события происходящего в выбранном объекте

Програм-

мный

код модуля

Кнопка, утанавливающая режим просмотра только текущей подпрограммы в редакторе модуля

Кнопка, утанавливающая режим просмотра всех подпрограмм в редакторе модуля

Рис.1. Вид окна редактора модуля

2.2  Объявление переменных и констант

Переменные и именованные константы являются глобальными для всех процедур и функций внутри модуля, если они описаны в общей области модуля в разделе описания, и являются локальными, если они описаны внутри процедуры или функции. Объявляются переменные служебным словом Dim , а константы, служебным словом Const.

Формат описания переменной:

Dim имя_переменной1 [as тип], имя_переменной2 [as тип]

Если служебное слово as c типом опущены, то переменная имеет тип Variant.

Формат описания констант:

Const Имя_константы1 [as тип] = Значение

В качестве значения константы может быть использована именованная или неименованная константа,  а так же выражения содержащие константы.

Типы   переменных и констант

Имя типа

Разновидность

Типа

Диапазон значений

Размерность

Byte

Байт

От 0 до 255

1 байт

Integer

Короткое целое

От –32768 до 32767

2 байта

Long

Длинное целое

От –2147483648  до  2147483647

4 байта

Single

Вещественное одинарной точности

От 1,5*10-45 до 3,4*1038

4 байта


Double

Вещественное двойной точности

От 5,0*10-324 до 1,7*10308

8 байт

Currency

Денежный

(числовая переменная, которая содержит четыре фиксированных разряда после запятой)

От –922 337 203 685 477,5808 до 922 337 203 685 477,5807

8 байт

Boolean

Логический

True или False

2 байта

Date

Дата

Хранит в себе календарную дату и(или) время, значение которого обычно задают в строковом формате.

8 байт

String

Строковый

Состоит из группы символов, каждый символ строки содержится в 1 байте и кодируется определенным целым числом, большим, либо равным 0. Символ строки имеет свой порядковый номер, нумерация символов начинается с 1.

От 0 до 65535 байт


String * N

Строка  фиксированной длины

Состоит из N символов. Если данной строке присвоено символов меньше чем N, то к строке автоматически добавляются пробелы. Если больше чем N, излишек символов от строки отбрасывается. По умолчанию данная строка состоит из N символов имеющих код 0.

N байт

Variant

Универсальный

Любой неструктурированный тип в этой переменной представляется в виде строки символов.

От 0 до 65535 байт

Object

 Объектный

Переменная данного типа может использоваться как указатель на объект, или для создания экземпляра объекта. Тип перешел из более ранних версий языка VB,  данный тип успешно перекрывается типом  Variant.

В VBA нет способа объявления глобальных переменных для всех модулей проекта, но существует возможность объявить поле модуля, которое будет использоваться как переменная. Объявляются поля модуля так же в общей области, следующим способом:

Private / Public  Имя_поля_модуля [as тип]

Если внутри модуля макросов поле объявлено служебным словом Public, оно доступно для всех модулей проекта, Privateобъявляет локальное поле модуля.

Правильным обращением к данному полю из другого модуля было бы следующим:

Имя_Модуля1.Имя_Поля

Но если в других модуля макросов  не содержится глобальных полей с именем  совпадающем с именем поля в Модуле1, то VBA допускает обращение к этому полю просто по имени.

Числовые переменные VBA после их объявления имеют по умолчанию значение 0. Строковые переменные по умолчанию не содержат в себе символов, т.е. являются пустой строкой. Строки фиксированной длины имеют объявленную длину(см. таблицу типов). Логическая переменная имеет значение False.  Переменная VariantEmpty,  а переменная ObjectNoThing.

2.2.2  Неявное и явное объявление переменных ( Оператор Option Explicit ) 

В предыдущей главе Объявление переменных и констант, нами было описано явное объявление переменных оператором Dim .

В языке VBA допускается не объявлять переменные. Необъявленные переменные имеют тип Variant, если их имена не заканчиваются следующими служебными символами:

% - короткое целое (Integer )

& - длинное целое ( Lоng )

! - Вещественное одинарной точности ( Single)

# - Вещественное двойной точности ( Double )

@ - Денежное, числовое с фиксированной запятой ( Currency )

$ - Строковое  ( String )

Кроме того, возможно неявное объявление типа переменных следующими операторами:

DefByte – переменная байт (Byte)

DefInt - короткое целое (Integer )

DefLng - длинное целое ( Lоng )

DefSng - Вещественное одинарной точности ( Single)

DefDbl - Вещественное двойной точности ( Double )

DefCur - Денежное, числовое с фиксированной запятой ( Currency )

DefBoolЛогический ( Boolean )

DefDateДата ( Date )

DefStr - Строковое  ( String )

DefVarУниверсальный ( Variant )

Данные операторы должны быть записаны в общей области (General) модуля, до первого, явного объявления переменных.  За именем оператора должен следовать список из букв. Например, в начале модуля может быть записана следующая программная инструкция:

DefInt I-K

DefBool B 

Которая обозначает, что все необъявленные переменные в  модуле, имена которых начинаются с букв I, J, K  имеют тип Integer.  И все необъявленные переменные в модуле, имена которых начинаются с буквы B имеют тип Boolean.

Оператор Option Explicit находящийся в начале общей области (General) модуля, запрещает неявное объявление переменных в указанном модуле. Если в меню редактора VBA Сервис-Параметры-Редактор установлен флажок “явное объявление переменных”, то все новые модули вставляемые в проект VBA будут содержать оператор Option Explicit.

2.3 Неименованные константы

В строковых неименованных константах текст берется в двойные кавычки:  

“Текст” 

Если нужно печатать кавычку  ( ) в тексте, то этот символ в кавычках повторяют:

“Д””aртаньян”  в память компьютера попадет текст: Д”aртаньян

В VBA есть понятие пустой строки, т.е. такой строки, которая не содержит в себе ни одного символа, такая строка задается плотно сжатыми кавычками -  “”.

В целых неименованных константах числа записываются точно так же, как они записываются в математике.

Вещественных неименованных константах дробная часть от целой отделяется точкой, кроме того, латинская буква “e” указывает на степень десятки, которая умножается на вещественное число:

Пример:

  1.  

1е-2 (т.е. 1 помножить на 10 в –2 степени)

В обоих примерах представлено число: 0,01

Логическая неименованная константа может иметь два значения:

  •  True – соответствует истине
  •  False – соответствует лжи

Неименованная константа типа Data может задаваться двумя ниже перечисленными способами:

  •  #Месяц/Число/Год#
  •  Число.Месяц.Год

где

Число – число, указывающее число месяца

Месяц – число, указывающее номер месяца

Год – число, указывающее год

Примеры:

#2/1/2003#

“1.2.2003”

В обоих примерах представлена следующая дата: 1 февраля 2003 года.

В неименованной константе типа Data  может быть так же представлено время:

  •  #Час:Минуты:Секунды#
  •  Час:Минуты:Секунды

где

Час – число, указывающее час

Минуты –число, указывающее минуты

Секунды –число, указывающее секунды

Возможно задать время в 12 часовом режиме, в этом случаи, через пробел за временем вводятся две латинские буквы: PM – обозначают, что время указано после полудня, AM – обозначают, что время указано до полудня.

Пример:

#13:02:10#

“13:02:10”

“01:02:10 PM

#01:02:10 PM#

Во всех примерах представлено следующее время: 13 часов 2 минуты 10 секунд.

Также, в неименованной константе Data может быть представлено и время и дата, при этом с начало записывается дата, а вслед за ним, через пробел время.

Пример:

#2/1/2003 13:02:10#

“1.2.2003 13:02:10”

#2/1/2003 01:02:10 PM#

“1.2.2003 01:02:10 PM

Во всех примерах представлено следующая дата и время: 1 февраля 2003 года 13 часов 2 минуты 10 секунд.


2.4 Оператор присваивания

Оператор присваивания изменяет значение переменной, формат оператора:

Имя_переменной = Выражение

2.4.1 Арифметические выражения

В арифметических выражениях могут использоваться имена числовых переменных и именованных констант, неименованные числовые константы, а так же встроенные математические функции Visual Basic, и  функции созданные пользователем. В таблице ниже представлен порядок математических операций и правила их написаний.

Приоритет арифметических операций

Название операции

Написания знака в Visual Basic

Пример написания в Visual Basic

Пример написания в математике

Возведение в степень

^

А^B

AB

Изменение знака числа на обратный

-

-A

-A

Умножение и деление

*, /

A*B/C

A●B/C

Деление на цело

\

A\ B

A div B


Получение остатка от деления

Mod

A mod B

A mod B

Сложение и вычитание

+, -

A+B-C

A+B-C

Порядок выполнения арифметических операций в Visual Basic, так же как в математике, может быть нарушен скобками. Если в арифметическом выражении используется функция, то, прежде всего, компьютер вычисляет значение функций, а за тем, арифметические операции. Естественно, если арифметическое выражение является аргументом функции, в начале вычисляется арифметическое выражение, а затем функция по полученному аргументу.   

Математические функции

Название функции

Написания функции в Visual Basic

Пример написания в математике

Модуль числа

ABS(x)

|x|

Экспонента

Exp(x)

Ex

Натуральный логарифм

Log(x)

Ln(x)

Логарифм А по основанию B

Log(A)/Log(B)

Log В A

Квадратный корень

SQR(x)

x

Квадрат числа

SQRT(x)

Х2

Синус, косинус,

Тангенс, арктангенс

(аргументы тригонометрических функций задаются в Visual Basic в радианах!)

Sin(x), Cos(x),

Tan(x),  Atn(x)

Sin x, Cos x,

Tg x, Arctg x

2.4.2 Строковые выражения

В строковом выражении могут использоваться имена строковых констант и переменных, а также строковые функции, кроме того, возможно сложение значений двух и более строковых переменных:

L = “Visual ”

M = “Basic”

K = L+M

Переменной K присвоится значение “Visual Basic”

Строки можно складывать как знаком +, так и знаком &, который отделяется от идентификаторов и от неименованных констант пробелами. Причем знаком & можно приплюсовывать к строковому значению числовое без всякого преобразования:

K= ”Excel” & 2000

Переменной K присвоится текстовое значение “Excel2000”

Строковая переменная может не содержать в себе вообще символов т.е. иметь нулевую длину,  для “обнуления” строковой переменной применяются плотно сжатые двойные кавычки:

 K= ””

Переменная К имеет нулевую длину и в ней не содержится вообще символов.

В таблице ниже представлены функции для работы со строковыми переменными.

Функции для работы со строками

Имя Функции

Смысл функции

MID(Строка, N)

Выдает символы из указанной строки аргумента, начиная с символа имеющего порядковый номер N, и кончая последним символом в строке. Если число N больше чем длина строки аргумента, функция MID выдает пустую строку.

MID(Строка, _ N,N1)

Выдает N1 символов из указанной строки аргумента, начиная с символа имеющего порядковый номер N.

Len(Строка)

Выдает длину строки в байтах (функция может использоваться для определения размерности любой переменной, не только строковой)

Ltrim(Строка)

Выдает строку из строки аргумента, удаляя из нее все левые пробелы

Rtrim(Строка)

Выдает строку из строки аргумента, удаляя из нее все правые пробелы

Trim(Строка)

Выдает строку из строки аргумента, удаляя из нее все левые, и правые пробелы

INSTR(Строка1, _ Строка2)

Ищет Строку2 в Строке1, функция выдает значение 0, если указанная строка не найдена, или номер символа, откуда начинается вложение Строки2 в Строку1

Ucase(Строка)

Преобразует символы букв строки аргумента в верхний регистр

Lcase(Строка)

Преобразует символы букв  строки аргумента в нижний регистр

Left(Cтрока, N)

Выдает из строки аргумента N первых символов

Right(Cтрока, N)

Выдает из строки аргумента N последних символов, в том порядке, в котором они расположены в строке

2.4.3 Логические выражения

В логическом выражение используется имя логической переменной или константы, или неименованная логическая константа.  Перед именем логической переменной может стоять оператор Not отделенный от имени переменной пробелом, который отрицает значение логической переменной на обратное:

A = True

B = Not A

Значение переменной A будет равно True(Истине), а переменной B  False(Лжи)

Логическое выражение может быть представлено и следующим образом:

( ИмяПеременной ЗнакОтношения Значение )

где

 ИмяПеременной – Имя переменной или константа, или выражение, значение которого сравнивается с неименованной константой или другой переменной, или с другим выражением.

ЗнакОношения – знак определяющий отношение между переменной и значением (аналогичен знаку отношения условного оператора, который описан нами в данной книге в главе Операторы VBA,  в параграфе Условный оператор )

Значение –  значение, с которым производится сравнение (в качестве значения может использоваться переменная или константа, а так же, выражение).

Пример:

A = 10

B = ( A > 100 )

Переменная B будет иметь значение False(Ложь), т.к. значение переменной A не превышает число 100.

Кроме того, в логических выражениях могут применяться логические функции, о которых рассказано нами главе Операторы VBA,  в параграфе Условный оператор.

Сравнение строковых переменных в логических выражениях

При сравнении числовых переменных, понятно, значение какой переменной больше. Строковые переменные в логических выражениях сравниваются в компьютере по следующим правилам:

  •  Пустая строка меньше не пустой строки
  •  Строки равны только в том случаи, если они идентичны
  •  Строки неравны только в том случаи, если они не идентичны
  •  Строка А больше строки В если все символы строки B идентичны символам строки А, но строка А длиннее
  •   Строка А больше строки В если  ее первый символ больше по весу первого символа строки В
  •  Строка А больше строки В если  N символ строки А больше по весу N символа строки В, и все символы строки А идентичны символам строки В до N-1 символа включительно

Вес символа это целое число 0-255,  которым кодируется символ в строковой переменной. Большинство используемых в настоящее время кодировок символов составлены так, что выполняется следующее условие:

  •  Буквы кириллицы больше букв латиницы
  •  Заглавные буквы больше прописных
  •  Символы цифр имеют соответствующий вес к друг другу, т.е. “0” < ”1”, “1” < ”2” и т.д.

Помните, что при сравнении строковых переменных содержащих цифры, надо пользоваться правилами, указанными нами в данной главе,  а не сравнивать числовые значения строковых переменных.

Пример:

S  = “9”

S1 = “1234”

F = (  S  > S1  )

В примере указанном нами выше, переменная F  получи значение True. Т.к. первый символ строки S  больше по весу первого символа строки S1.

2.4.4 Выражения Data

В выражениях Data могут встречаться имена переменных или константы типа Data, кроме того, к значению переменой Data можно прибавить или отнять определенное количество дней.

Пример:

 D = “23.02.2002”

 D = D + 1

Переменной D с начало присвоили значение “23.02.2002”, что соответствует 23 февралю 2002 года, после, к значению переменной D прибавили один день, и ее значение в этом случаи будет равно  “24.02.2002”, т. е. 24 февралю 2002 года.

Если в переменой типа Data хранится время, ее значению можно прибавить или отнять часы, минуты и секунды по следующему правилу:

1/24*Часы

1/24/60*Минуты

1/24/60/60*Секунды

где

Часы  – количество прибавляемых часов

Минуты - количество прибавляемых минут

Секунды - количество прибавляемых секунд

Пример:

D = “13:00:00”

D = D  + 1/24  + 1/24/60*30  + 1/24/60/60*10

Переменной D с начало присвоили значение “13:00:00”, что соответствует 13 часам 00 минутам 00 секундам, после выполнения нового оператора присвоения значение переменной D изменилось на новое“14.30.10”, т. е. 14 часов 30 минут 10 секунд.

Если переменной Data присвоили значение только времени, и в результате прибавления часов, минут или секунд время в этой переменной переходит 24 часовой предел, то переменная Data меняет свой формат на полный, т.е. впереди выводится календарное число “31.12.1899”, а вслед за ним, через пробел время. Если в результате прибавления часов, минут или секунд к переменной Data время примет значение “00:00:00”то переменная Data переходит в короткий формат, и при выводе этой переменной будет видна только текущая дата после перехода этого временного режима переменная Data примет полный формат.

Пример изменения формата переменной Data в результате прибавления времени

Программа

Формат переменной Data в результате выполнения оператора присваивания

D = ”12:30:00”

D = D +1/24*12

D = ”31.12.1999 12:59:59”

D = D +1/24/60/60

”12:30:00”

”31.12.1899  00:30:00”

”31.12.1999 12:59:59”

“1.01.2000”

2.4.5 Выражения Variant

Переменной Variant можно присваивать выражение любого типа, при этом переменная Variant меняет свой тип соответственно присвоенному выражению. В независимости от типа присвоенного переменой Variant данные в ней хранятся строковом формате, и если вы хотите экономить оперативную память целесообразно объявлять ячейки массива в котором хранятся числа, числовым типом, а не Variant, т.к. при использовании числового типа размер ячейки массива строго определен, и, в ряде случаев он более компактен, чем представление чисел в строковом формате.  Нецелесообразно использование переменной Variant в некоторых циклах, т.к. компьютер значительно быстрее осуществляет сложение числового типа, чем переменной Variant. Переменная Variant наиболее удобна в качестве входного параметра подпрограммы.

В зависимости от присвоенной неименованной константы переменная Variant меняет соответственно тип, но, сделать переменную Variant типом Data можно только использовав формат Data, заключенный в символы # (или использовать функцию преобразования типов CDate), все данные в символах “ воспринимаются переменной Variant как строковые.

2.4.6 Смешанные выражения  

Хотя интерпретатор VBA делает все возможное для того чтобы преобразовать типы переменных в смешанных выражениях, все же, при запуске программы, и при использовании различных типов в выражении, может возникнуть ошибка: “Несоответствие типа”. Для устранения такой ошибки существуют функции преобразования типов.  

Функции преобразования типов

Имя Функции

Смысл функции

СSTR(Число)

Преобразует число в строку

STR(Число)

Преобразует число в строку.  Строка значения данной функции в отличие от функции CSTR, начинается с символа пробел.

Val(Строка)

Преобразует строку в число, если в указанной строке нет символов цифр, данная функция выдает 0.

CHR(КодСимвола)

Преобразует код указанного символа в его строковое значение

ASC(Строка)

Выдает код первого символа в строке аргумента

Cint(ВещественноеЧисло)

Преобразует вещественное число в короткое целое путем округления числа, при спорном округлении, функция округляет число до ближайшего четного числа.


CLng(
ВещественноеЧисло)

Преобразует вещественное число в длинное целое путем округления числа, при спорном округлении, функция округляет число до ближайшего четного числа.

CDate(СтроковоеВыражение)

Преобразует строковое выражение в формат Data

2.5 Функции определения типа переменной 

Иногда бывает необходимо определить тип переменной, например, текущий тип переменной Variant.  Существует функция, которая выдает имя типа указанной переменной в строковом формате:

TypeName(ИмяПеременной)

Для того, что бы определить является ли переменная массивом, используют функцию логического типа:

IsArray(ИмяПеременной)

Данная функция выдает значение True если переменная является массивом, и False – в противном случаи.

Функцией TypeName тоже можно определить является ли переменная массивом, используя дополнительную  строковую функцию:

 INSTR( TypeName(ИмяПеременной) , ”(” )

Выражение,  записанное нами выше, будет не равно нулю только в том случаи, если переменная указанная в функции TypeName будет являться массивом. Т.к. в значении функции TypeName помимо имени типа будут содержаться символы скобок “( )”,  указывающие на то, что переменная массив.

2.6 Функция форматного преобразования переменной в строковый формат

Существует функция форматного преобразования числовых переменных и переменных дата в строковый формат. Формат вызова данной функции следующий:

Format(ИмяПеременой [, ФорматВывода] ) 

где

ИмяПеременой – имя переменной или константа для преобразования

ФорматВывода – формат вывода переменной выраженный в строковом формате

Символы числовых форматов

Символ формата

Назначение

#

Определяет максимально допустимое количество выводимых символов после запятой.  До запятой определяет положение разделителя разряда

0

Определяет количество позиций числа до и после запятой. Не занятая позиция числа заполняется символом 0. Целая часть числа выводится полностью, даже если число символов в целой части превышает указанное значение

.

Применяется в начале описания формата дробной части числа

,  или (‘) 

 

Указывает положение разделителя разрядов в числе

Примеры форматного преобразования числовых данных

Программа

Значение переменных

S  = Format(123.5, "00.00")

S1 = Format(23.578, "000.#")

S2 = Format(23.578, ".00")

S3 = Format(23.578, ".##")

S4 = Format(23.578, ".###")

S5 = Format(12005.578,  "#,###.###")

S6 = Format(12005.578,  "####.###")

S  = "123,50"

S1 = "023,6"

S2 = "23,58"

S3 = "23,58"

S4 = "23,578"

S5 = "12 005,578"

S6 = "12'005,578"

Кроме вышеперечисленных символов возможно в формате переменных использовать другие символы, которые можно добавлять до, или после символов формата. При этом функция Format будет выводить перед или после преобразованного числа указанный символ.

Добавление к формату символа

Программа

Значение переменной

S1 = Format(12005.578, "#,###.##$")

S2 = Format(12005.578, "#,###.##р.")

S1 = "12 005,59$"

S2 = "12 005,59р."


Символы  форматов переменной Date

Символ формата или латинская буква в формате

Назначение

:

Разделитель разрядов времени

/

или символ точка ( . )

Разделитель разрядов даты

D

Определяет возможность вывода  и количество позиций календарной даты

M

Определяет возможность вывода  и количество позиций номера месяца или  минут в соответствующем формате данных

Y

Определяет возможность вывода года и количество позиций под вывод года

S

Определяет возможность вывода  и количество позиций секунд


Примеры форматного преобразования переменной Date

Программа

Значение переменных

Dim d As Date

d = "1.2.2003 13:02:10"

S = Format( d,  "d.mm.yyyy")

S1 = Format( d, "hh:mm")

S2 = Format(d, "hh:mm:ss")

S3=Format(d,  "dd.mm.yy hh:mm:ss")

S  = "1.02.2003"

S1  = "13:02"

S2  = "13:02:10"

S3= _

"01.02.0313:02:10"

Помимо форматного преобразования числовых переменных  возможно функцией Format преобразовать символы букв в строковой переменной в верхний или в нижний регистр:

Преобразование строковых переменных

Программа

Значение переменной

S1 = Format( “Visual Basic”, ">")

S2 = Format(“Visual Basic”, "<")

S1 = "VISUAL BASIC"

S2 = "visual basic"

3 Подпрограммы ( процедуры и функции )

3.1 Описание подпрограмм 

Описание процедур и функций осуществляется в общей области модуля после описания глобальных переменных и полей модуля. В некоторых языках программирования заголовок процедуры содержит служебное слово Procedure, а функции, как и в языке VBA - Function. Английское слово Function переводится как функция. А слово Procedure  - процедура, деяние, часть процесса. Служебное слово Sub в заголовке процедуры VBA буквально можно перевести как приставку “под”.  Однако, служебное слово Sub является сокращением составного служебного слова  SubRoutine.  Что обозначает буквально под-рутина или под-порядок.  Программисты языка Visual Basic переводят это слово как подпрограмма (что не совсем правильно, буквальный перевод слова подпрограмма на английский язык - SubProgram) и термином подпрограмма  обозначают то, что мы называем процедурой в этой книге. А термином процедура обозначают оба вида подпрограммных конструкций. Мы, по привычки, использовали в этой книге  терминологию, которая больше подходит для языка Pascal и Delphi.

Описание процедуры:

[PRIVATE / PUBLIC] [Static] SUB ИМЯ_процедуры( [ Входные параметры процедуры ]  )

Тело процедуры

 

.

[Exit Sub]

.

END SUB

Описание функции:

[PRIVATE / PUBLIC] [Static] Function ИМЯ( [ Входные параметры  функции ] ) [as тип]

Тело Функции

 

.

 ИМЯ_функции = Значение

[Exit Function]

.

END Function

 


Описание подпрограммы может начинаться со служебного слова PRIVATE или PUBLIC. Если вышеуказанные служебные слова опущены, или описание подпрограммы начинается со служебного слова PUBLIC,  то ее можно вызывать по имени из любой процедуры или функции в любом модуле проекта.

Если описание подпрограммы начинается со служебного слова PRIVATE, то она доступна только внутри того модуля, в котором она описана.

Если перед именем подпрограммы стоит служебное слово Static, то все локальные переменные сохраняют свое значение установленное при предыдущем запуске подпрограммы. В противном случаи в языке VBA можно выборочно объявить переменные, которые будут сохранять свои значения, установленные при предыдущем запуске подпрограммы.  В этом случаи, когда заголовок подпрограммы не содержит служебного слова Static,  значение локальных переменных объявленных  служебным словом Dim обнуляется при каждом запуске подпрограммы, а переменные, объявленные служебным словом Static будут сохранять свои значения. Объявляются переменные служебным словом Static так же, как и оператором Dim ( см. Объявление переменных и констант ).

Пример:

Static SUB Первая

Dim A as  long

A = A+1

END SUB


SUB  Вторая

Dim A as  long

Static B as long

A = A+1

       B = B+1

END SUB

В данном примере, при каждом новом запуске процедуры Первая значение локальной переменной A  будет увеличиваться на единицу. Т.е. после первого запуска процедуры значение переменной будет A=1, после второго A=2 и т. д.  При каждом новом запуске процедуры Вторая значение локальной переменной  A будет обнуляться. И после выполнения оператора присвоения A = A+1 значение переменной будет A=1, вне зависимости от количества запусков процедуры Вторая. Значение же переменной B будет меняться. Т.е. после первого запуска процедуры значение переменной будет B=1, после второго B=2 и т. д.

Тип функции в VBA как правило опускается, и при этом функция становится универсального типа Variant. Алгоритм функции должен содержать оператор присвоения значения функции.

Можно досрочно выйти из подпрограммы, применив соответствующий оператор:

Exit Sub, Exit Function 

3.2 Входные параметры подпрограммы

В описательной части процедуры или функции за ее именем в скобках могут быть описаны входные параметры подпрограммы. Входные параметры подпрограммы – это имена входных переменных, которые используются в теле подпрограммы.

Входные параметры описываются через запятую, по следующему принципу:

[Вид]  Имя_Входного_Параметра[ (  ) ]  [as тип] [=Значение]

где

Вид – Служебное слово определяющее вид входного параметра

тип –Тип входного параметра (Если служебное слово as с типом  опущено, то входной параметр имеет тип Variant)

Если за именем входного параметра типа ByRef  или ВуVal  набраны скобки, то данный входной параметр является динамическим массивом, и получает значения от переменных, являющимися массивами. Но только не от переменных объявленных функцией Array. Получить значение от массива  объявленного функцией Array входными параметрами ByRef  и ВуVal  можно только в том случаи, если указанные нами параметры имеют тип Vаriant и не содержат за своим именем скобок. Во входные параметры ByRef  и ВуVal  типа Variant, имена которых не содержат скобок, можно передавать массивы объявленные любым из способов описанных нами в главе Структурированные типы VBA – Массивы. Но только не массивы записей.  Входной параметр ByRef  и ВуVal получающий значение от массива записей должен обязательно иметь в конце имени скобки, и должен иметь тип соответствующей записи.  

Значение – Начальное значение входного параметра по умолчанию (применяется в необязательных входных параметрах Оptional, если в данных входных параметрах значение опущено, то входной необязательный параметр по умолчанию имеет пустое значение, либо нулевое значение, если указанный параметр числового типа)

Виды входных параметров 

Название

Функция параметра

ByRef

(или отсутствует служебное слово, определяющее Вид входного параметра)

Значение входного параметра передается той переменной, которая задала ему начальное значение  ( Т.е. параметр данного типа является указателем или ссылкой на переменную, задавшему ему начальное значение. )

ВуVal

Значение входного параметра не передается той переменной, которая задала ему значение ( Т.е. параметр данного типа получает только значение от переменной, и не является указателем или ссылкой на последнюю)

Оptional

Необязательный входной параметр.  Вслед за ним все остальные входные параметры должны быть необязательными. Параметр Optional  не может быть использован вместе с входным параметром ParamArray.

ParamArray

Необязательный входной параметр.  Используется только в качестве последнего входного параметра. Этот параметр всегда должен иметь тип Variant, и он не может быть использован вместе с входным параметром Оptional. В этот параметр можно передать список значений переменных и (или) констант любого неструктурированного типа. За именем этого входного параметра обязательно должны идти скобки, которые обозначают, что параметр является динамическим массивом. Просмотреть все  элементы ParamArray можно через специальный цикл For each. Ниже в примере показана пользовательская процедура, которая выводит список значений входных переменных разделенный пробелами в окно вывода:

Sub print1(ParamArray V( ))

Dim s as string, n as variant

s = ""

For Each n In V

 s = s + " " & n

Next n

MsgBox s, , "Окно Вывода"

End Sub

3.3 Вызов подпрограмм

Вызвать процедуру или функцию можно по ее имени, вслед за которым пишется список входных параметров через запятую, причем, если вызывается функция, список входных параметров берется в скобки, а при вызове процедуры скобок не ставят, если только она не вызывается служебным словом Call:

‘Запуск процедуры

Имя_Процедуры  Список входных параметров через запятую

‘Альтернативный  способ запуска процедуры

Call Имя_Процедуры ( Список входных параметров через запятую)

‘Пример запуска функции. Переменной А присвоено значение

‘ соответствующей функции

A = Имя_Функции(Список входных параметров через запятую)

Вышеописанный вызов подпрограмм, справедлив для процедур и функций описанных и вызываемых внутри одного и того же модуля, и для тех PUBLIC  подпрограмм, которые описаны в модуле макросов, и имена которых не совпадают с именами  других  PUBLIC  подпрограмм, описанных в других модулях проекта.

В остальных случаях , при вызове PUBLIC  подпрограммы, необходимо писать полный путь к ней, т.е. с начало имя модуля, где подпрограмма описана, затем, через точку, имя самой подпрограммы:

Имя_модуля.Имя_Процедуры  [ Список входных параметров]

A = Имя_модуля. Имя_Функции( [Список входных параметров])

При вызове подпрограммы компьютер начинает выполнять операторы, записанные в теле последней, а затем, возвращается в ту точку программы, откуда была подпрограмма вызвана. И начинает выполнять те операторы, которые записаны за именем вызванной подпрограммы.

Список входных параметров может содержать список переменных и(или) именованных и неименованных  констант разделенных запятыми, которые передают значения входным параметрам подпрограммы.

Если входной параметр необязательный, его можно пропустить, поставив запятую без указания его значения, или задать значение входному параметру по его имени:

Имя_необязательного_параметра := Значение

Пример:

Summa A:=25, С:=30

Summa 25,  ,  30

Summa A:=25, B:=10, С:=30

Summa 25,  10,  30

В первой и второй строке примера вызвана процедура Summa,  и входному параметру A передано значение 25, а входному параметру С – значение 30.  А входному параметру B никаких значений не передано. В третьей и в  четвертой строке примера входному параметру A передано значение 25, параметру B – значение 10 и параметру С – значение 30.

 Приведем  другой  пример вызова подпрограмм  имеющих входной параметр ByRef  и ByVal.

'Входной параметр являющийся ссылкой

Sub plus(ByRef r As Long)

 r = r + 1

End Sub

'Входной параметр не являющийся ссылкой

Sub NoMinus(ByVal r As Long)

 r = r - 1

End Sub

Sub ВызовДругихПодпрограмм()

Dim M As Long

 M = 0

‘Вызываем подпрограмму

plus M

‘Вызываем подпрограмму

 NoMinus M

End Sub

После вызова подпрограммы Plus из процедуры ВызовДругихПодпрограмм значение переменной M будет равно 1, т.к. поначалу входному параметру r процедуры Plus переменная M передаст значение 0. Затем входной параметр увеличится на единицу и его значение будет передано переменной M. При вызове процедуры NoMinus входному параметру r переменная M передаст значение 1.  Но входной параметр указанной процедуры не передаст свое значение 0 переменной M, т.к. он объявлен служебным словом ByVal.  Т.е. переменная M сохранит свое значение 1 при вызове процедуры NoMinus.

3.3.1 Изменение вида входного параметра при вызове подпрограммы

Даже если входной параметр подпрограммы описан как ByRef , VBA позволяет изменить его вид на ByVal при вызове подпрограммы. Для этого, имя переменной, которая изменяет значение входного параметра, берется в круглые скобки. Переменная, имя которой взята в скобки не получает ссылку от входного параметра.

Пример:

‘Принудительный запрет ссылки от входного параметра для переменных A и С в функции

A1 = ИмяФункции( (А), B, (С) )

‘Принудительный запрет ссылки от входного параметра для переменных A и С в процедуре

ИмяПроцедуры  (А), B, (С)

Указанный нами способ смены вида входного параметра при вызове подпрограммы применяют, например,  в том случаи, если возникает конфликт типов входного параметра и переменной задающей ему значение. Или если не хотят получать значение от входного параметра объявленного как ByRef.  

3.4 Описание событийной процедуры объекта

Событийная процедура не отличается по идеологии от обычной процедуры, но она, в отличии от обычной процедуры, выполнятся во время определенного события происходящего с объектом, формат ее описания следующий:

 PRIVATE  SUB ИМЯОбъекта_ИмяСобытия (  [ Входные параметры процедуры ] )

Тело процедуры

 .

.

[Exit Sub]

.

.

END SUB

Заголовок событийной процедуры не вводится программистом VBA с клавиатуры,  для ввода событийной процедуры используется два списка, расположенных над окном редактора модуля VBA.  Из левого списка выбирается имя объекта, из правого событие происходящее с объектом (см. главу 2.1 Структура модуля), после чего,  в редакторе модуля появляется пустая событийная процедура.

Событийная процедура описывается как PRIVATE, т.е. эта процедура не доступна в других модулях, т.к. программист обычно эту процедуру не вызывает из других подпрограмм проекта. Хотя есть возможность заменить программисту тип этой процедуры на PUBLIC, и вызывать ее из других модулей, используя полный путь к данной процедуре.

3.5 Рекурсивные подпрограммы (процедуры и функции)

Возможна рекурсия подпрограммы (процедуры или функции). Рекурсия подпрограммы происходит тогда, когда подпрограмма вызывает выполнение самой себя. Классическим примером рекурсии является функция вычисляющая факториал числа n (n!). Аргументом функции факториал может быть целое число большее или равное 0. Формула факториала следующая:

Пример вычисления факториала чисел 0,1,2,3 :

0! =1

1! =1

2! = 2 * 1 = 2

3! = 3 * 2 * 1 = 6

Для вычисления факториала в VBA применим следующую рекурсивную функцию:

Function fact(ByVal n As Byte) As Double

If  n <= 2 Then

 fact = n

Else

 fact = fact(n - 1) * n

End If

End Function

Иногда, в данном примере, в операторе If   устанавливают другое условие выполнения ( n <= 1), но это излишни, поскольку n*1 = n.

При вычислении факториала числа 3 указанной нами функции, с начало, переменная n будет равна 3 и произойдет первый рекурсивный запуск функции fact. При этом, значение переменой n=3 будет помещено в специальную область памяти, называемую стек. А переменная n примет значение n=2, после того, как функция fact будет вызвана снова. При n=2, как видно из программы, функция fact примет значение переменной n, т.е.  fact = 2. Затем, будет вычислено произведение функции со всеми значениями переменной n находящимися в стеке. Т.е. значение функции fact станет fact = fact * 3 = 2 * 3 =6. В стек может помещаться несколько значений переменной, поэтому данной функцией можно вычислить факториал чисел 4, 5 и т.д.

Возможно переполнения стека. Но в нашем примере таково не произойдет, потому, что раньше произойдет переполнения разрядной сетки для типа функции Double. Не целый, числовой тип функции fact задан нами не случайно, если бы мы использовали тип Long, то данной функцией можно было бы вычислить факториал  до числа 12, при использовании типа Double можно вычислить факториал до числа 170. Переполнение стека часто возникает из-за неправильно составленной программы. Возможна ситуация при которой процедура или функция будет вызывать себя постоянно, что вызовет переполнения стека. Например, если запустить процедуру, указанную нами ниже, то произойдет ошибка “недостаточно стековой памяти”, из-за того, что в стеке будет содержаться слишком много вызовов процедуры NN.

Sub NN()

 NN

End Sub

В языке VBA допускается использование имени функции внутри выражения, при этом, если в теле функции имеется выражение в котором используется ее собственное имя, но за именем функции не указываются входные параметры последней, то рекурсия для функции не происходит. В примере ниже показана такая ситуация. Функция SA  предназначена  для вычисления среднего арифметического  всех входных необязательных параметров функции.

Function  SA( ParamArray V())

 Dim n , D as long

 SA = 1

 D = 0

 For Each n In V

 SA = SA * n

D = D +1 

Next n

 SA = SA / D

End Function

4 Операторы VBA

4.1 Условный оператор If

Обеспечивает выполнение части программы по определенному условию. Имеется однострочная (реликтовая) и многострочная форма условного оператора. Так же, условный оператор имеет неполную и неполную форму описания. Кроме того, в этом операторе может содержаться несколько условий для выполнения определенных групп операторов. При неполной форме оператора по заданному условию выполняется группа операторов находящихся за служебным словом Then. При полной форме условного оператора помимо условного выполнения операторов за служебным словом Then, выполняются еще операторы за служебным словом else, в том случаи, если указанное условие не выполняется. Когда условный оператор содержит несколько условий выполнения, то, выполняется определенная группа операторов по определенному условию, или выполняется группа операторов находящихся за служебным словом Else, если ни одно из указанных условий не выполнено.

Виды условного оператора

Название

Многострочная форма

Однострочная форма

Не полная форма

If Условие Then

.

Операторы

.

End If

If Условие Then Оператор

Полная форма

If Условие Then 

Операторы1

Else

Операторы2

End If

If Условие Then Оператор1 _

else Оператор2

Несколько условий выполнения в условном операторе

If Условие1 Then 

Операторы1

ElseIf Условие2 Then

 Операторы2

.

.

.

[Else

ОператорыElse]

End If

If Условие1 Then Оператор1 else   _

If Условие2 Then  Оператор2  _

[else  операторElse]

В условии производится сравнения значения двух переменных, или переменной и константы, или переменной и выражения, или сравнивается значение двух выражений. Знак отношения и имена переменных или константы отделятся друг от друга пробелом.  Возможно задания условия без знака отношения в том случаи, когда в качестве условия используется имя логической переменной. В этом случаи условия будет истинно, если значение логической переменной будет истинно, и ложно в другом случаи.


Знаки отношения

Название знака

Знак в VBA

Знак в математике

Равно

=

=

Неравно

< >

Больше

>

>

Меньше

<

<

Меньше, либо равно

<=

Больше, либо равно

>=

Имеется возможность объединять несколько условий в одно, а так же отрицать условие при помощи логических функций. Имена логических функций отделяются от имен переменных пробелами, порядок выполнения логических функций может быть нарушен скобками.  

Логические функции в порядке приоритета

Название и функция

Имя функции

Пример условия

Логическое отрицание.

Условие истинно, если оно ложно и наоборот.  В данном примере условие будет истинно, если значение переменной А будет меньше, либо равно 5.

Not

Not   A>5

Логическое “И”.

Все условие истинно, если истины все условия объединенные AND–ом. И все условие ложно, если хотя бы одно из условий объединенных AND–ом ложно. В данном примере условие будет истинно только тогда, когда A>5 и, одновременно, B<3

AND

A>5 And B<3

Логическое “ИЛИ”.

Все условие истинно, если хотя бы одно из условий объединенные OR–ом истинно. И все условие ложно, если все условия объединенные OR–ом ложны. В данном примере условие будет истинно тогда, когда A>5 или B<3. И будет ложным только в том случае, когда A≤5 и B ≥3.

OR

A>5 OR B<3

4.2 Оператор выбора Case

Является разновидность условного оператора. Формат оператора:

Select Case Имя_Переменной_Case

Case списокВыражений1

Операторы1

Case списокВыражений2

Операторы2

.

.

[Case Else

ОператорыElse]

End Select

где

Имя_Переменной_Case – имя числовой или строковой переменой, по значению которой осуществляется выполнение операторов Case.

СписокВыражений – выражения, определяющие значения переменной

Если значение Переменной_Case удовлетворяет СписокВыражений1, то выполняются Операторы1,  если удовлетворяет СписокВыражений2, то выполняются Операторы2 и т.д. Если значение Переменной_Case не найдено ни в одном из СписоковВыражений, то выполняются ОператорыElse.

В каждом выражении Case допускается использование нескольких выражений или диапазонов, которые отделяются друг от друга запятыми.  

Выражение

Выражение или диапазон

Пример

Функция

Имя переменной или константы, или неименованная константа, или выражение, со значением которого сравнивается Переменная_Case

Case 5

   Операторы

Операторы под Case выполняются, если значение Переменной_Case равно 5.

Нач. значение to Кон. Значение

Диапазон значений для Переменной_Case

Case 1 to 5

   Операторы

Операторы под Case выполняются, если значение Переменной_Case лежит в диапазоне от 1 до 5

Is ЗнакОтношения Значение

Диапазон значений для Переменной_Case

Case Is >5

  Операторы

Операторы под Case выполняются, если значение Переменной_Case больше 5.

4.3 Операторы цикла

Позволяют повторить выполнение группы операторов по заданному условию. Оператор цикла имеет Заголовок, в котором, обычно, пишется условие повторения цикла. Тело цикла – те операторы, которые будут повторяться по заданному условию. Конец цикла – строчка, завершающая тело цикла.

4.3.1 Циклы for 

Оператор цикла For .. Next

Формат оператора:

For  ПЦ = Нач.Значение To Кон.Значение [Step Шаг]

 

Тело цикла

 .

.

[Exit For]

.

.

Next ПЦ

 где

Forначало заголовка цикла

ПЦ – переменная цикла, любая числовая переменная или переменная типа data.

Нач.Значение – начальное значение ПЦ

Кон.Значение – конечное значение ПЦ

Шаг величина на которую ПЦ наращивается при каждом новом выполненном цикле.

(если Шаг со служебным словом Step опущен, то ПЦ наращивается на величину равную 1)

Next ПЦконец цикла

Цикл for выполняется по следующему алгоритму:

1)ПЦ присваивается начальное значение.

2)В зависимости от величины шага проверяется условие:

ПЦ ≤ Конечного значения (при положительном шаге)

ПЦ ≥ Конечного значения (при отрицательном шаге)

3)Если условие указанное в пункте 2 настоящего алгоритма истинно, выполняется тело цикла, в противном случаи цикл завершается.

4) ПЦ наращивается на величину шага и происходит возврат к пункту 2 настоящего алгоритма

Оператор цикла For Each .. Next

Формат оператора:

For Each ПЦ in ПеременнаяОпроса

 

Тело цикла

 .

.

[Exit For]

.

.

Next ПЦ

 где

For Eachначало заголовка цикла

ПЦ – переменная цикла типа Vаriant

ПеременнаяОпроса – структурированная переменная, например, динамический массив, с неизвестным количеством ячеек. 

Next ПЦ  – конец цикла

Цикл For Each продолжается до тех пор, пока не будут опрошены все ячейки ПеременнойОпроса. При каждом новом цикле в ПЦ помещается значение очередной ячейки ПеременнойОпроса.

Досрочный выход из циклов For 

Из циклов  For можно досрочно выйти использовав оператор Exit for.

4.3.2 Оператор цикла While .. Wend

Формат оператора:

While УсловиеВхода

Тело цикла

 .

.

.

Wend

где

 Whileначало заголовка цикла

УсловиеВхода – условие входа в цикл, задается по тем же правилам, по которым задается условие в операторе If.

Wendконец цикла

В теле цикла While должен обязательно содержаться алгоритм, который изменит условия входа в цикл, в противном случаи может возникнуть такая ситуация, при которой цикл While будет работать бесконечно.

Цикл While выполняется по следующему алгоритму:

  1.  Проверяется условие входа в цикл.
  2.  Если условие входа в цикл ложно покидается цикл, иначе продолжаем настоящий алгоритм
  3.  Выполняется тело цикла и происходит возврат к пункту 1 настоящего алгоритма

4.3.3 Циклы DO

Оператор цикла Do While .. loop

Формат оператора:

Do While УсловиеВхода

 

Тело цикла

 .

[Exit Do]

.

Loop

где

 Do Whileначало заголовка цикла

УсловиеВхода – условие входа в цикл, задается по тем же правилам, по которым задается условие в операторе If.

Loopконец цикла

Цикл Do While аналогичен циклу While, но в отличии от него имеет возможность досрочного выхода из цикла.


Оператор цикла Do  .. Loop Until

Формат оператора:

Do

 

Тело цикла

        .

.

[Exit Do]

.

.

Loop Until УсловиеВыхода

где

 Do начало заголовка цикла

Loop Untileконец цикла

УсловиеВыхода – условие выхода из цикла, задается по тем же правилам, по которым задается условие в операторе If.

В теле цикла Do  .. Loop Until должен обязательно содержаться алгоритм, который изменит условия выхода, в противном случаи может возникнуть такая ситуация, при которой цикл Do  .. Loop Until будет работать бесконечно.

В отличии от всех вышеперечисленных циклов, тело цикла Do .. Loop Until выполняется хотя бы 1 раз.

Цикл Do  .. Loop Until  выполняется по следующему алгоритму:

  1.  Выполняется тело цикла
  2.  Проверяется условие выхода из цикла
  3.  Если условие выхода из цикла истинно, то цикл  покидается, в противном случаи происходит возврат к пункту 1 настоящего алгоритма.

Другие циклы DO

Существует еще три вида цикла Do:

  •  Do Until  … Loop – цикл начинает выполняться в том случаи если в заголовке цикла условия за Until  ложно. Прекращается выполнение цикла, когда условие за Until истинно.
  •  Do  … Loop While – цикл выполняется в любом случаи, хотя бы один раз, и цикл повторяется если условие в конце цикла записанное за служебным словом While истинно.
  •  Do  … Loop вечный цикл, который выполняется в любом случаи. Из данного цикла можно выйти только оператором Exit Do.

Досрочный выход из циклов DO

Из циклов Do  можно досрочного выйти использовав оператор Exit Do.

4.4 Оператор ЕND (досрочное завершение программы)

Оператор END часто завершает какую-либо конструкцию VBA, в этом случаи за оператором END идет название той конструкции, которую он завершает:

END Sub  - завершение процедуры

END Function  - завершение функции

END If  - завершение оператора If

и др.

Если за оператором END нет никаких служебных слов то он останавливает работу подпрограммы в которой находится, причем завершается работа алгоритма не только той подпрограммы, в которой находится END, но и тех подпрограмм, которые вызвали ее выполнение.

4.5 Оператор Exit (досрочный выход из подпрограмм и циклов)

Позволяет досрочно выйти из подпрограммы или цикла, за оператором Exit всегда идет имя конструкции из которой осуществляется выход:

Exit Subвыход из процедуры

Exit Forвыход из циклов For

и др.

В отличии от оператора END, оператор Exit вызывает остановку работы только той подпрограммы, в которой он находится, те подпрограммы, которые вызвали работу вышеуказанной подпрограммы, продолжают свое выполнение.

4.6 Оператор перехода GOTO

Вызывает переход программы на указанную метку, формат оператора:

GOTO Метка

Метка может задаваться двумя способами, реликтовым, указывающем номер строки, куда осуществляется переход,  в этом случаи метка задается в виде целого числа, отделенного от оператора пробелом, который расположен на соответствующей строке для перехода. В другом случаи имя метки задается по правилам задания идентификаторов, за которым следует двоеточие, эта метка располагается на отдельной строке, как показано в таблице ниже.


Примеры операторов безусловного прехода

Реликтовая метка

Метка языка VBA

GOTO 100

.

.

.

.

.

100 A= 10

GOTO M1

.

.

.

.

.

M1:

A= 10

В обоих примерах осуществляется переход на указанную метку. Оператор GOTO и метка должны находится в одной и той же подпрограмме.  

Если оператор GOTO расположен в плечах оператора условия, то такой оператор GOTO вызывает условный переход, если этот оператор стоит самостоятельно, на отдельной строке (как показано в примерах), то такой GOTO вызывает безусловный переход.

Оператор GOTO практически не используется в языке VBA, из-за того, что данный язык программирования достаточно совершенен и не нуждается в использовании операторов условного и безусловного перехода, которые затрудняют чтение программы для программиста.

Единственное, где используется данный оператор в VBA, это оператор обнаружения ошибок.

4.7 Оператор On Error (обнаружения ошибок)

Позволяет обнаружить аппаратную ошибку, которая может вызвать остановку программы:

  •  Деление числа на нуль
  •  Переполнения разрядной сетки
  •  Сбой при считывании или записи информации на магнитный носитель
  •  Обращение к несуществующему устройству и т. п.

Формат оператора:

 On Error GOTO Метка_ухода_от_ошибки

.

.

.

Exit Sub / Exit Function

Метка_ухода_от _ошибки:

[Msgbox “Ощибка :”    [&  Err.Number]  ]

Переход в случаи ошибки

где

On Errorоператор обнаружения ошибки

GOTO -  оператор перехода, указывающий метку, на которую нужно перейти в случаи возникновения ошибки в защищаемом коде

Метка_ухода_от _ошибки – имя метки, на которую осуществляется переход программы в случаи возникновения ошибки

Exit Sub / Exit Functionодин из двух операторов, соответствующий типу подпрограммы, в которой находится оператор On Error 

Msgboxокно сообщений, в котором выводится сообщение о том что ошибка в подпрограмме произошла.

“Ощибка :” – текст сообщающий о том, что ошибка произошла

Err.NumberОбъект, в свойстве Number  которого, храниться номер произошедшей ошибки

Оператор On Error имеет и другой способ вызова:

Err.Clear

On Error Resume Next

Оператор

‘Очистим содержимое объекта Err

‘Отключить на последующем операторе остановку программы по ошибке

Защищаемый оператор

где

On Error Resume Nextотключить остановку программы по ошибке в первом операторе после On Error

Оператор  защищаемый оператор от программной ошибки

Если Оператор вызовет аппаратную ошибку, то, остановки программы не произойдет, а продолжится выполнение последующих за ним операторов.  Через свойство объекта Err.Number можно определить произошла ли аппаратная ошибка в первом операторе, записанным после программной инструкции On Error Resume Next ,  Err.Number < > 0  если ошибка произошла, и, Err.Number = 0  в противном случаи. Перед запуском оператора On Error Resume Next полезно применить метод Err.Clear  для очистки свойства Err.Number, т.к. в этом свойстве может быть уже накоплен код ошибки выполнения сохранившийся при другом запуске оператора On Error Resume Next.

4.8 Оператор With (обращения к полям структурированных типов,  а так же к методам и к потомкам объектов)

Позволяет обратиться к полям (или методам)  соответствующей переменной или объекта, не повторяя их имя.

Формат оператора:

With Имя

.ИмяПоля1 = значение

.ИмяПоля2 = значение

.ИмяМетода

.ИмяПотомка.Свойство/Метод

End With

где

 Имя – имя соответствующей переменной или объекта.

.ИмяПоляимя поля, перед которым должна обязательно стоять точка.

.ИмяМетода – имя метода объекта, перед именем которого должна обязательно стоять точка.

.ИмяПотомка..Свойство/Метод – имя потомка указанного в With объекта, перед именем которого должна обязательно стоять точка, за именем потомка через точку, обращаются к его свойству или методу.

4.9 Оператор Set (установка и снятие указателя )

Позволяет установить указатель на объект или переменную.

Set ИмяУказателя = ИмяПеременной

 

Указатель может быть либоVariant типа, либо типа того объекта, на который он указывает. Указатель получает свойства и методы того объекта, на которого он указывает. Изменения свойств указателя, влекут за собой изменения в тех объектах, на которые установлен указатель. Указатель применяется для “сокращения” имени объектов и пути к объектам-потомкам. Для управления объектом через указатель. А так же, в VBA, для создания массивов объектов:

DIM  A(1 to 4) as Variant

Set A(1) = Textbox1

Set A(2) = Textbox2

Set A(3) = Textbox3

Set A(4) = Textbox4

For i=1 to 4

A(i).Text =””

Next i

В данном примере были установлены следующие указатели: ячейка A(1) на объект Textbox1, ячейка A(2) на объект Textbox2 и т.д. Затем, в цикле,  произошло присвоение пустой строки свойству Text всех четырех объектов, на которые установлены указатели.

Для того чтобы снять указатель используют следующую программную конструкцию:

Set ИмяУказателя = Nothing 

Указанный в примере формат вызова оператора Set применяется также для высвобождения памяти занятой экземпляром объекта или класса.  О создании экземпляров оператором Set рассказано нами в следующем параграфе.

4.10 Оператор New (создание экземпляров)

Оператор New применяется для создания экземпляров некоторых объектов (например, форм), а так же при создании нового семейства (см. Структурированные типы VBA- Семейства), и, для создания объектов являющимися экземпляром пользовательского и другого класса (см. Приложение 5).  Этот оператор применяется совместно с оператором Set ,  а так же со служебными словами языка VBA объявляющими переменные и поля модуля (Dim, Static, Private, Public). Служебными словами Static, Private, Public экземпляр создается точно так же, как и служебным слово Dim. Экземпляр создается следующим образом:

 Dim Имя_экземпляра New Имя_Объекта или Класса_для_копии

Set Имя_экземпляра = New Имя_Объекта или Класса _для_копии

В данном примере оператор Set не создает указатель на объект (о чем рассказано нами в предыдущем параграфе), а создает его новый экземпляр в памяти компьютера. Переменная, через которую создают экземпляр объекта оператором Set,  должна иметь тип Variant или должна быть объявлена тем типом объекта или класса, с которого делают копию.  Оператором Set возможно так же высвободит память компьютера занятую экземпляром (о чем рассказано нами в предыдущем параграфе).

4.11 Оператор DoEvents (Прерывание работы подпрограммы)

Функция, которая выдает число загруженных форм и вызывает прерывание подпрограммы (передает ненадолго управление операционной системе). В VBA данная функция используется как процедура.  Ниже в примере показана реализация системных часов, методом OnTime и функцией  DoEvents:

Sub TimeV1()

Application.Caption = Time

‘Повторить вызов процедуры через 1 секунду

Application.OnTime Now + TimeValue("00:00:01"), "TimeV"

End Sub

Sub TimeD()

Dim v As Variant

v = Time

Do

‘Если прошла секунда

If v <> Time Then

Прерываем процедуру

DoEvents

v = Time

Application.Caption = Time

End If

Loop

End Sub

Системные часы реализованные методом OnTime работают лучше, чем системные часы реализованные DoEvents (Стабильней работает клик мыши, и др.)  К сожалению, методом OnTime можно вызвать только процедуру из модуля макросов.  В других модулях для реализации постоянно работающей подпрограммы, и не вызывающей  остановку работы приложения приходится пользоваться функцией DoEvents.

4.12 Оператор Shell (Запуск исполняемых файлов)

Функция, предназначенная для запуска исполняемых файлов. Данная функция выдает номер загруженного приложения, или выдает 0 если приложение загрузить не удалось. Формат запуска функции:

 

Shell( “Имя файла” [,Windowstyle] )

где

“Имя файла” – Полное имя файла, или имя файла находящегося в текущей директории текущего диска. За именем файла могут быть входные параметры (например, имя файла загружаемого в приложение), отделенные от имени файла приложения пробелом.

Windowstyle – константа, или числовое значение определяющее параметры запуска окна приложения:

Параметры запуска окна приложения

Константа

Значение

Описание

VbHide

0

Окно скрыто, и фокус передается скрытому окну

VbNormalFocus

1

Окно имеет фокус и восстанавливает свои стандартные размер и положение

VbMinimizedFocus

2

Окно отображается в виде значка с фокусом

VbMaximizedFocus

3

Окно развертывается на полный экран с фокусом

VbNormalNoFocus

4

Восстанавливаются предыдущие размер и положение окна. Активным остается текущее окно

VbMinimizedNoFocus

6

Окно отображается в виде значка. Активным остается текущее окно

4.13 Оператор AppActivate (Активизация окна другой программы)

Позволяет активизировать окно приложения, по тексту заголовка на окне, или по индексу полученному оператором Shell:

AppActivate “Заголовок окна” [, wait]

где

“Заголовок окна”  - текст заголовка окна, или индекс загруженного приложения;

Wait – логическое выражение, определяющее выполнение активизации окна, если данный параметр равен False, то окно активизируется немедленно (выполняется по умолчанию входного параметра). Если указанный параметр имеет значение True, то окно активизируется только после активизации окна программы, которая переводила фокус на указанное окно.

4.14 Оператор SendKeys (Эмуляция нажатия на клавиши)

Позволяет эмулировать нажатие на клавиши в активном окне приложения :

 

SendKeys  “Клавиши” [, Wait]

где

“Клавиши”  - Специально заданные клавиши в строковом формате (о формате смотрите в Приложение 2 - Программное назначение управляющих клавиш макросам)

Wait – логическое выражение, определяющее режим прерывания работы той процедуры,  которая передает коды нажатых клавиш активному окну.  Если данный параметр равен False, то работа вызывающей процедуры не прерывается после передачи кодов нажатых клавиш активному окну  (выполняется по умолчанию входного параметра). Если указанный параметр имеет значение True, то работа вызывающей процедуры приостанавливается пока коды “нажатых” клавиш не обработались в активном окне.

4.15 Вложенность структур операторов

Структура одного оператора может быть вложена в другую однотипную, или разнотипную ей структуру.

Пример1:

‘Подсчет суммы целых, четных чисел 1-100

S =0

For i =1 to 100

If  i mod 2 = 0 then

 S =S + i

End if

Next i

Пример2:

‘Вывод  в текущий лист Excel таблицы умножения

For i =1 to 9

For j =1 to 9

 Cells( i , j ).Value = i  &  “*”  &   j  &  “=”  &  i*j

Next j

Next i

В Примере1 в оператор IF вложен внутрь оператора цикла For. В Примере2  один оператор цикла For вложен внутрь другого оператора цикла For.

 


5 Структурированные типы VBA

5.1 Введение

К структурированным  типам можно отнести массивы, записи, семейства, кроме того, в объектах тоже просматривается элементы структурированного типа. Общее между этими типами состоит в том, что при обращении к переменным данного типа, необходимо не только обращаться к ее имени, но и  указывать, особым образом, номер или имя соответствующей структуры.

5.2 Массивы

Представляют собой переменную, состоящую из ячеек одного типа. Имеются динамические массивы, в которых количество ячеек может меняться входе выполнения программы, и статические, количество ячеек в которых строго определено. Массивы бывают одномерными и многомерными.  В многомерных массивах к ячейке обращаются используя несколько индексов разделенных запятыми, в одномерном только один индекс.

В VBА возможно объявить одномерный динамический массив одновременно с объявлением значений его ячеек через функцию Array. Но в этом случаи ячейки динамического массива могут быть только типа Variant.


5.2.1 Статический массив

Формат объявления статического массива:

DIM Имя_Массива(размерность) [as тип]

Где

Имя_Массива – имя объявляемого массива

Размерность – одна размерность или несколько размерностей разделенных запятыми

as тип – объявление типа ячейки массива, если тип опущен, ячейки массива имеют универсальный тип Variant.

Размерность можно задать двумя способами:

Положительной целой неименованной или именованной константой,  определяющей количество ячеек в массиве от нижней границы по умолчанию до указанного числа

Указать диапазон ячеек:

НижняяГраница to ВерхняяГраница

Пример объявления массивов:

Dim A(9), B(1 to 4), C(1 to 4, 1 to 3)

В данном примере объявлен одномерный массив A с ячейками имеющими индексы в диапазоне 0-9, одномерный массив В с ячейками имеющими индексы в диапазоне 1-4 и двумерный массив С, имеющий четыре строки с индексами 1-4, и три столбца с индексами 1-3.

При объявлении размерности массива первым способом его нижняя размерность по умолчанию будет всегда начинаться с 0-ой ячейки, имеется возможность объявить нижнюю размерность массива на 1-ую ячейку или 0-ую следующим оператором:

Option Base 0 / 1

Где

Option Base – оператор перезадающий нижнюю размерность массива по умолчанию.

0 / 1 – число 0 или 1 задающее нижнюю размерность массива по умолчанию.

Оператор Option Base может применяться в модуле только один раз, и только до объявления массивов.

Пример:

Option Base 1

Dim A(9), C(5,3)

 В данном примере объявлен одномерный массив A с ячейками имеющими индексы в диапазоне 1-9, и двумерный массив С, имеющий пять строк с индексами 1-5, и три столбца с индексами 1-3.

Обращаются к ячейки массива указывая имя массива, а за ним в скобках индексы ячеек:

A(1) = 10

C(2,3) =5

В примере выше в 1 ячейку массива A занесено число 10. А в ячейку массива С, находящуюся на пересечении второй строки и третьего столбца число 5.  В качестве индексов массива могут быть использованы не только неименованные и именованные целочисленные константы, но и переменные целого типа, а так же целочисленные выражения:

 Dim C(1 to 4, 1 to 3)

i = 2

j = 3

C( i + 1, j)=5

В данном примере значения 5 присвоено ячейке С( 3 , 3 )

5.2.2 Динамический массив

Динамический массив описывается в два этапа:

Объявление имени динамического массива и типа его ячеек (если динамический массив планируется делать глобальным, то объявление имени динамического массива и типа его ячеек производится в общей части модуля);

Объявление размерности массива.

Объявление имени динамического массива и типа его ячеек  осуществляется точно так же, как объявления обычного массива, но без указания его размерности в скобках:

Dim ИмяМассива( ) [as тип]

 Пример:

Dim A( ) as integer, B( ) as Boolean

В примере объявлен динамический массив A c ячейками целого типа, и массив В c ячейками логического типа.

Объявления размерности динамического массива может осуществляться сколько угодно раз, и обычно, размерность объявляется в теле какой либо подпрограммы модуля:  

ReDim [Preserve] ИмяМассива(Размерность) 

Где

ReDimСлужебное слово для переобъявления размерности динамического массива.

Preserveесли это служебное слово отсутствует, то при переобъявлении размерности динамического массива значения всех его ячеек обнуляются, в противном случаи сохраняется значение тех ячеек, которые были объявлены ранее.

Размерность – размерность динамического массива, задается точно также, как размерность статического массива, но в отличии от статического, его размерность могут задавать не только положительные целые константы, но и положительные целые переменные.

Обращение к ячейками динамического массива происходит точно также, как обращение к ячейкам статического массива.

5.2.3 Объявление массива через функцию Array

Массив через функцию Array объявляется в два этапа:

Объявление переменной Variant, для которой в последствии объявят размерность  функцией Array (Если массив планируется сделать глобальным, то переменную объявляют в общей области модуля)

Объявление размерности массива через объявления значений его ячеек:

Имя_Переменной_Variant = Array(СписокЗначений)

Список значений это список неименованных или именованных констант. Так же, возможно, в списке значений применять имена переменных, все константы и переменные списка отделяются друг от друга запятыми.

Размерность массива функцией Array задается всегда внутри подпрограммы, ячейкам этого массива можно присваивать значение, любого, не структурированного типа, т.к. ячейка массива Array имеет тип Variant .

Пример:

V = Array(“VBA”, “Excel”)

В данном примере массиву V  заданы две ячейки со строковыми значениями “VBA” и “Excel”.

Нумерация ячеек массива объявленного функцией Array  начинается  с нижней размерности массива по умолчанию,  т.е. с 0-ой ячейки, или с 1-ой ячейки, если нижняя размерность массива была переустановлена оператором Option Base (см. параграф  5.1.1 Статический массив)

Обращение к ячейкам одномерного массива объявленного функцией Array  происходит точно так же, как обращение к ячейкам статического массива.

Функцией Array  возможно объявить и многомерный массив:

V = Array ( Array(1, 2) , Array(3, 4) )

A=V (0) (0)

В данном примере массив V является двумерным массивом, с двумя строками, и двумя столбцами. Элементы первой строки данного массива имеют значения 1, 2;  а элементы второй строки – 3, 4. Переменной A  присвоено значение нулевого элемента, нулевой строки, т.е. A = 1.  Как видно из примера, обращения к ячейкам многомерного массива объявленного функцией Array происходит иначе, чем в статическом массиве.

Функцией Array можно задать многомерный массив, в котором строки имеют различную длину:

V = Array ( Array(1, 2) , Array(3, 4, 5) )

A=V (0) (1)

B=V (1) (2)

В данном примере массив V является двумерным массивом, с двумя строками. Элементы первой строки данного массива имеют значения 1, 2;  а элементы второй строки – 3, 4, 5. Значение переменных A,B следующие:

A = 2

B = 5

5.2.4 Функции определения размерности массива 

Существуют две функции LBound – для определение нижней размерности ячеек массива, и, UBound – определение верхней размерности массива. Формат вызова данных функций следующий:

 LВound(ИмяМассива [ , НомерСтруктуры])

Если параметр “НомерСтруктуры”,  опущен, то соответствующая функция выдает размерность первой структуры в массиве.  

Пример использования функций определения размерности массива:

Dim mas (1 to 50, -3 to 6)

A = LBound( mas , 1 )

B = UBound( mas , 1 )

C = LBound( mas , 2 )

D = UBound( mas , 2 )

Значение переменных A,B,C,D будет следующие:

 A = 1

B =  50

C =  -3

D = 6

Указанные функции могут быть использованы для определения размерности статического и динамического массива. Если массив объявлен функцией Array, то, указанным выше способом,  размерность можно будет определить только одномерного массива,  или только размерность первой структуры массива объявленного функцией Array. Однако, есть другой способ обращения к определенной структуре, который позволяет определить размерность многомерного массива объявленного функцией Array:

LBound( ИмяМассива(НомерСтроки) )

Пример:

V = Array ( Array(6, 8) , Array(10, 4, 7) )

A = LBound( V(0) )

B = UBound( V(0) )

C = LBound( V(1) )

D = UBound( V(1) )

Значение переменных A,B,C,D будет следующие:

 A = 0

B =  1

C =  0

D = 2

5.2.5 Опрос, ввод и вывод в цикле ячеек массива  

Ячейки одномерного массива опрашиваются следующим образом:

 For Индекс = нач.ячейка  то кон.ячейка

   A(Индекс)

 Next Индекс

где

 Индекс – переменная, в которой перебираются индексы ячеек

нач.ячейка , кон.ячейка – соответственно, индекс начальной и конечной ячейки, т.е. диапазон перебираемых индексов.

Aимя массива , к ячейкам которого обращаются.

Пример:

For i = 2  то 5

   A(i) = 1

 Next i

В данном примере присваивается значение 1 ячейкам с индексами 2-5 массива A

Если неизвестна размерность одномерного массива можно применить цикл For each. Пример опроса ячеек одномерного массива циклом For each приведен нами в главе Входные параметры процедуры в таблице Виды входных параметров в параметре ParamArray.

Если массив многомерный, то применяют вложенный цикл:

For i =1 to 9

For j =1 to 9

 A(i,j) = i *j

Next j

Next i

В данном примере переменная i является индексом строк, а переменная j – индексом столбцов двумерного массива*. В начале, заполняется первая строка массива, затем вторая и т.д. Т.е. массив опрашивается построчно. Ячейкам двумерного массива A присваивается произведения индекса строки на индекс столбца.  

Оператор For each можно применять для опроса ячеек двумерных массивов, причем, без всяких вложений.  В двумерных массивах опрос ячеек оператором For each без вложений производится по столбцам. Ячейки двумерного массива объявленного функцией Array нельзя опрашивать циклом For each без вложений, они  опрашиваются  следующим образом:

V = Array(Array(1, 2), Array(3, 4, 5))

S = 0

For Each n In V

For Each n1 In n

 S = S + n1

Next n1

Next n

В данном примере в переменную S заносится сумма всех значений ячеек массива V, т.е.  после выполнения программ S =15. В данном примере массив опрашивается по строкам.  

Приведем примеры ввода ячеек одномерного числового массива через диалог InputBox, и пример вывода двумерного массива в  ячейки активного листа Excel:

‘Ввод значений ячеек в диапазоне 1-N

For  i = 1 to N

  A(i) = Val( InputBox(“Введите ячейку A” & i))

Next i

‘Вывод двумерного массива по строкам

For  I = 1 to n

For j = 1 to n1

 Cells( i, j)  = B( i, j )

Next  j

Next i

5.2.6 Массивы массивов 

В языке VBA возможно присвоить ячейке массива типа Variant значение другого массива.

Имя_Массива1(Индекс_Ячейки) = Имя_Массива2( )

И, таким образом , сделать массив в котором, например, имеются строки различной длинны. В примере ниже показано, как объявить такой массив и как обращаться к ячейкам указанного массива.

Dim A(1 To 2) As Long

Dim B(1 To 3) As Long

Dim C(1 To 2) As Variant

A(1) = 1

A(2) = 2

B(1) = 5

B(2) = 6

B(3) = 7

‘Присваиваем ячейке C(1) массив A 

C(1) = A( )

‘Присваиваем ячейке C(2) массив B 

C(2) = B( )

n = C (1) (2)

n1 = C (2) (1)

После выполнения указанного нами выше фрагмента программы значение переменных n, n1 будет следующие:

n  = 2

n1 = 5

Многомерный массив, описанный в данной главе, является по своей структуре аналогом многомерного массива объявленного функцией Array.  И с данным массивом программист обращается точно так же, как с многомерным массивом полученным через функцию Array.

5.2.7 Поиск максимума и минимума в массиве

В примере ниже показан поиск максимума и минимума  ячеек и их индексов в массиве A, индексы которых лежат в диапазоне 1-N:

‘Переменные для поиска максимального значения в массиве и индекса ячейки с максимальным значением

     Максимум = A(1)

     ИндексМаксимума =1

‘Переменные для поиска минимального значения в массиве и индекса ячейки с минимальным значением

Минимум = A(1)

ИндексМинимума =1

For  i = 1 to N

  If A(i) > Максимум Then

       Максимум = A(i)

       ИндексМаксимума = i

  End if

   If A(i) < Минимум Then

         Минимум = A(i)

       ИндексМинимума = i

  End if

Next i

5.2.8 Сортировка массива

В примере ниже показан один из методов сортировки одномерного массива A по возрастанию  и одномерного массива B - по убыванию.  В примере сортируются ячейки массива, индексы которых лежат в диапазоне 1-N. Переменная Обмен предназначена для обмена данных между двумя ячейками. Переменная Обмен должна иметь тот же тип, что и ячейка массива.

    

For  i = 1 to N-1

 For  j = i+1 to N

 If A(i) >A(j) Then

       Обмен  = A(i)

        A(i) = A(j)

         A(j) = Обмен 

  End if

 If B(i) <B(j) Then

       Обмен  = B(i)

        B(i) = B(j)

         B(j) = Обмен 

  End if

Next j

Next i

5.2.9 Оператор высвобождения памяти занятой динамическим массивом и обнуления ячеек статического массива (Erase)  

Оператор Erase высвобождает память занятую динамическим массивом  и обнуляет значение всех ячеек статического массива. Формат вызова оператора:

Erase Имя_Массива

5.3 Записи ( и массивы записей)

Представляют собой специальный тип переменных созданный пользователем. Переменная типа запись, имеет поля, к которым можно обращаться точно так же, как к полям модулей или объектов. Объявляется запись в общей области модуля.  

Объявление типа:

[Private/ Public] Type  Имя_пользовательского_типа

Имя_Поля1 [as тип]

Имя_Поля2 [as тип]

.

.

End Type

Пользовательский тип запись является глобальным для всего проекта, если его описание начинается со служебного слова Public или если отсутствуют служебные слова Private и Public в описании данного типа. Запись Public можно объявить только в модуле макросов. В модуле, после объявлением типа записи, можно объявить переменную с соответствующим пользовательским типом. К каждому полю такой переменной можно обратится по следующему правилу:

ИмяПеременой.ИмяПоля

Массив записей объявляется после объявления записи по следующему формату:

Dim ИмяМассива(Размерность) as ИмяЗаписи 

Если объявлен массив записей, то происходит обращение с начало к ячейке массива, а затем, к его полю:

ИмяМассива(АдресЯчейки).ИмяПоля 

Пример ввода и вывода массива записей вы можете посмотреть в параграфе 7.3.3 Работа с файлом произвольного типа данных. 

5.3.1 Запись с константными полями 

В VBA Microsoft Office 2000 и в более старших версиях  возможно создание записи, поля которой являются числовыми, целыми константами.  Запись с константными полями описывается следующим образом:

[Private/ Public] Enum ИмяЗаписи

 ИмяПоля1  [ = Значение ]

 ИмяПоля2  [ = Значение ]

.

.

End Enum

В качестве значения имени поля может использоваться именованная и не именованная константа, или математическое выражение, содержащее целые числовые константы. Допускается в выражении применять не целые числовые константы, но значение выражения будет автоматически преобразовано в целый тип.  По умолчанию поля записи с константными полями имеют  следующие значения Поле1 = 0, Поле2 = 1, Поле3 = 2 и т.д. Обращения к полям записи с константными полями происходит точно так же, как к полям обычной записи.

 

5.4 Семейства (Коллекции)

Семейства (или коллекции) представляют собой структурированную переменную созданную пользователем. Кроме того, некоторые объекты VBA объедены в коллекции.  Семейство созданное пользователем напоминает одномерный массив, к ячейкам которого можно обращаться не только по индексу, но и по ключу.  Индекс первой ячейки коллекции созданной пользователем равен 1.  Семейство может быть как глобальной, так и локальной переменной, а так же может быть полем модуля.  Т.е. при создании семейства используют соответствующие служебные слова Dim, Private, Public, Static. Операторами Private, Public, Static семейство создается точно так же, как и оператором Dim. Семейство можно создать следующим образом:

Dim Имя_семейства As New Collection

Для добавления элемента в семейство используют метод Add: 

Имя_семейства.Add Value , Key [, Before /After]

 где

Value – Значение очередной ячейки семейства (может быть любого простого типа)

Key – Значение ключа к ячейке (Обычно строковое)

Before / After – Один из двух необязательных параметров метода Add , Before –  определяет перед какой ячейкой добавлять новый элемент коллекции, After – после какой ячейки. Если эти параметры не указанны, то новый  элемент добавляется в конец коллекции.

Методом Item можно определить значение какой либо ячейки семейства, а методом Remove, удалить какой либо элемент семейства:

Имя_семейства.Item(Ключ)

Имя_семейства.Remove Ключ

где

Ключ – значение ключа ячейки, или индекс ячейки

Для определения количества ячеек семейства используют свойство Count.

 

Имя_семейства.Count

Для перебора значений элементов коллекции используют одну из разновидностей цикла Fоr:

‘Обращение к элементу семейства через перебор индексов

Dim i as integer

For i=1 to Имя_семейства.Count

‘Вывод  очередного значения элемента семейства в окно сообщений

Msgbox Имя_семейства.Item(i)

Next i 

‘Обращение к элементу семейства через переменную Variant

Dim  n  as Variant

For each n in Имя_семейства.Count

‘Вывод  очередного значения  элемента семейства в окно сообщений

Msgbox n 

Next i 

В примере, который рассмотрен ниже, подпрограмма создает коллекцию с двумя элементами имеющими ключи  "Слон" и  "Мышь". Если ключ семейства будет введен правильно, то указанная нами подпрограмма выведет окно сообщения  о том, сколько весит указанный зверь.

Sub ZveriVes ( )

‘Объявляем переменную для ввода индекса ключа

Dim s As String

'Объявляем коллекцию

Dim Звери As New Collection

'Добавляем элементы в коллекцию

Звери.Add 5000, "Слон"

Звери.Add 0.01, "Мышь"

'запрашиваем ввод имени зверя

s = InputBox("Введите имя зверя, а я скажу вам его вес в килограммах")

'Включаем проверку на ошибки

On Error GoTo ОшибкаВвода

'Выводим вес зверя

MsgBox Звери.Item(s)

Exit Sub

ОшибкаВвода:

'Выводим сообщения о том, что ключ в коллекции отсутствует

MsgBox "Увы, не знаю такого зверя!"

End Sub

5.5 Объекты

5.5.1 Введение

В VBA программист в основном работает с объектами являющимися элементами управления или с теми объектами, которые позволяют связаться ему с документом MS Office. Почти все объекты VBA являются потомками объекта из класса Application. При написании программы, программисту необходимо обращаться к методам   и свойствам объектов, а так же создавать событийные процедуры объектов.

Обратится к методу объекта, или его свойству можно следующим образом:

Application.ИмяРодителя.ИмяОбъекта.ИмяМетода/ИмяСвойства

Имя самого древнего родителя Application, для простоты написания пути к свойству или методу объекта всегда можно опустить:

ИмяРодителя.ИмяОбъекта.ИмяМетода/ИмяСвойства

Если к объекту обращаются в модуле его родителя, то ИмяРодителя в пути можно опустит:

 ИмяОбъекта.ИмяМетода/ИмяСвойства

Если объект имеет свой модуль и обращение к объекту происходит из его модуля, то ИмяОбъекта в пути так же можно опустить:

ИмяМетода/ИмяСвойства

В VBA очень часто метод изменяющий свойство объекта скрыт внутри самого свойства, поэтому изменить значения многих свойств объекта, и, следовательно, и вид объекта можно простым оператором присвоения:

ИмяОбъекта.ИмяСвойства = Значение

В некоторых случаях можно не указывать имя свойства, поскольку объект имеет одно из свойств, к которому можно обращаться по умолчанию. В примере ниже показаны две равнозначные программные конструкции обращения к свойству Value ячейки объекта Cells непосредственно и по умолчанию:

‘Обращение к свойству Value непосредственно

Cells(1 ,1).Value = 1

‘Обращение к свойству Value по умолчанию

Cells(1 ,1) = 1

Как видно из примера выше к некоторым объектам надо обращаться не только по имени, но и вслед за ним,  в скобках,  указывать номер (а иногда и имя) структуры.

5.5.2 Объект Application

Из объекта Application, пользователь обычно использует свойство Caption и Visible. Изменение свойства Caption происходит не так, как в потомках объекта Application. Если данному свойству этого объекта назначен определенный текст, то в заголовке окна приложения Excel появляется указанная надпись, а вслед за ней, через тире, имя активной книги.

Пример:

Application.caption  = ”Моя программа”

Если вышеуказанный оператор присвоения выполняется в Excel книги с именем “Программа”, то после выполнения данного оператора в заголовке окна приложения Excel появится следующая надпись:

Моя программа – Программа

Если свойству Caption, объекта Application присвоена пустая строка, то перед именем активной книги Excel выводится стандартный текст: “Microsoft Excel”.

Пример:

Application.caption  = ””

Если вышеуказанном примере оператор присвоения выполняется в Excel книги с именем “Программа”, то после выполнения данного оператора в заголовке окна приложения Excel появится следующая надпись:

 Microsoft Excel – Программа

Свойство Visible позволяет скрыть или отобразить окно приложения Excel,  при чем возможна работа пользовательской формы созданной в Excel при скрытом окне приложения Excel. Окно приложения скрывается и отображается следующим образом:

‘Скрыть окно приложения

Application.Visible = False 

‘Отобразить окно приложения

Application.Visible = True

Из методов объекта Application, можно использовать метод Quit - который завершает выполнение Excel приложения, и Run который запускает подпрограмму из модуля макросов находящуюся в  другом проекте.

Пример:

Application.Quit

В данном примере произойдет закрытия приложения Excel.

Примечание: к сожалению метод Quit не во всех версиях Excel  работает правильно, в некоторых версиях этот метод вообще не производит никаких действий.

Методом Run можно запустить процедуру по следующему правилу:

Application.Run "’Имя книги.xls’!Имя модуля.ИмяПроцедуры" [ , Список входных параметров]

Имя книги, в которой находится процедура берется в апострофы (‘), если имя книги не содержит пробелов апострофы опускаются. Если книга содержащая вызываемую процедуру имеет формат Надстройки Excel, то за ее именем через точку пишется не расширение xls, а расширение xla. За именем книги после знака (!) пишется имя модуля. За ним, через символ  (.) , имя процедуры. Если в книги нет одноименных подпрограмм в модулях макросов, то имя модуля можно опустить. За входным параметром метода Run, определяющего имя вызываемой подпрограммы, пишется, через запятую, список входных параметров вызываемой процедуры.  Если метод Run вызывает функцию, то входные параметры данного метода берутся в скобки.

Пример:

N = Application.Run("Книга1.xls!Log10", 100)

В данном примере метод RUN запускает функцию Log10 с входным параметром 100. Функция находится в модуле макросов в Excel файле с именем "Книга1.xls”.

Методом RUN всем входным параметрам подпрограммы, в независимости от типа входных параметров подпрограмм, передается только значение переменной, переменная задавшая начальное значение входному параметру подпрограммы через метод RUN  при всех обстоятельствах не может получить ссылку значения от входного параметра.

Через объект Application можно получить доступ к функциям, которые используются в листе Excel, и применять эти функции в выражениях языка VBA, в качестве ИмениФункции используется английская версия имени Excel функции:

 

Application.WorksheetFunction.ИмяФункции(АргументыФункции)

В качестве аргументов функции в ряде случаев можно использовать имена переменных или константы,  в других случаях в строковом формате задают диапазон ячеек листа, которые будут являться аргументами функции:

‘В переменную A заносится сумма значений ячеек лежащих в диапазоне A1-D1 активного листа в Excel  

 A = Application.WorksheetFunction.Sum(“A1:D1”)

При помощи метода Evaluate объекта Application  можно подсчитать значения математического выражения заданного в строковом формате:

B = Application.Evaluate("(2+1)/2+3^2")

Переменной B  присвоено значение – 10,5. В строке выражения допустимо применять английскую версию названия функций применяемых  в листе Excel.   

Объект Application имеет прямых потомков, позволяющих ему связаться с книгой Excel, имена этих потомков следующие: ActiveWorkbook, ThisWorkbook, Workbooks

5.5.3 Объекты ActiveWorkbook, ThisWorkbook, Workbooks (связь с книгой Excel)

 ActiveWorkbook, ThisWorkbook, Workbooks – являются прямыми потомками объекта Application, и они предназначены для соответствующей связи с книгой Excel :

Объекты для связей с книгой Excel

Имя объекта

Назначение

ActiveWorkbook

Объект для связи с активной книгой

ThisWorkbook

Объект для связи с загруженной книгой, в модулях которой происходит обращение к объекту ThisWorkbook

Workbooks

Объект для связи с загруженными книгами Excel по их имени или индексу. Так же этот объект предназначен для осуществления загрузки книги Excel.

Для связи с книгой через объект Workbooks необходимо за его именем ввести имя или индекс загруженной книги с расширением xls или без него:

 Workbooks(“Моя книга”).Activate

Workbooks(“Моя книга.xls”).Activate

В данных примерах через объект Workbooks активизируют книгу с именем  “Моя книга”, используя метод Activate.

Индексы активных книг начинаются с номера 1.

Ниже, в таблице, нами указано имена и значение некоторых свойств рассматриваемых нами объектов.

 

Свойства объектов ActiveWorkbook, ThisWorkbook, Workbooks

Имя свойства

Тип свойства 

Значение свойства

Примечание

Name

Строковый

Имя книги, к которой обращаются

Имя книги дается с расширением

Path

Строковый

Путь к книге, к которой обращаются. Если книга была создана, но еще не записывалась, то свойство Path равно пустой строке.

Путь к книге, дается без последней слеши

Saved

Логический

Свойство типа Boolean. Определяет давать или нет сообщение о сохранении книги перед ее закрытием .

  •  Trueперед закрытием книги выдается cообщение о сохранении текущих изменений в книге.
  •  False перед закрытием книги не выдается cообщение о сохранении текущих изменений в книге.


Count

Числовой

Количество загруженных книг, причем считается так же и книга общих макросов, если она существует, которая не видна в окне приложения Excel.

Свойство имеется только в объекте Workbooks, и обращение к данному свойству происходит без указания имени книги: Workbooks.Count

Рассматриваемые нами в этой главе объекты имеют так же методы для работы с книгой Excel:

Методы объектов ActiveWorkbook, ThisWorkbook, Workbooks

Имя метода

Назначение

Пример и пояснение к примеру

Save

Сохраняет текущее состояние книги Excel.

ActiveWorkbook.Save

Сохранить активную книгу

SaveAs _

 “Полный путь к книге”

Переписывает, и, возможно, переименовывает книгу Excel в директорию указанную в полном пути.

ActiveWorkbook.SaveAs  _

 “C:\Моя.xls”

Активная книга Excel переписана в корневую директорию диска C: под именем “Моя.xls

Close

Закрывает книгу Excel.

Workbooks(“Моя”).close

Закрывается книга Excel с именем “Моя”.


Activate

Активизирует загруженную книгу Excel. Метод имеется в объектах ThisWorkbook ,Workbooks

Workbooks(“Моя”).Activate

Активизируется книга Excel с именем “Моя”.

Open _

 “Полный путь к книге”

Открывает книгу Excel указанную в полном пути. Метод имеется только в объекте Workbooks

Workbooks.Open  _

C:\Моя.xls”

Открывается книга Excel с именем “Моя”, находящаяся в корневой директории диска C:.

Add _

 [“Полный путь к  кн.”]

Создает  новую книгу,  если указан путь к существующей книге, то новая книга является копией указанной. Книга, с которой делают копию, должна быть закрыта.

Workbooks.Add

ActiveWorkbook.Save _

 “C:\Моя.xls”

Создается новая книга Excel, и сохраняется под именем “Моя”, в корневой директории диска C:.

Объект Workbooks имеет следующие основные события, доступ к которым осуществляется через событийные процедуры модуля книги:

Основные события объекта Workbooks

Имя события

Когда происходит

Примечание

Open

Перед открытием книги Excel

-


BeforeClose(Cancel As Boolean)

Перед закрытием книги Excel

Если в событийной процедуре объекта параметру Cancel назначить значение False, то закрытие книги не произойдет.

BeforeSave

Перед сохранением книги Excel

-

Все три рассматриваемые нами объекта имеют потомков, которые предназначены для связи с листом книги Excel, имена этих потомков: ActiveSheet, Worksheets.

5.5.4 Объекты ActiveSheet, Worksheets (связь с листом книги Excel)

ActiveSheet, Worksheetsявляются прямыми потомками объектов ActiveWorkbook, ThisWorkbook, Workbooks, Application и предназначены для соответствующе связи с листом книги Excel:

 Объекты для связей с листами книги Excel

Имя объекта

Назначение

ActiveSheet

Объект для связи с активным листом книги Excel.

Worksheets

Объект для связи с листами книги Excel по их именам или индексам

Для связи с листом книги Excel через объект Worksheets необходимо за его именем ввести в круглых скобках имя или индекс листа. Данный объект имеет метод Activate, который активизирует указанный лист.

Пример:

 Worksheets (“Мой”).Activate

 Если указанный в примере метод Activate запускается из подпрограммы модуля книги Excel (имя которого по умолчанию ThisWorkbook), то активизируется лист (с именем “Мой”), той книги, откуда был вызван метод, т. к. в этом случаи объект Worksheets является потомком объекта ThisWorkbook.

Из других модулей проекта указанный в примере метод Activate  активизирует лист (с именем “Мой”),  находящийся в активной книге, т.к. в этом случаи он будет являться потомком объекта Application.

Что бы избежать данной путаницы необходимо указывать перед объектами ActiveSheet, Worksheets имя его родителя, который указывает соответствующую книгу.

Свойства объектов ActiveSheet, Worksheets

Имя свойства

Тип свойства 

Значение свойства

Пример и пояснение к примеру

Name

Строковый

Имя листа

ActiveSheet.Name =”Мой”

Активному листу назначено имя ”Мой”

Count

(только в Worksheets)

Числовой

Количество листов в книги, первый лист имеет индекс 1

Workbooks(“Моя”).Worksheets.Count

Свойство указывающее количество листов в книге с именем “Моя”

Основные методы объектов ActiveSheet, Worksheets

Имя метода

Функция метода

Примечание

Activate

Активизации листа Excel

Только в объекте Worksheets

Protect

Установка защиты листа Excel

При отсутствии входных параметров метод защищает лист без пароля

Unprotect

Снять защиту листа Excel

-

Объект Worksheets имеет следующие основные события, доступ к которым осуществляется через событийные процедуры модуль листа:


Основные события объекта Worksheets

Имя события

Когда происходит

Примечание

Activate

Перед активизации листа Excel

-

SelectionChange(  _

ByVal Target)

При переходе в другую ячейку листа Excel

В объекте Target хранится информация о выбранной ячейке в следующих его свойствах:

  •  Text – текст в выбранной ячейке
  •  Row – строка выбранной ячейки
  •  Column – колонка выбранной ячейки

Объекты ActiveSheet, Worksheets имеют четырех прямых потомков, через два первых можно связаться со строками и столбцами, это объекты Rows и Columns.  Два других потомка предназначены для связи с ячейками  листа Excel имена этих потомков: Range и Cells.

5.5.5 Объекты Rows, Columns ,Range, Cells, Selection, ActiveCell (связь со строками, столбцами и ячейками листа Excel)

Объекты Rows, Columns ,Range, Cells являются прямыми потомками объектов ActiveSheet, Worksheets, Application. Объекты Selection и ActiveCell  являются потомками только объекта Application. Все эти объекты предназначены для связи cо строками, столбцами и ячейками листа книги Excel .

 Объекты для связи со строками, столбцами и ячейками листа Excel

Имя объекта

Назначение

Rows

Связь со строкой листа Excel

Columns

Связь со столбцом листа Excel

Range

Связь с диапазоном ячеек через индексацию ячеек по принципу индексирования ячеек электронной таблицы.

Cells

Связь с ячекой, по индексу строки и столбца, по принципу индексирования ячеек двумерного массива.

Selection

Связь с выделенными ячейками листа

ActiveСell

Связь с самой верхней, и с самой левой ячейкой в выделенном диапазоне ячеек

Лист Excel представляет собой электронную таблицу, которая по структуре напоминает двумерный массив, ячейки которого имеют тип Variant (см . Рис2)

A

B

C

D

1

2

3

4

5

Рис 2 Фрагмент электронной таблицы

Столбцы электронной таблицы индексируются латинскими буквами, строки цифрами. В символьной индексации с начало указывается номер столбца, а вслед за ним, номер строки. Электронная таблица Excel имеет 256 столбцов и  65536 строк.   Когда букв для индексации столбца не хватает, столбец кодируется двумя буквами. При числовой индексации столбцов таблицы, через соответствующие объекты, индекс столбца кодируется целым числом, и индексация столбцов начинается с 1.

Пример:

Range(“A1”).Activate

Cells(1,1).Activate

Rows(1).Activate

Columns(1).Activate

В данном примере методом Activate, при помощи объектов Range и Cells активизирована ячейка А1, а объектами Rows и Columns первая строка и первый столбец соответственно. В объекте Range можно задать и группу ячеек по следующему правилу:

АдрессЛевойВерхнейЯчейки:АдресПравойНижнейЯчейки

Пример:

Range("A1:B2").Activate

В данном примере объектом Range выделены ячейки лежащие в прямоугольнике начиная с ячейки A1 и кончая ячейкой B2.

Если родитель рассматриваемых нами объектов опущен , и обращение к данным объектам происходит из модуля листа, то они являются потомками данного листа Excel, и производят изменения в строках, столбцах и ячейках того листа, из модуля которого они вызваны, при этом лист Excel в котором производятся изменения должен быть активизирован, в противном случаи может произойти остановка программы из-за неправильного выполнения некоторых методов этих объектов.

При обращении к этим объектам без указания родителя из других типов модулей проекта (не модулей Листа Excel),  эти объекты являются прямыми потомками объекта Application, и обрабатывают строки, столбцы и ячейки активного листа любого из загруженных проектов.

Для указания имени родителя (Листа Excel) и прародителя (Книги Excel) для данных объектов полезно использовать оператор With (см. 4.8 Оператор With)


Пример:

With Workbooks(“Моя”). Worksheets(“Мой”)

.Range(“A1”).Activate

.Cells(1,1).Activate

.Rows(1).Activate

.Columns(1).Activate

End With

В данном примере обращаются к строкам, столбцам и к ячейкам Excel Листа с именем “Мой”, который находится в Excel книге с именем “Моя”. Перед именами рассматриваемых нами объектов в данной языковой конструкции не забывайте ставить точку,  которая означает, что родитель для этих объектов указан в With. В противном случаи, даже внутри этого оператора, рассматриваемые нами объекты будут без указанных родителей.

Свойства объектов Rows, Columns ,Range, Cells, Selection, ActiveCell

Имя

Свойства

Тип

свойства 

Значение свойства

Доступность

Свойства

Примечание

Text

Строковый

Текст в указанном диапазоне ячеек

Только для чтения

При обращении к группе ячеек, обращение к данному свойству может вызвать аппаратную ощибку.

Если ячейка, к которой происходит обращение скрыта, то значение этого свойства всегда равно пустой строке.

Value

Универсальный

Значение в указанном диапазоне

Для чтения и изменения

При обращении к  группе ячеек, во время чтения данного свойства может произойти аппаратная ощибка.

Address

Строковой

Адресс указанного диапазона ячеек,  представленый  в строковом формате

Только для чтения

-

Методы объектов Rows, Columns ,Range, Cells, Selection , ActiveCell

Метод

Назначение метода

Примечание

Activate

(или)

Select

Выделяет указанные ячейки

Метод Activate отсутствует в объекте Selection и ActiveCell

Insert

Вставлять новые пустые строки, столбцы и ячейки

-

Delete

Удалять строки, столбцы и ячейки

-


Вставка и удаление строк, столбцов и ячеек методами Insert, Delete

Что удаляем или вставляем

Insert

Delete

Строки

Строка вставляется перед активной строкой

Строки находящиеся под удаляемой строкой сдвигаются вверх

Столбцы

Столбец вставляется перед активным столбцом

Столбцы находящиеся за удаляемым столбцом сдвигаются вправо

Ячейка, группа ячеек

Пустые ячейки вставляются над активными ячейками

Ячейки, расположенные под удаляемыми ячейками сдвигаются вверх

5.5.6 Элементы управления

Элементы управления становятся потомками тех объектов, на которых они установлены. Установить элемент управления можно на лист Excel или на Форму.

Элементы управления имеют ряд общих свойств и событий, которые представлены нами в таблицах:

Основные свойства элементов управления

Имя свойства

Тип свойства

Значение

Name

Строковый

Имя объекта. По этому свойству объект идентифицируется

Caption

Универсальный

Текст, написанный на объекте. Комментирует функцию элемента управления

WordWrap

Логический

Задает или отменяет перенос текста написанного на объекте через свойство Caption:

  •  True – включить перенос текста
  •  False – отменить перенос текста

Text

Строковый,

Универсальный

Текст, на некоторых объектах, например на объекте TextBox

Left

Вешественный двойной точности

Координата левого верхнего угла объекта по горизонтали

Top

Вешественный двойной точности

Координата левого верхнего угла объекта по вертикали

Width

Вешественный двойной точности

Ширина объекта

Height

Вешественный двойной точности

Высота объекта

Visible

Логический

Определяет, виден объект или скрыт

Enabled

Логический

Определяет разрешение на управление объектом  



Основные события элементов управления

Имя события

Когда происходит

Click

Одинарный клик левой клавишей мыши по объекту (В момент отпускания клавиши мыши на объекте)

DBClick

Двойной клик левой клавишей мыши по объекту (В момент второго нажатия клавиши мыши на объекте)

Change

Изменения в объекте

GotFocus

Получения фокуса объектом

LostFocus

Потеря фокуса объектом

MouseDown

В момент нажатия клавиши мыши на объекте

MouseUp

В момент отжатия клавиши мыши на объекте

Существует достаточно много элементов управления, каждый элемент управления при установки его на родителя получает стандартное имя по следующему формату:

ТипЭлемента№

где

ТипЭлемента – имя обектного типа элемента управления.

№ - цифра, обозначающая номер установленного на родителя элемента управления конкретного типа. 

Нами в таблице ниже представлены наиболее употребляемые элементы управления.


Основные элементы управления

Название

Пикто-грамм

Элемента

Стандартное имя

Примечание

Кнопка

CommandButton

Самый распространенный элемент управления. Через событие Click данного объекта осуществляется запуск программы.

Флажок

CheckBox№

Позволяет запретить или разрешить выполнение каких либо действий. Свойство Value  этого объекта имеет значение True если флажок активен.

Переклю-чатель

OptionButton№

Применяется для переключений каких либо действий,  таких элементов управления обычно не менее двух. Свойство Value  этого объекта имеет значение True если переключатель активен.


Рамка (с подписью)

Frame№

Применяется для объединения в группу элементов управления и для их подписи, обычно, элементов OptionButton 

Надпись

Label№

Предназначена для написание комментариев к элементам управления, обычно, к элементу TextBox на пользовательской форме.

Поле

TextBox№

Является редактором текста. Применяется на пользовательских формах для ввода какой либо информации.

Список

ListBox№

Является списком, из которого через линейку прокрутки можно выбрать мышью строку из списка.

Поле со списком

ComboBox№

Является комбинацией двух элементов управления: Поле, Список.


Полоса прокрутки

ScrollBar№

Объект управления представленный в виде полосы прокрутки. Позволяет задать числовое значение по положению ползунка полосы прокрутки.

Счетчик

SpinButton№

Аналогичен полосе прокрутки, но не имеет  видимого ползунка.

Рисунок

Image№

Предназначен для вывода графических изображений из графических файлов.

О том, как устанавливать элемент управления на родителя и как задавать ему начальные значения свойств мы расскажем вам в главе 8 АРХИТЕКТУРА ПРОЕКТА - Этапы написания проекта.

Очень многие элементы управления имеют свойство Caption, значение которого задают сразу после установки элемента. Свойство Caption комментирует функцию элемента управления.  

Элемент управления CommandButton (Кнопка)

Объект CommandButton имеет вид кнопки. При  клике левой клавиши мыши по кнопке, она утопляется, и после отпускания левой клавиши принимает свое обычное состояние. Наиболее часто запускают программу через рассматриваемый нами элемент управления, используя его событийную процедуру  Click.

Элементы управления CheckBox, OptionButton (Флажок, Переключатель)

Объекты CheckBox, OptionButton имеют вид флажка и переключателя. Во время установки на родителя данных элементов изменяют свойство Value в значение True,  если хотят, что бы флажок или переключатель были активны. Во время работы программы можно изменить состояние флажка на противоположное, кликнув по нему мышью. Кликом левой клавиши по переключателю можно сделать его активным.   

Элемент управления TextBox (текстовый редактор)

Объект TextBox реализует функцию текстового редактора.  В режим редактирования этого объекта можно войти кликом левой клавишей мыши по нему. Через логическое свойство Multiline данного объекта можно задать многострочный режим редактора, установив это свойство в значение True. Через свойства ScrollBars данного объекта в многострочном режиме можно установить линейки прокрутки текста задав этому свойству следующие значения:

  •  0-FmScrollBarsNone  - Линейки прокрутки отсутствуют
  •  1-FmScrollBarsНоrizontal – Горизонтальная линейка прокрутки.
  •  2-FmScrollBarsVertical – Вертикальная линейка прокрутки.
  •  3-FmScrollBarsBoth - Вертикальная и горизонтальная линейка прокрутки.

Другие свойства элемента управления TextBox

Имя свойства

Назначение

Text

Предназначено для изменения и чтения текста написанного на объекте TextBox

SelText

Предназначено для изменения и чтения фрагмента выделенного текста на объекте TextBox

SelStart

Номер первого выделенного символа

SelLength

Длина в символах выделенного фрагмента текста

Элементы управления ListBox, ComboBox (Список ,Поле со списком)

Объект ListBox представляет собой список, из которого можно выбрать строку данных левой клавишей мыши. В отличии от ListBox,  ComboBox имеет поле ввода данных, и при этом, выкидной список данных. В свойство Text обоих объектов попадает значение выбранной строки из списка. Объекты имеют следующие методы:

Методы и свойства элементов управления ListBox, ComboBox

Метод или Свойство

Назначение метода

Clear

Очистка списка данных

AddItem Текст

Добавление в список строки данных

ColumnCount

Количество выводимых колонок

ColumnWidths

Ширина колонок, которая задается в текстовом формате (см. пример под таблицей)

RowSource

Копирует диапазон значений ячеек с листа Excel (см. пример под таблицей)

ListCount

Количество записанных строк в список объекта ( номер последней строки в списке равен ListCoun = -1, строки нумеруются с 0)

ListIndex

Индекс выбранной строки из списка. ListIndex = -1 если строка не выбрана.

List( row _

[, column] )

Получение данных из указанной строки списка, и обновление данных в имеющихся строках списка. Row – Номер строки списка. Column номер колонки списка, используется в том случаи, если установлено более одной колонки списка через свойство ColumnCount.

Пример загрузки данных в списки объектов ListBox1, ComboBox1:

‘установить четыре колонки вывода

ListBox1.ColumnCount = 4

‘Задать диапазон ячеек активного листа для копирования

ListBox1.RowSource = "A1: D10"

‘установить две колонки вывода

ComboBox1.ColumnCount = 2

‘установить ширину колонок вывода

ComboBox1.ColumnWidths = "54;40"

‘Задать диапазон ячеек на листе Аудитория

ComboBox1.RowSource = "'Аудитория'!a1:b100"

Элементы управления ScrollBar ,SpinButton (Полоса прокрутки ,Счетчик)

Позволяют задать числовое значение по положению видимого, или невидимого ползунка.

Свойства элементов управления ScrollBar ,SpinButton

Имя свойства

Назначение свойства

Min

Минимальное числовое значение при левом, или нижнем положении ползунка.

Мах

Максимальное числовое значение при правом, или верхнем положении ползунка.

Value

Свойство определяющее, и задающее положение ползунка.

LargeChange

Шаг изменений значений положения ползунка при клике левой клавиши мыши перед ползунком, или после ползунка. (только для полосы прокрутки)

SmallChange

Шаг изменений значений положения ползунка при клике левой клавиши мыши по стрелке линейки прокрутки.


Элемент управления Imаge (Рисунок)

Позволяет загрузит рисунок из графического файла.

Свойства элемента управления Imаge

Имя свойства

Тип

Назначение свойства

Stretch

Логический

Если данное свойство равно значению True, то размер графического изображения полностью помещается в объекте. False  - не изменяется размер загруженного изображения.

AutoSize

Логический

Если данное свойство равно значению True, то размер элемента управления автоматически изменяется под размер изображения выводимого в объект. False  - не изменяется размер элемента управления.

Picture

 Графический

Позволяет загрузить графическое изображение из файла, либо в режиме конструктора, необходимо в соответствующей строке окна свойств нажать на кнопку […] и выбрать на диске имя необходимого файла.  Либо, необходимо загрузить изображение следующим программным кодом:

Imаge1.Picture = LoadPicture(“Полное имя файла”)


5.6 Объект Форма

Объект форма представляет собой пользовательское диалоговое окно. На форму размещают необходимые элементы управления. Форма имеет следующие основные свойства:

Основные свойства Формы

Имя свойства

Тип свойства

Значение

Name

Строковый

Имя Формы

Caption

Строковый

Текст заголовка окна формы

Visible

VBA языке, в объекте Форма данное свойство доступно только для чтения )

Логический

Позволяет определить, видна форма  или скрыта. Значения указанного свойства соответствуют: 

  •  True – форма видна
  •  False – форма скрыта

А так же следующие основные методы и события:

Основные методы Формы

Имя метода

Назначение

Show

Показать форму проекта

Hide

Скрыть форму проекта


Основные события Формы

Имя события

Когда происходит

Activate

Во время активизации формы (это событие происходит в момент первого вывода на экран формы , если загруженную форму скрыть, а затем показать, событие Activate не произойдет. Данное событие предназначено для определения активности пользовательской формы,  в том случаи ,  когда вместе с ней загружены другие формы.)

Deactivate

В тот момент, кода форма стала неактивной. (событие работает только при загрузке нескольких пользовательских форм)

Initialize

В момент загрузки формы в память компьютера

Terminate

Перед выгрузкой формы из памяти компьютера

Загруженная форма проекта приостанавливает работу Excel приложения, но при загруженной форме можно осуществлять обработку книг Excel через соответствующие объекты. При этом, программа обрабатывающая книги Excel запускается  через элементы управления расположенные на форме, или через события формы.

Метод Hide объекта формы не выгружает ее из памяти, а делает форму просто невидимой. Скрытая форма не приостанавливает работу Excel .  Метод Show загружает форму в память, если она не была ранее загружена, и, делает ее видимой.  В VBA существуют операторы  загрузки формы в память - Load (Без вывода формы на экран),  и, оператор выгрузки формы из памяти - Unload.  Формат использования операторов следующий:

Load / Unload   ИмяФормы    

В загруженной (и скрытой) форме сохранятся значения измененных ее свойств, а также измененные значения свойств элементов управления расположенных на форме.  Если форма выгружена из памяти, то указанные свойства приобретают значение, которые установил программист в режиме конструктора формы. В VBA допускается программное изменение свойств формы, и свойств ее элементов управления, без предварительной ее загрузки оператором Load:

ИмяФормы.СвойсвоФормы = значение

ИмяФормы.ИмяЭлементаУправления.СвойсвоЭлементаУправления = значение

При программном изменении указанных свойств незагруженная форма автоматически загружается в память компьютера, но при этом не выводится на экран.

В языке VBA,  допускается обращение к форме через ключевое, английское слово Me, но только внутри модуля формы!  Me, внутри модуля формы, является альтернативой имени формы, которое определенно в свойстве Name.

 

6 Диалоги

Для запусков стандартных диалогов VBA применяются стандартные процедуры и функции. Существует 3 основных  диалога: Окно сообщения, Окно ответа на вопрос, Окно ввода текстовой информации. Все диалоги приостанавливаю работу Excel, пока их окна не будут закрыты.

Диалоги VBA

Имя подпрограммы диалога

Тип  подпрограммы

Назначение диалога

MsgBox ТекстСообщения , _

 [Тип], [ ТекстЗаголовка ]

Процедура

окно сообщения

MsgBox( ТекстСообщения , _

 [Тип], [ ТекстЗаголовка ] )

Функция

окно ответа

InputBox( ТекстСообщения , [ ТекстЗаголовка ] )

Функция

окно ввода

В диалогах MsgBox в параметре Тип можно задать один параметр, или несколько параметров объединенных знаком +, которые определяют количество кнопок на диалоге, вид окна диалога, а так же активность конкретной кнопки. В качестве Текста Сообщения и Текста Заголовков в диалоговых окнах может использоваться имя переменной,  имя константы, а так же неименованная константа, любого, не структурированного типа.

Параметры MsgBox задающие количество кнопок окна 

Имя параметра

Кнопки

VbOKOnly

Только кнопка OK (параметр по умолчанию)

VbYesNo

Кнопки Yes, No

VbYesNoCancel

Кнопки Yes, No, Cancel

VbOKCancel

Кнопки Ok, Cancel

Параметры MsgBox задающие вид окна 

Имя параметра

Вид окна

VbCritical  

Окно выводится с красным кружком, перечеркнутым белыми линиями

VbQuestion

Окно выводится с синим вопросительным знаком  на белом кружке

VbExclamation

Окно выводится с черным восклицательным знаком на желтом треугольнике

VbInformation

Окно выводится с синей буквой i на белом кружке


Параметры MsgBox задающие активность кнопки 

Имя параметра

Примечание

VbDefaultButton 

№ - цифра, определяющая номер кнопки, которую делают активной, кнопки нумеруются с цифры 1.

При запуске функции MsgBox  ее значение сравнивают со стандартными константами, через значения которых можно определит код нажатой кнопки.

Константы для определения нажатой кнопки окна MsgBox 

Имя константы

Если функция MsgBox равна указанному значению

VbOk  

Нажата клавиша OK 

VbCancel

Нажата клавиша Cancel

VbYes

Нажата клавиша Yes

VbNo

Нажата клавиша No

Пример:

If  MsgBox(“Продолжить”, VbYesNo+ VbQuestion) = VbYes then

F = True

Else

F = False

End if

В примере указанном выше выводится диалоговое окно сообщением “Продолжить”. На диалоговом окне две кнопки Yes и No, которые заданны константой VbYesNo. Так же на этом окне есть пиктограмма вопросительного знака, заданная константой VbQuestion. Если пользователь нажмет на кнопку Yes указанного окна, то переменная F примет значение True, или значение False, если пользователь нажмет на кнопку No.


7 Работа с файловой системой

7.1 Введение

Компьютерная информация после выключения компьютера сохраняется в файлах. Файл представляет собой именованную область данных расположенную обычно на диске. Диском является дискета, а так же жесткий , магнитный диск  устройства называемого винчестер.  Так же диском является  лазерный диск.  

Устройство для считывания и записи информации на дискету называется дисководом. Винчестер это устройство находящееся внутри процессорного блока компьютера, которое содержит в себе несъемный, жесткий магнитный диск. Устройство для работы с лазерным диском называется CD ROM или лазерный дисковод. Каждое из этих устройств имеет свое имя, имя начинается с латинской буквы, и заканчивается двоеточием (:).

Имена устройств, предназначенных для чтения дисков 

Имя диска

Имя устройства

A:

Дисковод

B:

Второй дисковод (в настоящее время на компьютер обычно не ставится)

С:

И более старшая буква ( D, E и т.д.) – Винчестер

D:

И более старшая буква ( E, F  и т.д.) – СD ROM (если таковой имеется) или Винчестер

Как видно из таблицы СD ROM является, обычно, последним дисковым устройством на компьютере.  Даже если у вас на компьютере имеется только один физический винчестер, возможно, его логическое деление на два и более дисков, к которым обращаются через различные имена.

Помимом имени  каждый диск имеет метку тома. Метка тома, это специальная метка диска записанная текстовом формате, по которой его можно идентифицировать. Например, можно запретить работу VBA программы, если значение метки тома диска не удовлетворяет условию.

Диск,  разделяется на определенные именованные области Папки (Каталоги, Директории).  Папка это “контейнер” предназначенный для хранения файлов.  В папке может находиться другая папка.  

Существует понятие – корень диска(корневая директория диска, корневой каталог диска). Корневой каталог диска это единственная папка на диске, которая не имеет имени, ее невозможно записать в другую папку.  В коневом каталоге содержаться все  файлы и папки верхнего уровня диска.

 В операционной системе Windows имеется папка Рабочий Стол, содержимое которой сразу видно пользователю при загрузке Windows.  Другие папки пользователь может увидеть через специальные программы, например, через программу Мой компьютер.

В папках, которые находятся в корневой директории диска, могут находиться другие паки и файлы, и т.д.

Имя папки или файла записывается в следующем формате:

ИмяПапкиИлиФайла.Расширение

Имя папки или файла может содержать в себе от 1 до 256 символов (латинские буквы или кириллица, а также, некоторые другие символы).  Расширение отделяется от имени точкой и содержит в себе 0-4 символов. Папка, как правило, не имеет расширения. Расширение обычно определяет тип файла:


Типы некоторых файлов по расширениям 

Расширение

Тип файла

txt

текстовый файл

xls

книга Excel

xla

Надстройка Excel

doc

документ Word

exe

Исполняемый файл

htm, html

Файл, содержащий страницу интернет

lnk

Ярлык файла

Полным именем файла называется совокупность имени файла и пути к нему. Имена директорий и имена файла отделяются друг от друга знаком слеш ( \ ).

Пример:

D:\Moй.xls

C:\Мои документы\Moй.xls

C:\Мои документы\Файлы Excel\Moй.xls

В первом примере файл с именем Moй.xls находится в корне диска D:. Во втором примере файл с именем Moй.xls находится на диске C: , в директории Мои документы. В третьем примере файл с именем Moй.xls находится на диске C: , в директории Файлы Excel, а директория Файлы Excel находится в папке Мои документы.

Иногда необходимо задать маску для файлов. Маска файлов это способ обращения к группе файлов по определенным признакам. Маска может содержать символ звездочка ( * ), обозначающий любой символ, и вопросительный знак ( ? ), обозначающий не более одного употребляемого символа.

Примеры масок для файлов 

Маска

Назначение

*.*

Любой файл, с любым расширением

*.

Любой файл без расширения

*.xls

Файлы с расширением xls

A*.*

Все файлы,  имена которых начинаются на букву A

??.*

Все файлы,  имена которых содержат не более двух символов

Помимо файлов и папок на диске могут находиться ярлыки. Ярлык это специального формата файл, в котором содержатся данные для указателя на другой файл. Через ярлык можно запускать файлы различного типа в системе Windows.  В пиктограмме ярлыка имеется стрелка       , по которой можно определить является ли файл ярлыком.

7.1.3 Работа с файловой системой через программу Мой компьютер (My Computer)

Работа с программой Мой компьютер во многом схожа с работой с окном Excel сохранения и открытия файлов (см. 8 Архитектура проекта -8.1 Введение) . Программа  Мой компьютер может быть загружена при помощи двойного клика по соответствующему  ярлыку программы расположенному на рабочем столе.  Смена диска и смена папок в программе Мой компьютер происходит точно так же, как в окне Excel сохранения и открытия файлов.  Файл или папка в текущей директории в программе Мой компьютер создается через меню Файл-Создать-Папка/Тип_создаваемого_файла(File-New-Folder/Тип_ создаваемого_файла).  

Файл или папка выбирается кликом левой клавиши мыши по соответствующему имени или пиктограмме файла или папки. Группа файлов или папок выбирается кликом левой клавиши мыши по их имени, при нажатой клавише CTRL.

Сменить имя выбранного файла или папки можно через меню Файл-Переименовать. 

Двойным кликом левой клавиши мыши по имени папки или файла можно  открыть файл или папку.

Выделенные файлы и папки удаляются клавишей Delete.

Выделенные файлы и папки можно скопировать или перенести в другую директорию по следующему алгоритму:

  1.  При выделенных файлах войти в меню Правка-Копировать ( или в меню Правка-Вырезать для переноса файлов)
  2.  Открыть диск и директорию, куда хотим переносить или копировать файлы
  3.  Войти в меню Правка-Вставить

Через программу Мой компьютер возможно сменить метку тома диска. Для этого необходимо кликнуть правой клавишей мыши по пиктограмме выбранного диска, и выбрать пункт в контекстном меню – Свойства(Properties).   В появившемся окне выбрать закладку Общие. Набрать новую метку тома для диска и нажать кнопку OK.

Возможен просмотр и изменение свойств папок и файлов после клика правой клавиши мыши по имени соответствующего файла, и выбора пункта в контекстном меню – Свойства. Через пункт Свойства возможно смена любого свойства файла, кроме имени файла. Для смены имени файла или папки, после клика правой клавиши мыши на последних необходимо выбрать пункт меню Переименовать(Rename), а затем изменить имя файла.

7.2 Функция DIR ( Просмотр содержимого директории и определение наличия файла на диске)

Функция DIR  позволяет прочитать содержимое указанной директории:

 DIR ( “Путь и маска” [ , Тип_Файла ] )

“Путь и маска” – Определяют директорию и маску просматриваемых файлов. Если путь опущен, просматриваются файлы в текущей директории активного диска.

Тип_Файла – константа, определяющая тип просматриваемых файлов (см. таблицу ниже).

Константы функции DIR определяющие тип просматриваемых файлов 

Имя константы

Значение

Типы просматриваемых файлов

VbNormal

0

Обычный (параметр по умолчанию)

VbHidden

2

Скрытый

VbSystem

4

Системный

VbVolume

8

Метка тома

VbDirectory

16

Директория

Функция DIR выдает имя первого, встретившегося файла, которое  удовлетворяет указанное условие. Если функцию DIR затем запустить без входных параметров, то она выдает имя последующего файла, которое  удовлетворяет условию записанному во входном параметре функции DIR  выше по тексту программы.

‘Пример загрузки списка  имен файлов в ComboBox1,

‘которые имеют расширение xls и находящихся в текущей директории диска

Private Sub ComboBox1_MouseDown(ByVal Button As Integer, _

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Static s As Variant

If TypeName(s) <> "String" Then

ComboBox1.Clear

s = Dir("*.xls")

While s <> ""

ComboBox1.AddItem s

s = Dir

Wend

End If

End Sub

При помощи функции DIR можно проверить  существование файла, указав в качестве пути и маски полное имя файла. Функция DIR содержащая входной параметр, определяющий путь и имя файла, будет не равна пустой строке, если указанный файл на диске существует.

‘Определение наличия файла на диске по его полному имени

If  Dir("Полное имя файла")  < > “” then

‘Файл существует

Else

‘Файл отсутствует

End if


7.3 Работа с дисковым пространством

В таблице ниже представлены процедуры и функции для работы с папками:

Процедуры и функции для работы с папками 

Имя процедуры или функции

Тип

Назначение

CurDir([“Имя Диска”]) 

Функция

Выдает текущую директорию указанного диска,  или выдает текущую директорию текущего диска, если параметр “Имя Диска” опущен

ChDrive“Имя Диска”

Процедура

Сменяет текущий диск

СhDIR “Имя Каталога

Процедура

Сменяет текущий каталог. “Имя Каталога” может содержать полный путь к каталогу, или только имя каталога находящегося в текущей директории текущего диска. Данный оператор меняет текущую директорию на диске, но не меняет активный диск!

MkDIR “Имя Директор

Процедура

Создает новую директорию на диске. “Имя Директории” может содержать полный путь к директории, или только имя директории которая создается в текущей директории текущего диска.

RmDIR “Имя Директор

Процедура

Удаляет указанную директорию на диске. “Имя Директории” может содержать полный путь к директории, или только имя директории которая удаляется в текущей директории текущего диска.

7.3.1 Дополнительные функции для работы с дисковым пространством

Возможно подключение дополнительных функций для работы с дисковым пространством. Для этого необходимо установить указатель на объект файловой системы, и, на активный диск:

Dim FS As Variant, d As Variant

 ‘Установить указатель на объект файловой системы

Set FS = CreateObject("Scripting.FilesystemObject")

‘Установить указатель на диск

 Set ds = FS.getDrive(“Имя диска”)


Функции объекта файловой системы 

Имя процедуры или функции

Тип

Назначение

GetDrive(“Имя Диска” ) 

Функция

Позволяет установить указатель на диск

DriveExists(“Имя Диска” )

Функция

Логическая функция, которая позволяет определить существует ли указанный диск, функция имеет значение true если диск существует, и false - если он отсутствует

Свойсва указателя установленного на диск 

Имя свойства

Тип

Назначение

DriveType 

Числовой

Позволяет определить тип дискового устройства:

  •  0 – неизвестный тип
  •  1 – дисковод
  •  2 – жесткий диск
  •  3 – сетевой диск
  •  4 – CD ROM
  •  5 – диск  RAM 

IsReady

Логический

Позволяет определить готовность дискового устройства (втавлен диск в дисковод или в CD ROM), свойство имеет значение true если диск готов к работе, и false -  в обратном случаи

TotalSize

Числовой

Определяет объем дискового пространства в байтах

FreeSpace

Числовой

Определяет объем оставшегося дискового пространства в байтах

VolumeName

Текстовый

Читает и устанавливает новую метку тома диска

Примечание:

Своства TotalSize, FreeSpace, в Windows 98 определяют размер дискового пространства правильно до мегабайта, свыше мегабайта размер дискового пространства определяется в заниженных цифрах, но кратных гигабайту. В Windows XP данные свойства работают правильно на любой размерности диска.

Пример процедуры, которая устанавливает новую метку тома на диск:

Public Sub УстановитьМеткуТома(ByVal Dr As String, _

МеткаТома As String)

Dim FS As Variant, d As Variant

 Set FS = CreateObject("Scripting.FilesystemObject")

 Dr = Mid(Dr, 1, 1) + ":"

If FS.Driveexists(Dr) = True Then

 Set d = FS.getDrive(Dr)

 d.VolumeName = МеткаТома

  Else

 MsgBox "Отсутствует указанный Диск!"

 End If

Set d = Nothing

Set FS = Nothing

End Sub

Примечание:

В нашем примере в качестве указателей используются переменные типа Variant. Применения таких переменных не позволяет посмотреть список свойств указателей и их методов в редакторе модуля (см. 11.2 Список имен потомков, методов и свойств объектов в окне редактора модуля). Для того, что бы получить такую возможность необходимо установить ссылку на соответствующий объект через меню Сервис-Ссылка (Tolls-Referens)- Microsoft Scripting RunTime.  И объявить переменные, указанные в примере выше,  иначе:

Dim FS As FileSystemObject, d As Drive


7.4 Работа с файлами

Файлы, с которыми работает программист VBA можно разделить на три типа:

  •  Текстовый файл - предназначен для хранения текстовой информации. Информация в этом файле представлена в виде строк символов.
  •  Двоичный файл, не структурированный файл, информация в котором представлена в виде набора байтов.
  •  Файл произвольного типа данных,  структурированный файл, обычно файл записей. Информация в этом файле представлена в виде записей, точнее,  в виде групп байтов.

Надо сказать, что любой файл состоит из байтов, например, в текстовом файле в байтах хранятся коды символов строк, или служебные символы. Байт содержит в себе целое число в диапазоне 0-255 записанное в двоичной системе. Любой файл в независимости от его типа можно операторами VBA открыть как двоичный файл.

Надо еще отметить, что файлы книги Excel и файлы надстроек Excel обрабатываются методами соответствующих объектов, а не теми способами, которые мы указали в данной главе этой книги.

Файл имеет свою длину, которая измеряется количеством байт содержащимися в файле.

 

  •  Байт – 8 бит (восемь разрядов для двоичного числа)
  •  Килобайт – 1024 байта
  •  Мегабайт  - 1024 килобайт
  •  Гигабайт - 1024 мегабайт

  1.  это ближайшее число к 1000 полученное возведением цифры 2 в N степень - 210 = 1024.

Длина файла всегда кратна байту.  Файл не может содержать в себе количество бит, не кратных 8. Длина файла в битах никогда не выражается.

 Текстовый файл называется файлом последовательного доступа, потому, что из него можно считывать информацию только последовательно, невозможно считать последующую строку из текстового файла не прочитав предыдущую, и невозможно прочитать последующий символ не прочитав предыдущий.

Двоичный файл и файл произвольного типа данных являются файлами произвольного доступа. К любой записи файла произвольного типа, и к любому байту двоичного файла можно обращаться напрямую по их порядковому номеру.

Каждый файл, с которым работает программист VBA, должен быть открыт оператором Open.

Ниже нами показан формат данного оператора.

Open “Имя файла”  For  РежимОтк  [ Access  Доступ ]  _

as  #Номер [Другим]  [Len = ДлинаЗписи]

где

Openоператор открывающий файл

“Имя файла” – полное имя файла, или только имя файла, который находится в текущей директории текущего диска

For – служебное слово перед определением режима открывания файла

РежимОтк – одно из служебных слов определяющее режим открывания файла:

  •  Input –  Открыть текстовый файл для чтения данных
  •  Output – Открыть текстовый файл для записи данных
  •  Append – Открыть текстовый файл для дозаписи данных
  •  Binary - открыть двоичный файл
  •  Random - открыть файл произвольного типа данных

Access – служебное слово перед определением доступа к данным двоичного или типизированного файла.

Доступ – служебные слова, определяющие режим доступа к данным:

  •  Read   чтение данных
  •  Write запись данных
  •  Read Write – чтение и запись данных (режим по умолчанию)

as – служебное слово перед определением номера файла.

# – служебный символ перед номером файла

Номер – номер открываемого файла, файлы нумеруются 1,2,3 и т.д.

Другим – служебное слово, которое определяет тип доступа к данным открытого файла для другого оператора Open или для другой компьютерной программы.  Другим  - может иметь следующие значения:

  •  Shared – к открытому файлу можно свободно обращаться используя другой оператор Open,  или используя другую компьютерную программу (данный режим устанавливается по умолчанию)
  •  Lock Read – запрет на чтение файла (для Других этот файл только для записи).  Данный файл невозможно прочитать другим оператором Open, или другой компьютерной программой.
  •  Lock Write – запрет на запись файла (для Других этот файл только для чтения).  В данный файл невозможно записать данные через другой оператор Open, или через другую компьютерную программу.
  •  Lock Read Write - запрет на чтение и запись файла (для Других этот файл недоступен) Данный файл невозможно прочитать другим оператором Open, и невозможно записать в него данные через другой оператор Open, или через другую компьютерную программу.

 Len –определяет количество считываемых или записываемых байтов, за одно обращения к данным в файле произвольного типа данных через соответствующий оператор ввода или вывода данных.

После открытия файла возможно чтение или запись данных в файл.

После того, как программист завершил работу с файлом необходимо его закрыть следующим оператором:

Close #НомерФайла

где

# – служебный символ перед номером файла

НомерФайла – номер закрываемого файла

Функции и процедуры для работы с файлами 

Имя функции

Тип

Назначение

EOF(НомерФайла) 

Логический

Определяет, достигнут ли конец файла при его последовательном чтении. Функция имеет значение true, если достигнут конец файла,  и False  в противном случаи.

LOF(НомерФайла)

Длинное целое

Определяет длину файла в байтах.

FileLen(“Имя файла”)

Длинное целое

Определяет длину неоткрытого файла в байтах.

“Имя файла” – может содержать в себе полное имя файла, или имя файла находящегося в текущей директории текущего диска. 

Loc(НомерФайла)

Длинное целое

Определяет номер последней считанной или записанной записи в файл произвольного типа данных,  или номер последнего считанного или записанного байта в двоичном файле.

FreeFile

Короткое целое

Выдает не занятый номер для файла.

Kill “Путь и маска

-

Процедура для уничтожения неоткрытых файлов. Если путь во входном параметре опущен, то уничтожаются файлы в текущей директории. Вместо маски может использоваться имя файла.

FileCopy “Имя Файла”,  _

“Новое Имя Файла”

-

Процедура для копирования не открытого файла.  

“Имя Файла” – имя файла в текущей директории текущего диска, или полное имя файла, с которого делается копия.

“Новое Имя Файла”– имя файла для копии в текущей директории текущего диска, или полное имя файла для копии.

GetAttr(“Имя файла”)

Короткое целое

Определяет атрибуты неоткрытого файла.

“Имя файла” – может содержать в себе полное имя файла, или имя файла находящегося в текущей директории текущего диска.

Значение функции может быть сравнено с числом или с константой определяющей атрибут файла:

  •  VbNormal или 0 - обычный файл
  •  VbReadOnly или 1 –файл только для чтения
  •  VbHidden или 2 – скрытый файл
  •    VbSystem или 4 – системный файл
  •  vbDirectory или 16 – директория
  •  vbArchive  или 32 – архивный файл 

SetAttr “ Имя файла”, _

Attributes

-

Процедура для установки атрибута файла. Attributes  номер устанавливаемого атрибута (см. выше GetAttr, там же см. о параметре “Имя файла”)

FileAttr( НомерФайла, _

returntype)

Короткое целое

Определяет способ, которым открыли файл оператором Open. Если returntype = 1 то данная функция возвращает номер режима. Другое значение параметра returntype  не допускается устанавливать на современных компьютерах.  Номера режимов:

  •  1 – Input
  •  2 – Output
  •  4 – Random
  •  8 – Append
  •  16 – Binary



Операторы для чтения и записи данных в файл 

Имя оператора

Назна-чение

Пояснение

Print #НомерФайла _

 [, CписокПеременных] [ ; / , ]

Запись данных

Позволяет записать список переменных  или список выражений в текстовый файл с переводом строки в текстовом файле. Выражения и имена переменных списка отделяются друг от друга запятой, или точкой с запятой.  Если оператор Print # заканчивается точкой, или точкой с запятой, то он не переводит строки в текстовом файле.  Символ точка с запятой разделяет список числовых переменных в текстовом файле двумя пробелами, а символ запятая десятью пробелами.


Write
#НомерФайла _

[, CписокПеременных] [ ; / , ]

Запись данных

Позволяет записать список переменных  или список выражений в текстовый файл с переводом строки в текстовом файле. Выражения и имена переменных списка отделяются друг от друга запятой или точкой с запятой. Если оператор Write # заканчивается точкой, или точкой с запятой, то он не переводит строки в текстовом файле.  Значение строковых переменных выводится в текстовый файл оператором Write # в кавычках. Значения переменных в текстовом файле отделяются друг от друга запятыми. Если вы в одной строке текстового файла содержите значение числовых и строковых переменных необходимо их записывать оператором Write #, а не Print # что бы в последствии избежать ошибок считывания данных оператором Input  # .

Input #НомерФайла  _

[, CписокПеременных]

Чтение данных

Позволяет прочитать в список переменных  информацию из текстового файла. Имена переменных списка отделяются друг от друга запятой.

Input( N, НомерФайла )

Чтение данных

Функция, позволяющая прочитать N символов, или N байт в строковом формате  из двоичного или текстового файла.

Get #НомерФайла, _

[ N ] ,  ИмяПеременной 

Чтение данных

Позволяет прочитать информацию из N  записи файла произвольного типа данных, или из N байта двоичного файла.  ИмяПеременой – переменная типа записи  для файла произвольного типа данных, или переменная  Byte для  двоичного файла.

В случаи отсутствия номера записи N читается текущая запись или текущий байт из файла. После прочтения текущего байта или текущей записи, текущим становится следующий байт  или следующая запись за прочитанной.

Put #НомерФайла,  _

[ N ] ,  ИмяПеременной

Запись данных

Позволяет записать информацию в N  запись файла произвольного типа данных, или в N байт двоичного файла.  ИмяПеременой – переменная типа записи  для файла произвольного типа данных, или переменная  Byte для  двоичного файла.

В случаи отсутствия номера записи N информация записывается в текущую запись или в текущий байт файла. И текущим становится байт (или запись), расположенный за байтом, в котором обновлялись данные.

7.4.1 Работа с текстовым файлом

Текстовый файл представляет собой последовательный набор символов записанных в байтах, т.е.  1байт = 1символ. Символы объединяются в текстовом файле в строки.  Строка завершается комбинацией двух служебных символов c десятичными кодами 13 и 10. Совокупность символов с кодами 13 и 10 не считываются оператором Input #  из текстового файла, но считываются функцией Input.   Символ с десятичным кодом 26 является служебным символом, обозначающим конец текстового файла, он должен находится в физическом конце текстового файла. Даже если за этим символом имеются  другие символы, то не возможно их прочитать, в том случаи, если файл открыт в режиме текстового файла.  Наличие символа с кодом 26 в текстовом файле необязательно. Если текстовый файл открывается в режиме дозаписи данных, то все символы в текстовом файле расположенные за первым символом  с кодом  26 (в том числе и этот символ) автоматически удаляются из файла, а запись данных начинается с позиции указанного символа. Если текстовый файл открыт в режиме дозаписи данных, и не содержит в себе символов  с кодом  26, то дозапись осуществляется с позиции  расположенной за последним байтом в файле.  Если текстовый файл открыт в режиме записи, то все его содержимое удаляется, и файл пишется заново.

Для работы с текстовым файлом полезно применять элемент TextBox в многострочном режиме. Ниже, нами показано, как записать и считать информацию в этот элемент управления из текстового файла.

‘Запись содержимого TextBox1 в текстовый файл Мой.txt

Open "C:\Мой.txt" For Output As 1

Print #1, TextBox1.Text ;

Close #1

Считывание содержимого файла Мой.txt в объект TextBox1

Dim s As String, i As Long, n As Byte

'Открываем файл

Open "C:\Мой.txt" For Input As 1

 TextBox1.Text = ""

 On Error Resume Next

  'попытка считать файл полностью

  TextBox1.Text = Input(LOF(1), 1)

 'Если ошибка считывания данных

 If Err.Number <> 0 Then

   'Закрываем файл и открываем его снова

   Close #1

     Open "C:\Мой.txt" For Input As 1

     'Считываем файл построчно

     While Not EOF(1)

      Input #1, s

      TextBox1.Text = TextBox1.Text + s

      If Not EOF(1) Then

       TextBox1.Text = TextBox1.Text + Chr(13) + Chr(10)

      End If

     Wend

 End If

 Close #1

Что бы не было проблемы для ввода символов перевода строки и символов табуляции в элементе управления TextBox полезно  использовать следующий программный код:

Private Sub TextBox1_KeyDown( _

ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Нажата клавиша Enter

If KeyCode = 13 Then

TextBox1.SelText = Chr(13) + Chr(10)

KeyCode = 0

'Нажата клавиша Tab

ElseIf KeyCode = 9 Then

TextBox1.SelText = Chr(9)

KeyCode = 0

End If

End Sub

7.4.2 Работа с двоичным файлом

Двоичный файл представляет собой последовательный набор байтов.  Если двоичный файл открыт в режиме записи данных, то можно переписывать содержимое уже записанных байтов, или добавлять новые  байты в файл.

Ниже, нами показано, как записать байты по их кодам в текстовый файл, и как считать коды байтов в TextBox из двоичного файла.

‘Считывание кодов байтов из двоичного файла

Dim n As Byte, i As Long

Open "C:\Мой.txt" For Binary Access Read As 1

TextBox1.Text = ""

i = 1

While i <= LOF(1)

 Get #1, i, n

 TextBox1.Text = TextBox1.Text + Format(n, "000") + " "

 i = i + 1

Wend

Close #1

‘Запись байтов по их кодам в двоичный файла

 Dim s As String, S1 As String, n As Byte, i As Long

Open "C:\Мой.txt" For Binary Access Write As 1

Заносим содержимое TextBox1 в S  

s = TextBox1.Text

 i = 0

While s <> ""

‘ ”Вырезаем”  символы цифр до первого пробела в строке S

 S1 = ""

 While s <> "" And Mid(s, 1, 1) <> " "

If  Mid(s,1,1) >=”0” and Mid(s,1,1) <=”9” then

 ‘добавляем в строку S1 только символы цифр  

 S1 = S1 + Mid(s, 1, 1)

End if

s = Mid(s, 2)

 Wend

 If S1 <> "" Then

 ‘Если есть цифры преобразуем их в байт

 n = Val( Mid( S1, 1, 3 ) )

 i = i + 1

‘Пишем очередной байт  в файл

 Put #1, i, n

 End If

 s = Mid(s, 2)

 Wend

 Close #1

Полезно добавить следующий программный код в событийную процедуру объекта TextBox1 для того, чтобы по коду байта представленному в текстовом формате получить символ. Представленная ниже процедура позволяет получит изображение кода символа и сам символ в объекте Label1 после двойного клика мыши по коду символа.

   

Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim s As String, i As Long

If TextBox1.SelStart > 0 Then

i = TextBox1.SelStart

While i > 1 And Mid(TextBox1.Text, i, 1) <> " "

 i = i - 1

Wend

s = Trim( Mid(TextBox1.Text, i, 4) )

If  Mid(s,1,1)>=”0” and Mid(s,1,1)<=”9”  Then

Label1.Caption = Val(s)  & "=[" + Chr(Val(s)) + "]"

Else

 Label1.Caption = s + "=Это не код для символа!"

 End If

End IfEnd Sub

Иногда текстовый файл содержит в себе символ c кодом 26, что не позволяет прочитать информацию расположенную за этим символом в текстовом режиме. Для чтения  такого текстового файла используют следующий программный код.

Open "C:\Мой.txt" For Binary Access Read As 1

 TextBox1.Text = ""

While Not EOF(1)

 TextBox1.Text = TextBox1.Text + Input( 1, #1 )

Wend

Close #1

7.4.3 Работа с файлом произвольного типа данных 

Файл произвольного типа данных представляет собой последовательный набор записей, или набор из групп байтов, причем  в каждой группе байтов количество байтов неизменно. Например, объявив длину группы кратную 2 в файле произвольного типа данных, можно будет записывать или считывать из файла данные в переменные целого типа. Если файл произвольного типа данных открыт в режиме записи данных, то можно переписывать содержимое уже имеющихся записей, или добавлять новые записи в файл.

Ниже нами приведен пример модуля макросов с процедурами, предназначенными для чтения и записи данных из рассматриваемой нами разновидности файла.

'Описание полей записи

Private Type Pipol

 Name As String * 20

Sex As String * 1

 NYear As Byte

End Type

'Объявление динамического массива записей

Dim Pipol1() As Pipol

'Запись в файл

Sub WriteToFile()

Dim n As Long, i As Long, s As String

n = Val(InputBox("Введите количество людей"))

ReDim Pipol1(1 To n)

Open "C:\Мой" For Random Access Write As 1 Len = Len(Pipol1(1))

 'переменная для хранения списка введенных людей

 s = ""

For i = 1 To n

 s = s & i & ") "

 'Вводим поля массива записей

 Pipol1(i).Name = InputBox(s + Chr(13) + "Введите фамилию и имя")

 s = s + " " + Pipol1(i).Name

 Pipol1(i).Sex = InputBox(s + Chr(13) + "Введите пол (М,Ж)")

 s = s + "," + Pipol1(i).Sex

 Pipol1(i).NYear = Val(InputBox(s + Chr(13) + "Введите возраст"))

 s = s + "," & Pipol1(i).NYear & Chr(13)

 'Пишем текущий элемент массива в файл

 Put #1, i, Pipol1(i)

Next i

Close #1

End Sub

'Чение из в файл

Sub ReadInFile()

Dim n As Long, n1 As Long, s As String

n = 1

ReDim Pipol1(1 To 1)

Open "C:\Мой" For Random Access Read As 1 Len = Len(Pipol1(1))

'Определяем длину файла в записях

n1 = LOF(1) / Len(Pipol1(1))

 While n <= n1

  Get #1, n, Pipol1(n)

 'Выводим текущий элемент массива в окно вывода

 Debug.Print Pipol1(n).Name & "," & Pipol1(n).Sex & "," & Pipol1(n).NYear

 n = n + 1

 ReDim Preserve Pipol1(1 To n)

 Wend

Close #1

End Sub

7.5 Просмотр содержимого ярлыка

В VBA возможно через указатель на ярлык получить доступ к его свойствам, которые доступны для чтения и изменения. Ниже, показана процедура получения свойств ярлыка, и пример ее запуска:

'Процедура получения содержимого ярлыка

Public Sub СодержимоеЯрлыка(ПутьКЯрлыку, Optional ПутьКФайлу, Optional ГорячаяКлавиша, _

Optional ВидОкна, Optional Иконка, Optional КомментарийИконки, _

Optional РабочаяПапка)

Dim myFSO As Variant

Dim myFL As Variant

Set myFSO = CreateObject("WScript.Shell")

Set myFL = myFSO.CreateShortCut(ПутьКЯрлыку)

ПутьКФайлу = myFL.TargetPath

ГорячаяКлавиша = myFL.Hotkey

ВидОкна = myFL.WindowStyle

Иконка = myFL.IconLocation

КомментарийИконки = myFL.Description

РабочаяПапка = myFL.WorkingDirectory

Set myFSO = Nothing

Set myFL = Nothing

End Sub

‘Пример запуска процедуры получения содержимого ярлыка

Sub ПутьКФайлуВЯрлыке()

 Dim Path

СодержимоеЯрлыка "C:\WINDOWS\Рабочий стол\Microsoft Word.lnk",  _

 ПутьКФайлу := Path

MsgBox Path

End Sub

7.6 Функция Environ (Определение местонахождения служебных директорий Windows)

Функцией Environ возможно определить служебные директории Windows. Формат вызова функции:

Environ( “Аргумент функции” / Индекс_аргумента_и_значение)

где

“Аргумент функции” – аргумент функции выраженный в строковом формате

Индекс_аргумента_и_значение - аргумент функции выраженный в целом, числовом формате.

Если функция Environ имеет строковый аргумент, то она выдает директорию, по указанному аргументу. Например, Environ(“windir”) выдаст путь к служебной директории системы Windows. Следующий программный код определит путь к папке Рабочий стол в русской версии операционной системы Windows:

Environ(“windir”)  + ”\Рабочий стол\”

Если функция Environ имеет числовой аргумент, то она выдает значение аргумента одновременно с директорией, которую определяет аргумент.  Значение аргумент от имени директории отделяется символом знака равно “=”.  Следующий программный код выдает аргументы функции Environ и их значения окно отладки:

Dim i As Long

i = 1

Do

 Debug.Print Environ(i)

 i = i + 1

Loop Until Environ(i) = ""


Оглавление

1


[1] 1. VBA for Excel

[1.1] 1.1 Введение

[1.2] 1.2 Правила оформления конструкций языка VBA  в общем виде

[1.3] 1.3 Идеология визуальных языков

[1.4] 1.4 Основные понятия визуальных языков

[1.5] 1.5 Дополнительные понятия языка VBA

[2]
2 Переменные и константы

[2.1] 2.1 Структура модуля

[2.2] 2.2  Объявление переменных и констант

[2.2.0.1] Типы   переменных и констант

[2.2.1] 2.2.2  Неявное и явное объявление переменных ( Оператор Option Explicit )

[2.3] 2.3 Неименованные константы

[2.4] 2.4 Оператор присваивания

[2.4.1] 2.4.1 Арифметические выражения

[2.4.1.1] Приоритет арифметических операций

[2.4.1.2] Математические функции

[2.4.2] 2.4.2 Строковые выражения

[2.4.2.1] Функции для работы со строками

[2.4.3] 2.4.3 Логические выражения

[2.4.3.1] Сравнение строковых переменных в логических выражениях

[2.4.4] 2.4.4 Выражения Data

[2.4.4.1] Пример изменения формата переменной Data в результате прибавления времени

[2.4.5] 2.4.5 Выражения Variant

[2.4.6] 2.4.6 Смешанные выражения  

[2.4.6.1] Функции преобразования типов

[2.5] 2.5 Функции определения типа переменной

[2.6] 2.6 Функция форматного преобразования переменной в строковый формат

[2.6.0.1] Символы числовых форматов

[2.6.0.2] Примеры форматного преобразования числовых данных

[2.6.0.3] Добавление к формату символа

[2.6.0.4] Символы  форматов переменной Date

[2.6.0.5] Примеры форматного преобразования переменной Date

[2.6.0.6] Преобразование строковых переменных

[3] 3 Подпрограммы ( процедуры и функции )

[3.1] 3.1 Описание подпрограмм

[3.2] 3.2 Входные параметры подпрограммы

[3.2.0.1] Виды входных параметров

[3.3] 3.3 Вызов подпрограмм

[3.3.1] 3.3.1 Изменение вида входного параметра при вызове подпрограммы

[3.4] 3.4 Описание событийной процедуры объекта

[3.5] 3.5 Рекурсивные подпрограммы (процедуры и функции)

[4] 4 Операторы VBA

[4.1] 4.1 Условный оператор If

[4.1.0.1] Виды условного оператора

[4.1.0.2] Знаки отношения

[4.1.0.3] Логические функции в порядке приоритета

[4.2] 4.2 Оператор выбора Case

[4.2.0.1] Выражение

[4.3] 4.3 Операторы цикла

[4.3.1] 4.3.1 Циклы for

[4.3.1.1] Оператор цикла For .. Next

[4.3.1.2] Оператор цикла For Each .. Next

[4.3.1.3] Досрочный выход из циклов For

[4.3.2] 4.3.2 Оператор цикла While .. Wend

[4.3.3] 4.3.3 Циклы DO

[4.3.3.1] Оператор цикла Do While .. loop

[4.3.3.2] Оператор цикла Do  .. Loop Until

[4.3.3.3] Другие циклы DO

[4.3.3.4] Досрочный выход из циклов DO

[4.4] 4.4 Оператор ЕND (досрочное завершение программы)

[4.5] 4.5 Оператор Exit (досрочный выход из подпрограмм и циклов)

[4.6] 4.6 Оператор перехода GOTO

[4.6.0.1] Примеры операторов безусловного прехода

[4.7] 4.7 Оператор On Error (обнаружения ошибок)

[4.8] 4.8 Оператор With (обращения к полям структурированных типов,  а так же к методам и к потомкам объектов)

[4.9] 4.9 Оператор Set (установка и снятие указателя )

[4.10] 4.10 Оператор New (создание экземпляров)

[4.11] 4.11 Оператор DoEvents (Прерывание работы подпрограммы)

[4.12] 4.12 Оператор Shell (Запуск исполняемых файлов)

[4.12.0.1] Параметры запуска окна приложения

[4.13] 4.13 Оператор AppActivate (Активизация окна другой программы)

[4.14] 4.14 Оператор SendKeys (Эмуляция нажатия на клавиши)

[4.15] 4.15 Вложенность структур операторов

[4.16]  

[4.17]

[5] 5 Структурированные типы VBA

[5.1] 5.1 Введение

[5.2] 5.2 Массивы

[5.2.1]
5.2.1 Статический массив

[5.2.2] 5.2.2 Динамический массив

[5.2.3] 5.2.3 Объявление массива через функцию Array

[5.2.4] 5.2.4 Функции определения размерности массива

[5.2.5] 5.2.5 Опрос, ввод и вывод в цикле ячеек массива  

[5.2.6] 5.2.6 Массивы массивов

[5.2.7] 5.2.7 Поиск максимума и минимума в массиве

[5.2.8] 5.2.8 Сортировка массива

[5.2.9] 5.2.9 Оператор высвобождения памяти занятой динамическим массивом и обнуления ячеек статического массива (Erase)  

[5.3] 5.3 Записи ( и массивы записей)

[5.3.1] 5.3.1 Запись с константными полями

[5.4] 5.4 Семейства (Коллекции)

[5.5] 5.5 Объекты

[5.5.1] 5.5.1 Введение

[5.5.2] 5.5.2 Объект Application

[5.5.3] 5.5.3 Объекты ActiveWorkbook, ThisWorkbook, Workbooks (связь с книгой Excel)

[5.5.3.1] Объекты для связей с книгой Excel

[5.5.3.2] Свойства объектов ActiveWorkbook, ThisWorkbook, Workbooks

[5.5.3.3] Методы объектов ActiveWorkbook, ThisWorkbook, Workbooks

[5.5.3.4] Основные события объекта Workbooks

[5.5.4] 5.5.4 Объекты ActiveSheet, Worksheets (связь с листом книги Excel)

[5.5.4.1] Объекты для связей с листами книги Excel

[5.5.4.2] Свойства объектов ActiveSheet, Worksheets

[5.5.4.3] Основные методы объектов ActiveSheet, Worksheets

[5.5.4.4]
Основные события объекта Worksheets

[5.5.5] 5.5.5 Объекты Rows, Columns ,Range, Cells, Selection, ActiveCell (связь со строками, столбцами и ячейками листа Excel)

[5.5.5.1] Объекты для связи со строками, столбцами и ячейками листа Excel

[5.5.5.2] Свойства объектов Rows, Columns ,Range, Cells, Selection, ActiveCell

[5.5.5.3] Методы объектов Rows, Columns ,Range, Cells, Selection , ActiveCell

[5.5.5.4] Вставка и удаление строк, столбцов и ячеек методами Insert, Delete

[5.5.6] 5.5.6 Элементы управления

[5.5.6.1] Основные свойства элементов управления

[5.5.6.2]
Основные события элементов управления

[5.5.6.3] Основные элементы управления

[5.5.6.4] Элемент управления CommandButton (Кнопка)

[5.5.6.5] Элементы управления CheckBox, OptionButton (Флажок, Переключатель)

[5.5.6.6] Элемент управления TextBox (текстовый редактор)

[5.5.6.7] Другие свойства элемента управления TextBox

[5.5.6.8] Элементы управления ListBox, ComboBox (Список ,Поле со списком)

[5.5.6.9] Методы и свойства элементов управления ListBox, ComboBox

[5.5.6.10] Элементы управления ScrollBar ,SpinButton (Полоса прокрутки ,Счетчик)

[5.5.6.11] Свойства элементов управления ScrollBar ,SpinButton

[5.5.6.12] Элемент управления Imаge (Рисунок)

[5.5.6.13] Свойства элемента управления Imаge

[5.5.7] 5.6 Объект Форма

[5.5.7.1] Основные свойства Формы

[5.5.7.2] Основные методы Формы

[5.5.7.3] Основные события Формы

[6] 6 Диалоги

[6.0.0.1] Диалоги VBA

[6.0.0.2] Параметры MsgBox задающие количество кнопок окна

[6.0.0.3] Параметры MsgBox задающие вид окна

[6.0.0.4] Параметры MsgBox задающие активность кнопки

[6.0.0.5] Константы для определения нажатой кнопки окна MsgBox

[7]
7 Работа с файловой системой

[7.1] 7.1 Введение

[7.1.0.1] Имена устройств, предназначенных для чтения дисков

[7.1.0.2] Типы некоторых файлов по расширениям

[7.1.0.3] Примеры масок для файлов

[7.1.1] 7.1.3 Работа с файловой системой через программу Мой компьютер (My Computer)

[7.2] 7.2 Функция DIR ( Просмотр содержимого директории и определение наличия файла на диске)

[7.2.0.1] Константы функции DIR определяющие тип просматриваемых файлов

[7.3] 7.3 Работа с дисковым пространством

[7.3.0.1] Процедуры и функции для работы с папками

[7.3.1] 7.3.1 Дополнительные функции для работы с дисковым пространством

[7.3.1.1] Функции объекта файловой системы

[7.3.1.2] Свойсва указателя установленного на диск

[7.4] 7.4 Работа с файлами

[7.4.0.1] Функции и процедуры для работы с файлами

[7.4.0.2]
Операторы для чтения и записи данных в файл

[7.4.1] 7.4.1 Работа с текстовым файлом

[7.4.2] 7.4.2 Работа с двоичным файлом

[7.4.3] 7.4.3 Работа с файлом произвольного типа данных

[7.5] 7.5 Просмотр содержимого ярлыка

[7.6] 7.6 Функция Environ (Определение местонахождения служебных директорий Windows)


Тихвинский В.И.

VBA for Excel

Методические указания

по курсу «Информатика»

Часть 1

Под общей ред. В.В. Сидорова

Свободный тем. План 200__п._____

____________________________________________________________

Подписано в печать              Формат   

Объем ___ уч.-изд.л.           Тираж___экз.

Заказ № _____

____________________________________________________________

Отдел оперативной полиграфии РГУ нефти и газа им. И.М.Губкина 119991, Москва, ГСП-1, Ленинский Проспект, 65.

 Для объявление локальных переменных помимо служебного слова Dim может использоваться служебное слово Static, об использовании которого мы рассказали в главе Подпрограммы (Процедуры и функции) –описание подпрограмм.

 Все сказанное о полях модуля справедливо и для констант модуля макросов, но чтобы константа являлась глобальным полем модуля макросов, необходимо, что бы ее объявление начиналось со служебного слова “Public”:


Public Const Имя_константы [as тип] = Значение


Естественно, что глобальное, константное поле модуля будет доступно только для чтения.

 Операторы Defтип как и специальный символ определяющий тип переменной перешел в язык VBA из старых версий Basic. Наиболее удобно при отладке программы использовать необъявленные переменные  типа Variant. Но после отладки программы необходимо для ускорения работы программы явно объявить тип таких переменных. Особенно если они используются в математических выражениях или данные переменные являются числовыми переменными цикла.

 Если переменная типа Variant является входным параметром подпрограммы, то ей можно присваивать даже значение переменной структурированного типа (cм. СТРУКТУРИРОВАННЫЕ ТИПЫ VBA, ПОДПРОГРАММЫ ).

 О массивах рассказано нами в главе СТРУКТУРИРОВАННЫЕ ТИПЫ VBA

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

 Об операторе If  и цикле For each, который рассматривается ниже,  вы можете посмотреть в следующей главе книги.

 Статитческий массив обычно не имеет специального термина, который определяет его разновидность, но мы применили этот термин в противовес термину динамический массив.

 Возможно объявить массив как глобальное поле модуля, в разделе объявления глобальных переменных служебными словами Private, Public. Но Public массив разрешается объявлять только в модуле макросов. Внутри подпрограммы массив так же может объявляться служебным словом Static.

 Возможно объявить динамический массив как глобальное поле модуля, в разделе объявления глобальных переменных служебными словами Private, Public. Но динамический массив Public разрешается объявлять только в модуле макросов. Размерность динамического массива Public и Private меняют точно так же, как и размерность динамического массива объявленного служебным словом Dim.

* Если массив 3-х и более мерный, применяют N вложенных циклов и N индексов.

 Даже в многострочном режиме не работает кнопка Enter при редакции текста в TextBox. Чтобы ввести новую строку в этом объекте нужно нажать клавишу перемещения курсора вниз. Если даже это не поможет, то вам придется добавить программный код в событийную процедуру соответствующего объекта:


Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)


If KeyCode = 13 Then


TextBox1.SelText = Chr(13) + Chr(10)


KeyCode = 0


End If


End Sub

 В MS Office 2000,  и, в более старших версиях, есть возможность запускать форму не приостанавливая работу Excel, в этих версиях метод Show может иметь входной параметр со следующими значениями:


0 – окно не модальное (форма не приостанавливает работу Excel)


1– окно модальное (форма приостанавливает работу Excel)

 Созданную папку или файл обычно переименовывают

 О единицах измерения объема дисковой памяти рассказано в следующем параграфе данной главы. Длина файла и объем дискового пространства измеряются в одних и тех же единицах.

 К сожалению мы не нашли лучшего термина для обозначения этого типа файлов, с которым работает программист VBA. Он не может быть назван типизированным, т.к. при его объявлении не указывается тип записываемой в него информации.  Термин “Произвольный”, который мы нашли в справочной системе редактора VBA показался нам черезчур не полным.

 Как прочитать такие символы из текстового файла, рассказано нами в следующем параграфе




1. Учет доходов и расходов предприятия
2. Як ви оплачуєте Ви можете дайте відповідь -
3. политическую и правовую жизнь
4. М Кирова Защищено-
5. тема планів в організації Упровадження перетворення стратегії в реальні справи є заключним етапом страт.
6. второго кризиса экономической теории Запада в XX в.
7. на тему- Світле майбутнє з Інтернетом Науковопошукова робота з основ інформатики студе
8. Протестант 1995 Перевод с французского введение примечания доктора исторических наук Н
9. Средняя общеобразовательная школа 12 Исследовательская работа- Анализ коллабораци
10. Сині етюди Тепер про форму
11. тема на сегодняшний день
12. Эзопов язык как художественный прием на примере одного или нескольких произведений
13. тема трех однофазных токов одинаковой частоты сдвинутых друг относительно друга на 1200
14. девушкаволонтёр из Минского кошачьего приюта
15. ТЕМА- ПРАВИЛА ПРОВЕДЕННЯ ТУРИСТИЧНОГО ПОХОДУ ПЛАН 1
16. Вышивка в православном храме
17. Исследование деятельности института опеки и попечительства в России
18. тема социальнопедагогической помощи лицам с ограниченными возможностями имеет многопрофильную инфраструк
19. . Що ми називаємо тепловою машиною 2.
20.  відділ туризму управління економічного та інтеграційного розвитку виконавчого комітету