Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

Глава 8. Основы программирования на VBA

215

Переменные, типы данных и константы

Главное назначение VBA— обработка данных. Одни данные сохраняются в объек­ тах, например в диапазонах рабочих листов, а другие — в созданных переменных.

Переменная представляет собой именованное место хранения данных в памяти ком­ пьютера. Переменные могут содержать данные разных типов — от простых логических, или булевых, значений (True или F a lse ) до больших значений с двойной точностью (см. следующий раздел). Значение присваивается переменной с помощью оператора ра­ венства (подробнее об этом — далее). Вы существенно облегчите себе жизнь, если нау­ читесь присваивать переменным простые описательные имена. Однако помните, что VBA поддерживает несколько правил, ограничивающих вас в именовании переменных.

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

VBA не различает регистры. Чтобы сделать имена переменных удобочитаемыми,

программисты часто используют смешанный регистр (например, I n t e r e s t -

R a t e , а не i n t e r e s t r a t e ) .

• Нельзя использовать в именах пробелы или точки. Чтобы сделать имена перемен­ ных более удобными для чтения, программисты вводят символ подчеркивания

( I n t e r e s t _ R a t e ) .

Специальные символы объявления типов (#, $, %, & или !) также не применяются в имени переменной.

Названия переменных ограничены 254 символами (вряд ли вы, будучи в здравом уме, придумаете настолько длинное название).

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

х= 1

I n t e r e s t R a t e = 0 . 0 7 5

LoanPayof f A m ou n t

= 2 4 3 0 8 9 . 8 7

D a ta E n te re d = F a l s e

x = x + 1

 

MyNum =

YourN um

* 1 . 2 5

UserName

= "Б о б

Д ж онсон"

D a t e S t a r t e d = # 1 2 /1 4 /2 0 0 6 #

В VBA используется очень много зарезервированных слов, т.е. таких слов, которые не допускается применять в качестве названий переменных или процедур. Если вы попытае­ тесь ввести одно из таких слов, то будет отображено сообщение об ошибке. Например, не­ смотря на то что зарезервированное слово Next могло бы стать описательным названием многих переменных, следующая инструкция генерирует синтаксическую ошибку:

Next = 132

К сожалению, сообщения о синтаксических ошибках не всегда достаточно описа­

тельны. Указанная

выше инструкция генерирует сообщение об ошибке: C om pile

erro r: E xpected

V a ria b le (Ошибка компиляции: ожидается переменная). Ситуа­

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

216

Часть III. Visual Basic for Applications

Определение типов данных

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

Тип данных указывает, в каком виде данные хранятся в памяти: как целые значения, дейст­ вительные числа, текст или др. VBA может автоматически типизировать данные, однако это чревато негативными последствиями — медленным выполнением операций и менее эффек­ тивным использованием памяти. В результате, позволяя VBA самостоятельно определять ти­ пы данных, вы можете столкнуться с проблемами выполнения больших или сложных прило­ жений. Если вам приходится экономить каждый байт памяти, то вы должны хорошо разби­ раться в типах данных. Еще одно преимущество явного объявления типа данных всех используемых переменных состоит в том, что хотя VBA дополнительно ищет ошибки на эта­ пе компиляции, подобные ошибки довольно сложно выявить другими способами проверки.

В табл. 8.1 перечислены поддерживаемые в VBA типы данных (специальные типы данных будут описаны далее в этой главе).

Таблица 8.1 . Встроенные типы данных VBA

Тип данных

B y t e

B o o l e a n

I n t e g e r

Long

S i n g l e

D o u b le

C u r r e n c y

D e c im a l

D a te Obj e c t

S t r i n g

(переменной

длины)

S t r i n g

(фиксирован­ ной длины)

V a r i a n t

(числа)

Количество зарезерДиапазон значений вированных байтов

1

0-255

2

T ru e (Истина) или F a l s e (Ложь)

2

-32768 - 32767

4

-2147483648 - 2147483647

4

-3.402823Е38 - -1 .401298Е-45 (отрицательные

 

числа); 1.401298Е-45 - 3.402823Е38 (положитель­

 

ные числа)

8

-1,79769313486232Е308 -

 

-4,94065645841247Е-324 (отрицательные числа);

 

4,94065645841247Е—324 - 1,79769313486232Е308

 

(положительные числа)

8

-922337203685477,5808 - 922337203685477,5807

12

+/-79228162514264337593543950335 без десятич­

 

ных знаков; +/-7,9228162514264337593543950335

 

с 28 знаками после запятой

8

1 января 100 года - 31 декабря 9999 года

4

Любая ссылка на объект

10 + длина строки

0 - приблизительно 2 млрд символов

Длина строки

1 - приблизительно 65400 символов

16

Любое числовое значение в пределах диапазона типа

 

данных Double. Может также включать специальные

 

значения типа Empty, E r r o r , N o th in g и N u l l

Глава 8. Основы программирования на VBA

217

 

 

 

Окончание табл. 8.1

Тип данных

Количество зарезер­ Диапазон значений

 

 

вированных байтов

 

 

Variant

22 + длина строки

0 - примерно 2 млрд

 

(символы)

Зависит от типа

Зависит от элемента

 

Пользова­

 

тельский

 

 

 

Примечание

Тип данных D e c im a l необычен тем, что его нельзя объявить. На самом деле он является подтипом типа V a r i a n t . Для преобразования в десятичный тип данных типа v a r i a n t воспользуйтесь функцией VBA CDec.

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

Для проведения математических вычислений в рабочих листах Excel использует тип дан­ ныхDouble. Его рекомендуется применять и в процессе обработки чисел в VBA для обеспе­ чениятой же точности вычислений. Для обработки целочисленных значений идеально подхо­ дит тип I n te g e r , если, конечно, вы уверены, что используемые значения не превышают 32767. В противном случае обратитесь к типу данных Long. При управлении номерами строк в рабочем листе Excel лучше применять тип данных Long, так как количество строк в рабо­ чем листе превышает максимальное значение, допустимое в типе данных I n te g e r .

Тестирование типов данных

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

Sub T i m e T e s t ()

 

 

Dim

х

A s

L o n g ,

у

A s L o n g

Dim

A

A s

D o u b le ,

В A s D o u b le , С A s D o u b le

Dim

i

A s

L o n g ,

j

A s L o n g

 

Dim

S t a r t T i m e

A s

D a t e , E n d T im e A s D a t e

'

С о хран ени е

 

в р е м е н и

н а ч а л а в ы ч и с л е н и й

 

S t a r t T i m e = T im e r

 

'

Выполнение

 

в ы ч и с л е н и й

 

х

=

О

 

 

 

 

 

 

 

 

у

=

О

 

 

 

 

 

 

 

 

F o r

i =

1

 

То

10000

 

 

 

х

=

х

+

 

1

 

 

 

 

 

у

=

х

+

 

1

 

 

 

 

 

F o r

j

 

=

1То

10000

 

 

 

А

=

 

х

+

у

+

i

 

 

 

В

=

 

у

-

х

-

i

 

 

 

С

=

 

х

/

у

*

i

 

 

N e x t

j

 

 

 

 

 

 

 

N ext

i

 

 

 

 

 

 

 

1

Получение

 

в р е м е н и

о к о н ч а н и я в ы ч и с л е н и й

218

Часть III. Visual Basic for Applications

EndTime = Tim er

'Отображение общего времени в секундах

MsgBox Form at(EndTim e - S ta rtT im e , "0 .0 ")

End Sub

Ha компьютере автора выполнение этой процедуры заняло 7,7 секунды (этот пока­ затель определяется вашей системой). Затем были закомментированы операторы Dim, с помощью которых объявляются типы данных. Для этого в начале каждой строки, со­ держащей операторы Dim, были вставлены апострофы. В результате интерпретатор VBA использовал тип данных, заданный по умолчанию, а именно — V a ria n t. После это­ го процедура была выполнена еще раз.

Мораль проста: для скорейшего выполнения VBA-приложений объявляйте переменные!

Рабочая книга, содержащая этот код, находится на прилагаемом к книге компактдиске в файле tim in g te x t.x ls m .

Объявление переменных

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

В следующей процедуре показано, каким образом переменная принимает разные ти­ пы данных.

Sub

V a ria ntD e m o ()

 

MyVar

=

"123"

 

MyVar

=

MyVar / 2

 

MyVar

=

"О твет: " & MyVar

 

MsgBox MyVar

End

Sub

 

 

В процедуре VariantDemo переменная MyVar вначале выступает строкой из трех символов. Затем эта “строка” делится на два и приобретает числовой тип данных. После этого MyVar присоединяется к строке, что вызывает обратное преобразование MyVar в строку. Оператор MsgBox отображает окончательное строковое значение: О твет: 61,5.

Чтобы проиллюстрировать проблемы, которые могут возникнуть при обработке типа данных Variant, рассмотрим следующую процедуру.

Sub V ariantD em o2()

MyVar = "123"

MyVar = MyVar + MyVar

MyVar = "О твет: " & MyVar

MsgBox MyVar

End Sub

При выполнении этой процедуры в окне сообщений появляется сообщение Ответ: 123123. Скорее всего, это не тот результат, которого вы ожидали. В процессе управле­ ния текстовыми данными, представленными типом Variant, оператор “+” выполняет конкатенацию строк.

Определение типа данных

Для определения типа данных переменной используется функция VBA TypeName. Ниже представлена модифицированная версия предыдущей процедуры. Эта процедура на каждом шаге отображает тип данных переменной MyVar. Вы увидите, что сначала

Глава 8. Основы программирования на VBA

219

переменная является строкой, затем преобразуется в числовой тип D ouble и в заверше­ ние снова становится строкой.

Sub VariantDemo2 ()

MyVar = "123"

MsgBox ТурeName(MyVar)

MyVar = MyVar / 2

MsgBox TypeName(MyVar)

MyVar = "О твет: " & MyVar

MsgBox TypeName(MyVar)

MsgBox MyVar

End Sub

Благодаря VBA преобразование типов для необъявленных переменных выполняется автоматически. Этот процесс может показаться удачным выходом из создавшейся ситуа­ ции, однако помните, что при этом снижается скорость обработки данных, быстрее за­ полняется свободная память, а также повышается риск возникновения ошибок.

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

• Программы работают быстрее и используют память более эффективно. Тип данных по умолчанию V a ria n t резервирует больше памяти, чем необходимо, и вызывает многократную проверку данных, занимающую процессорное время. Если программа точно знает тип данных, она не выполняет дополнительную про­ верку данных и резервирует ровно столько памяти, сколько необходимо для хра­ нения конечных данных.

Объявив переменные, можно избежать ошибок, связанных с неправильным введением имен переменных. Предполагается, что вы используете оператор Op­ tio n E x p lic it, делающий обязательным объявление всех переменных (см. сле­ дующий раздел). Предположим, что вы также в коде применяете необъявленную пе­ ременную с названием C u rren tR ate . Наряду с этим на определенном этапе про­

цедуры вы обращаетесь к оператору C urentR ate = 0.75. Такая ошибка в названии переменной, которую тяжело выявить, скорее всего, будет причиной не­ правильных результатов.

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

Чтобы обеспечить обязательное объявление всех используемых переменных, необхо­ димо включить следующую строку в качестве первой инструкции в модуле VBА:

Option E x p lic it

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

0 примерах, приведенных в этой главе

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

Глава 8. Основы программирования на VBA

221

выполнения процедуры переменная становится невостребованной, поэтому Excel осво­ бождает соответствующую область памяти. Если нужно сохранить значение переменной, объявите ее как S t a t i c (см. раздел “Переменные S t a t i c ”).

Наиболее популярный способ объявить локальную переменную — вставить оператор Dim между операторами Sub и End Sub. Операторы Dim обычно вводятся непосредст­ венно после оператора Sub, перед кодом процедуры.

Примечание

Если вас интересует происхождение ключевого слова Dim, то примите к сведению, что это сокращение от “Dimension” — “размерность” . В прежних версиях BASIC этот оператор использовался исключительно для объявления размерности массива. В VBA ключевое слово Dim применяется для объяв­ ления любой переменной, а не только массивов.

В представленной далее процедуре используется шесть локальных переменных, объ­ явленных с помощью операторов Dim.

Sub MySub ()

In te g e r

 

 

Dim x As

 

 

Dim

F ir s t

As Long

 

 

Dim

In te re s tR a te

As

S in g le

Dim TodaysDate

As

Date

Dim UserName As

S trin g

Dim MyValue

 

 

код процедуры] -

1 - [Здесь

указывается

End Sub

 

 

 

 

 

Обратите внимание, что последний оператор Dim в этом примере объявляет не тип данных, а только саму переменную. В результате переменная приобретает тип V a ria n t.

Кроме того, можно объявить несколько переменных, воспользовавшись единствен­ ным оператором Dim.

Dim х As

In te g e r,

у As

In te g e r, z As In te g e r

Dim F ir s t

As Long,

L a s t

As Double

Предупреждение

В отличие от других языков программирования, в VBA нельзя объявить тип данных одновременно для группы переменных, разделив переменные запя­ тыми. Например, следующий оператор является корректным, хотя и не объ­ являет переменные как in te g e r:

Dim i , j , k As In te g e r

В VBA только k объявляется как in te g e r; остальные переменные объявля­ ются как V a ria n t. Для объявления переменных i, j и к в виде in te g e r ис­ пользуйте следующий оператор:

Dim i As In te g e r, j As In te g e r, к As In te g e r

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

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

222

Часть III. Visual Basic for Applications

Еще один способ указания типов данных для переменных

Как и в большинстве других версий BASIC, язык VBA позволяет присоединить сим­ вол к названию переменной, чтобы указать ее тип данных. Например, можно объявить переменную MyVar как целое число, добавив к ее названию символ %.

Dim MyVar%

Символы объявления типов данных представлены для большинства типов данных VBA. Отсутствующие в таблице типы данных не имеют собственного символа объявле­ ния типа.

Тип данных

Символ объявления типа

In te g e r

%

Long

&

S in g le

i

Double

#

Currency

@

S trin g

$

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

Переменные уровня модуля

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

В приведенном ниже примере оператор D im — первая инструкция в модуле. Обе проце­ дуры, P ro c e d u re l и P ro ce d u re 2 , имеют доступ к переменной C u rre n tV a lu e .

Dim

C u rre n tV a lu e as In te g e r

 

Sub

P ro c e d u re l()

 

 

'

- [З д е с ь

в в о д и т с я

к о д п ро ц едуры ]

-

End

Sub

 

 

 

Sub

P ro ce d u re 2 ()

 

 

'

- [З д е с ь

в в о д и т с я

к о д п ро ц едуры ]

-

End

Sub

 

 

 

Обычно значение переменной уровня модуля не изменяется к окончанию выполнения процедуры (по достижении оператора End Sub либо End F u n c tio n ) . Исключение из этого правила бывает в случае применения оператора End. Как только интерпретатор VBA выполняет оператор End, все переменные уровня модуля теряют свои значения.

Переменные P u b lic

Чтобы сделать переменную доступной во всех процедурах всех модулей VBA проек­ та, необходимо объявить переменную на уровне модуля (перед объявлением первой про­ цедуры) с помощью ключевого слова P u b lic , а не Dim.

P u b lic C u rre n tR a te as Long

Ключевое слово P u b lic делает переменную C u rre n tR a te доступной для любой процедуры проекта, даже для процедур, которые располагаются в других модулях проек­ та. Этот оператор следует вставить перед первой процедурой модуля. Более того, подоб­