цКЮБЮ 11.

нЯМНБШ ОПНЦПЮЛЛХПНБЮМХЪ МЮ VBA

рХОШ ДЮММШУ

рХОШ ДЮММШУ НРМНЯЪРЯЪ Й ЯЮЛШЛ ТСМДЮЛЕМРЮКЭМШЛ ОНМЪРХЪЛ КЧАНЦН ЪГШЙЮ ОПНЦПЮЛЛХПНБЮМХЪ. рХО ДЮММШУ НОПЕДЕКЪЕР ЛМНФЕЯРБН ДНОСЯРХЛШУ ГМЮВЕМХИ, ЙНРНПНЕ ЛНФЕР ОПХМХЛЮРЭ СЙЮГЮММЮЪ ОЕПЕЛЕММЮЪ.

б VBA ХЛЕЧРЯЪ ЯКЕДСЧЫХЕ НЯМНБМШЕ РХОШ ДЮММШУ:

рХО ДЮММШУ

пЮГЛЕП (АЮИР)

дХЮОЮГНМ ГМЮВЕМХИ

Byte (АЮИР)

1

нР 0 ДН 255

Boolean (КНЦХВЕЯЙХИ)

2

True ХКХ False

Integer (ЖЕКНЕ ВХЯКН)

2

нР -32 768 ДН 32 767

Long (ДКХММНЕ ЖЕКНЕ ВХЯКН)

4

нР -2 1 47 483 648 ДН 2 1 47 483 647

single (ВХЯКН Я ОКЮБЮЧЫЕИ ГЮОЪРНИ НАШВМНИ РНВМНЯРХ)

4

нР -3.402823е38 ДН

-1 ,401 298е-45 ДКЪ НРПХЖЮРЕКЭМШУ ГМЮВЕМХИ;

НР 1 .401298е-45 ДН 3,402823е38 ДКЪ ОНКНФХРЕКЭМШУ ГМЮВЕМХИ

Double (ВХЯКН Я ОКЮБЮЧЫЕИ ГЮОЪРНИ ДБНИМНИ РНВМНЯРХ)


8

нР -1 ,7976931 3486232е308 ДН

-4,94065645841 247е-324 ДКЪ НРПХЖЮРЕКЭМШУ ГМЮВЕМХИ;

НР 4,94065645841 247е-324 ДН

1, 7976931 3486232е308 ДКЪ ОНКНФХРЕКЭМШУ ГМЮВЕМХИ

Currency (ДЕМЕФМШИ)

8

нР -922 337 203 685 477,5808 ДН 922 337 203 685 477,5807

рХО ДЮММШУ

пЮГЛЕП (АЮИР)

дХЮОЮГНМ ГМЮВЕМХИ

Decimal (ЛЮЯЬРЮАХПСЕЛНЕ ЖЕКНЕ ВХЯКН)

14

+/-792281 6251 4264337593543950335 Я 28 ГМЮЙЮЛХ ЯОПЮБЮ НР ГЮОЪРНИ; ЛХМХЛЮКЭМНЕ МЕМСКЕБНЕ ГМЮВЕМХЕ ХЛЕЕР БХД

+/-0,0000000000000000000000000001

Date (ДЮРШ Х БПЕЛЪ)

8

нР 1 ЪМБЮПЪ 100 Ц. ДН 31 ДЕЙЮАПЪ 9999 Ц.

Ob j ect (НАЗЕЙР)

4

кЧАНИ СЙЮГЮРЕКЭ НАЗЕЙРЮ

string (ЯРПНЙЮ ОЕПЕЛЕММНИ ДКХМШ)

10 + ДКХМЮ ЯРПНЙХ

нР 0 ДН ОПХАКХГХРЕКЭМН 2 ЛХККХЮПДНБ

string (ЯРПНЙЮ ОНЯРНЪММНИ ДКХМШ)

дКХМЮ ЯРПНЙХ

нР 1 ДН ОПХАКХГХРЕКЭМН 65 400

Variant (ВХЯКНБШЕ ОНДРХОШ)

16

кЧАНЕ ВХЯКНБНЕ ГМЮВЕМХЕ БОКНРЭ ДН ЦПЮМХЖ ДХЮОЮГНМЮ ДКЪ РХОЮ Double

Variant (ЯРПНЙНБШЕ ОНДРХОШ)

22 + ДКХМЮ ЯРПНЙХ

йЮЙ ДКЪ ЯРПНЙХ (string) ОЕПЕЛЕММНИ ДКХМШ

рХО ДЮММШУ, НОПЕДЕКЪЕЛШИ ОНКЭГНБЮРЕКЕЛ (Я ОНЛНЫЭЧ ЙКЧВЕБНЦН ЯКНБЮ рСПЕ)

нАЗЕЛ НОПЕДЕКЪЕРЯЪ ЩКЕЛЕМРЮЛХ

дХЮОЮГНМ ЙЮФДНЦН ЩКЕЛЕМРЮ НОПЕДЕКЪЕРЯЪ ЕЦН РХОНЛ ДЮММШУ


нОХЯЮМХЕ ОЕПЕЛЕММШУ

нОХЯЮМХЕ РХОЮ ЙЮФДНИ ОЕПЕЛЕММНИ ДЕКЮЕР ОПНЦПЮЛЛС МЮДЕФМЕЕ Х, ЙПНЛЕ РНЦН, САШЯРПЪЕР ЕЕ ПЮАНРС, Р. Й. VBA МЕ РПЕАСЕРЯЪ РПЮРХРЭ БПЕЛЪ МЮ ПЮЯОНГМЮБЮМХЕ РХОЮ МЕНОХЯЮММНИ ОЕПЕЛЕММНИ ОПХ ЙЮФДНЛ НАПЮЫЕМХХ Й МЕИ.

яХМРЮЙЯХЯ:

Dim [WithEvents] хЛЪоЕПЕЛЕММНИ[([хМДЕЙЯШ])] [As [New] рХО]

[,[WithEvents] хЛЪоЕПЕЛЕММНИ[([хМДЕЙЯШ])] [As [New] рХО]] . . .

юПЦСЛЕМРШ:

WithEvents

йКЧВЕБНЕ ЯКНБН, СЙЮГШБЮЧЫЕЕ, ВРН ЮПЦСЛЕМР ХЛЪОЕПЕЛЕМ-МНИ ЪБКЪЕРЯЪ ХЛЕМЕЛ НАЗЕЙРМНИ ОЕПЕЛЕММНИ, ЙНРНПЮЪ ХЯОНКЭГСЕРЯЪ ОПХ НРЙКХЙЕ МЮ ЯНАШРХЪ, ЦЕМЕПХПСЕЛШЕ НАЗЕЙРНЛ ActiveX (Р. Е. НАЗЕЙРНЛ, ЙНРНПШИ ЛНФЕР АШРЭ НРЙПШР ДКЪ ДПСЦХУ ОПХКНФЕМХИ Х ЯПЕДЯРБ ОПНЦПЮЛЛХПНБЮМХЪ)

хЛЪоЕПЕЛЕММНИ

хЛЪ ОЕПЕЛЕММНИ, СДНБКЕРБНПЪЧЫЕЕ ЯРЮМДЮПРМШЛ ОПЮБХКЮЛ ХЛЕМНБЮМХЪ ОЕПЕЛЕММШУ

хМДЕЙЯШ

пЮГЛЕПМНЯРХ ОЕПЕЛЕММНИ ЛЮЯЯХБЮ; ДНОСЯЙЮЕРЯЪ НОХЯЮМХЕ ДН 60 ПЮГЛЕПМНЯРЕИ. дКЪ ГЮДЮМХЪ ЮПЦСЛЕМРЮ ХМДЕЙЯШ ХЯОНКЭГСЕРЯЪ ЯКЕДСЧЫХИ ЯХМРЮЙЯХЯ:

[мХФМХИ рН] бЕПУМХИ [, [мХФМХИ рН] бЕПУМХИ] ...

еЯКХ МХФМХИ ХМДЕЙЯ МЕ ГЮДЮМ ЪБМН, МХФМЪЪ ЦПЮМХЖЮ ЛЮЯЯХБЮ НОПЕДЕКЪЕРЯЪ ХМЯРПСЙЖХЕИ option Base. еЯКХ НРЯСРЯРБСЕР ХМЯРПСЙЖХЪ option Base, МХФМЪЪ ЦПЮМХЖЮ ЛЮЯЯХБЮ ПЮБМЪЕРЯЪ МСКЧ

New

йКЧВЕБНЕ ЯКНБН, БЙКЧВЮЧЫЕЕ БНГЛНФМНЯРЭ МЕЪБМНЦН ЯНГДЮМХЪ НАЗЕЙРЮ. еЯКХ СЙЮГЮМН ЙКЧВЕБНЕ ЯКНБН New ОПХ НОХЯЮМХХ НАЗЕЙРМНИ ОЕПЕЛЕММНИ, МНБШИ ЩЙГЕЛОКЪП НАЗЕЙРЮ ЯНГДЮЕРЯЪ ОПХ ОЕПБНИ ЯЯШКЙЕ МЮ МЕЦН, ОНЩРНЛС МЕР МЕНАУНДХЛНЯРХ ОПХЯБЮХБЮРЭ ЯЯШКЙС МЮ НАЗЕЙР Я ОНЛНЫЭЧ ХМЯРПСЙЖХХ Set

рХО

рХО ДЮММШУ ОЕПЕЛЕММНИ. дКЪ ЙЮФДНИ НОХЯШБЮЕЛНИ ОЕПЕЛЕММНИ ЯКЕДСЕР ХЯОНКЭГНБЮРЭ НРДЕКЭМНЕ ОПЕДКНФЕМХЕ As рХО

оЕПЕЛЕММШЕ, НОХЯЮММШЕ Я ОНЛНЫЭЧ ЙКЧВЕБНЦН ЯКНБЮ Dim МЮ СПНБМЕ ЛНДСКЪ, ДНЯРСОМШ ДКЪ БЯЕУ ОПНЖЕДСП Б ДЮММНЛ ЛНДСКЕ. оЕПЕЛЕММШЕ, НОХЯЮММШЕ МЮ СПНБМЕ ОПНЖЕДСПШ, ДНЯРСОМШ РНКЭЙН Б ДЮММНИ ОПНЖЕДСПЕ.

хМЯРПСЙЖХЪ Dim ОПЕДМЮГМЮВЕМЮ ДКЪ НОХЯЮМХЪ РХОЮ ДЮММШУ ОЕПЕЛЕММНИ МЮ СПНБМЕ ЛНДСКЪ ХКХ ОПНЖЕДСПШ. мЮОПХЛЕП, ЯКЕДСЧЫЮЪ ХМЯРПСЙЖХЪ НОХЯШБЮЕР ОЕПЕЛЕММСЧ Я РХОНЛ integer.

Dim N As Integer

хМЯРПСЙЖХЪ Dim ОПЕДМЮГМЮВЕМЮ РЮЙФЕ ДКЪ НОХЯЮМХЪ НАЗЕЙРМНЦН РХОЮ ОЕПЕЛЕММШУ. дЮКЕЕ ОПХБНДХРЯЪ НОХЯЮМХЕ ОЕПЕЛЕММНИ ДКЪ МНБНЦН ЩЙГЕЛОКЪПЮ ПЮАНВЕЦН КХЯРЮ.

Dim X As New Worksheet

еЯКХ ОПХ НОХЯЮМХХ НАЗЕЙРМНИ ОЕПЕЛЕММНИ МЕ ХЯОНКЭГСЕРЯЪ ЙКЧВЕБНЕ ЯКНБН New, РН ДКЪ ХЯОНКЭГНБЮМХЪ НАЗЕЙРЮ, МЮ ЙНРНПШИ ЯЯШКЮЕРЯЪ ОЕПЕЛЕММЮЪ, ЯСЫЕЯРБСЧЫХИ НАЗЕЙР ДНКФЕМ АШРЭ ОПХЯБНЕМ ОЕПЕЛЕММНИ Я ОНЛНЫЭЧ ХМЯРПСЙЖХХ Set.

еЯКХ РХО ДЮММШУ ХКХ РХО НАЗЕЙРЮ МЕ ГЮДЮМ, Х Б ЛНДСКЕ НРЯСРЯРБСЕР ХМЯРПСЙЖХЪ DefTnn, ОН СЛНКВЮМХЧ ОЕПЕЛЕММЮЪ ОНКСВЮЕР РХО variant. дКЪ НАЪГЮРЕКЭМНЦН НОХЯЮМХЪ БЯЕУ ОЕПЕЛЕММШУ МЮДН ОНЛЕЯРХРЭ Б МЮВЮКЕ ЛНДСКЪ ХМЯРПСЙЖХЧ option Explicit. хЯОНКЭГНБЮМХЕ ЩРНИ ХМЯРПСЙЖХХ ОНКЕГМН ОПХ НРКЮДЙЕ ОПНЦПЮЛЛ, Р. Й. НМЮ ОНГБНКЪЕР КЕЦВЕ НРЯКЕФХБЮРЭ БНГЛНФМСЧ ОСРЮМХЖС Б ХЛЕМЮУ ОПХ МЮАНПЕ ОПНЦПЮЛЛШ.

дНОСЯРХЛШЕ ХЛЕМЮ

б VBA ОНКЭГНБЮРЕКЭ НОПЕДЕКЪЕР ХЛЕМЮ ОЕПЕЛЕММШУ, ТСМЙЖХИ, ОПНЖЕДСП, РХОНБ, ОНЯРНЪММШУ Х ДПСЦХУ НАЗЕЙРНБ. бБНДХЛШЕ ОНКЭГНБЮРЕКЕЛ ХЛЕМЮ ДНКФМШ НРПЮФЮРЭ ЯСРЭ НАНГМЮВЮЕЛНЦН НАЗЕЙРЮ РЮЙ, ВРНАШ ДЕКЮРЭ ОПНЦПЮЛЛС КЕЦЙН ВХРЮЕЛНИ. б VBA ХЛЕЧРЯЪ ЯКЕДСЧЫХЕ НЦПЮМХВЕМХЪ МЮ ХЛЕМЮ:

  1. дКХМЮ ХЛЕМХ МЕ ДНКФМЮ ОПЕБШЬЮРЭ 255 ЯХЛБНКНБ.
  2. хЛЪ МЕ ЛНФЕР ЯНДЕПФЮРЭ РНВЕЙ, ОПНАЕКНБ Х ЯКЕДСЧЫХУ ЯХЛБНКНБ: %, .&,
    !, #, @, $.
  3. хЛЪ ЛНФЕР ЯНДЕПФЮРЭ КЧАСЧ ЙНЛАХМЮЖХЧ АСЙБ, ЖХТП Х ЯХЛБНКНБ, МЮВХМЮЧЫСЧЯЪ Я АСЙБШ.
  4. хЛЕМЮ ДНКФМШ АШРЭ СМХЙЮКЭМШ БМСРПХ НАКЮЯРХ, Б ЙНРНПНИ НМХ НОПЕДЕКЕМШ.
  5. мЕ ЯКЕДСЕР ХЯОНКЭГНБЮРЭ ХЛЕМЮ, ЯНБОЮДЮЧЫХЕ Я ЙКЧВЕБШЛХ ЯКНБЮЛХ VBA Х ХЛЕМЮЛХ БЯРПНЕММШУ ТСМЙЖХИ Х ОПНЖЕДСП.

уНРЪ ПЕЦХЯРП АСЙБ (БЕПУМХИ ХКХ МХФМХИ) Б ХЛЕМХ МЕ ХЛЕЕР ГМЮВЕМХЪ, СЛЕКНЕ ХЯОНКЭГНБЮМХЕ ЕЦН ЛНФЕР ЯСЫЕЯРБЕММН НАКЕЦВХРЭ ОНМХЛЮМХЕ ЯНДЕПФЮРЕКЭМНИ ЯРНПНМШ ОЕПЕЛЕММНИ. мЮОПХЛЕП, БЛЕЯРН ОКНЯЙХУ Х МЕБШПЮГХРЕКЭМШУ ХЛЕМ

ОПНЖЕМРМЮЪ

ЯРЮБЙЮ У_МЮВГМЮВ

ОПЕДОНВРХРЕКЭМЕЕ ХЯОНКЭГНБЮРЭ ЯКЕДСЧЫХЕ ХЛЕМЮ, ЙНРНПШЕ КЕЦВЕ БНЯОПХМХЛЮЧРЯЪ, АКЮЦНДЮПЪ БШДЕКЕМХЧ МЕЙНРНПШУ ЯХЛБНКНБ, БУНДЪЫХУ Б МХУ, ПЮГСЛМШЛ ХЯОНКЭГНБЮМХЕЛ БЕПУМЕЦН ПЕЦХЯРПЮ

оПНЖЕМРМЮЪяРЮБЙЮ

У_мЮВгМЮВ

хМЯРПСЙЖХЪ DefрХО

хМЯРПСЙЖХЪ DefTХn (БЛЕЯРН РХО Б ХЛЕМХ ХМЯРПСЙЖХХ ТХЦСПХПСЧР АСЙБШ, НАНГМЮВЮЧЫХЕ ЙНМЙПЕРМШИ РХО ДЮММШУ) ХЯОНКЭГСЕРЯЪ МЮ СПНБМЕ ЛНДСКЪ ДКЪ ГЮДЮМХЪ РХОЮ ДЮММШУ ОН СЛНКВЮМХЧ ДКЪ ОЕПЕЛЕММШУ, ЮПЦСЛЕМРНБ, ОЕПЕДЮБЮЕЛШУ Б ОПНЖЕДСПШ, Х ГМЮВЕМХИ, БНГБПЮЫЮЕЛШУ ОПНЖЕДСПЮЛХ Function Х Property Get, ХЛЕМЮ ЙНРНПШУ МЮВХМЮЧРЯЪ Я ЯННРБЕРЯРБСЧЫХУ ЯХЛБНКНБ.

яХМРЮЙЯХЯ:

DefBool дХЮОЮГНМаСЙБ [ , дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Boolean

DefByte дХЮОЮГНМаСЙБ!, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Byte

Deflnt дХЮОЮГНМаСЙБ [ , дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Integer

DefLng дХЮОЮГНМаСЙБ!, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Long

DefCur дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Currency

DefSng дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Single

DefDbl дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Double

DefDate дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Date

DefStr дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ String

DefObj дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ нbject

DefVar дХЮОЮГНМаСЙБ [, дХЮОЮГНМаСЙБ] ...

рХО ДЮММШУ Variant

юПЦСЛЕМР дХЮОЮГНМаСЙБ ХЛЕЕР ЯКЕДСЧЫХИ ЯХМРЮЙЯХЯ:

аСЙБЮ1[-аСЙБЮ2]

юПЦСЛЕМРШ аСЙБЮ1 Х аСЙБЮ2 СЙЮГШБЮЧР ЦПЮМХЖШ ДХЮОЮГНМЮ ХЛЕМ, ДКЪ ЙНРНПШУ ГЮДЮЕРЯЪ РХО ДЮММШУ ОН СЛНКВЮМХЧ.

б ЯКЕДСЧЫЕЛ ОПХЛЕПЕ ХМЯРПСЙЖХЪ СЯРЮМЮБКХБЮЕР, ВРН БЯЕ ОЕПЕЛЕММШЕ Я ХЛЕМЮЛХ, МЮВХМЮЧЫХЛХЯЪ Я АСЙБ ХГ ДХЮОЮГНМЮ НР ю ДН Q, ХЛЕЧР ЯРПНЙНБШИ РХО:

DefStr A-Q

хМЯРПСЙЖХЪ Def рХО ДЕИЯРБСЕР РНКЭЙН МЮ ЛНДСКЭ, Б ЙНРНПНЛ НМЮ ХЯОНКЭГСЕРЯЪ.

оПХ СЙЮГЮМХХ ДХЮОЮГНМЮ АСЙБ НАШВМН НОПЕДЕКЪЕРЯЪ РХО ДЮММШУ ОН СЛНКВЮМХЧ ДКЪ ОЕПЕЛЕММШУ, ЙНРНПШЕ МЮВХМЮЧРЯЪ Я ОЕПБШУ 128 ЯХЛБНКНБ МЮАНПЮ. нДМЮЙН ОПХ СЙЮГЮМХХ ДХЮОЮГНМЮ A≈Z ГЮДЮЕРЯЪ РХО ДЮММШУ ОН СЛНКВЮМХЧ ДКЪ БЯЕУ ОЕПЕЛЕММШУ, БЙКЧВЮЪ РЕ, ВРН МЮВХМЮЧРЯЪ Я ЛЕФДСМЮПНДМШУ ЯХЛБНКНБ ХГ ПЮЯЬХПЕММНИ ВЮЯРХ МЮАНПЮ (128-255).

еЫЕ НДМХЛ ЯОНЯНАНЛ ГЮДЮМХЪ РХОЮ ОЕПЕЛЕММНИ ОН СЛНКВЮМХЧ ЪБКЪЕРЯЪ БЙКЧВЕМХЕ Б ЙНМЕЖ ХЛЕМХ ЯОЕЖХЮКЭМНЦН ЯХЛБНКЮ, СЯРЮМЮБКХБЮЧЫЕЦН РХО ОЕПЕЛЕММНИ. дНОСЯРХЛН ХЯОНКЭГНБЮМХЕ ЯКЕДСЧЫХУ ЯОЕЖХЮКЭМШУ ЯХЛБНКНБ ДКЪ СЯРЮМНБЙХ РХОНБ.

*

Integer

&

Long

|

Single

#

Double

@

Currency

$

String

 

лЮЯЯХБШ

йЮЙ Х Б ДПСЦХУ ЪГШЙЮУ ОПНЦПЮЛЛХПНБЮМХЪ, Б VBA БШ ЛНФЕРЕ ХЯОНКЭГНБЮРЭ ЛЮЯЯХБШ. оПХЛЕПШ НАЗЪБКЕМХЪ ЛЮЯЯХБНБ ОПХБЕДЕМШ МХФЕ.

Dim B(3, 3) As Single

Dim A(12) As Integer

оЕПБЮЪ ЯРПНЙЮ НАЗЪБКЪЕР ДБСЛЕПМШИ ЛЮЯЯХБ 3x3 (ЛЮРПХЖС), ЯНЯРНЪЫХИ ХГ ДЕИЯРБХРЕКЭМШУ ВХЯЕК. бРНПЮЪ ЯРПНЙЮ НАЗЪБКЪЕР НДМНЛЕПМШИ ЛЮЯЯХБ (БЕЙРНП) ХГ 12 ЖЕКШУ ВХЯЕК, ОПХВЕЛ ОН СЛНКВЮМХЧ ОЕПБШИ ЩКЕЛЕМР ЛЮЯЯХБЮ АСДЕР ю(0), Ю ОНЯКЕДМХИ ю(11). б ЩРНЛ ЯКСВЮЕ ЦНБНПЪР, ВРН Н ≈ АЮГНБШИ ХМДЕЙЕ. лНФМН ХГЛЕМХРЭ АЮГНБШИ ХМДЕЙЯ, МЮОХЯЮБ Б МЮВЮКЕ КХЯРЮ ЛНДСКЪ ХМЯРПСЙЖХЧ Option Base1. оНЯКЕ ЩРНЦН ХМДЕЙЯШ ЛЮЯЯХБНБ ю Х б АСДСР МЮВХМЮРЭЯЪ Я ЕДХМХЖШ. дПСЦХЛ ЯОНЯНАНЛ ХГЛЕМЕМХЪ АЮГНБНЦН ХМДЕЙЯЮ ЪБКЪЕРЯЪ ХЯОНКЭГНБЮМХЕ ЙКЧВЕБНЦН ЯКНБЮ РН ОПХ НАЗЪБКЕМХХ ЛЮЯЯХБЮ:

Dim B(l рН 3, 1 рН 3) As Single

Dim A(l To 12) As Integer

лЮЯЯХБ Б ОПНЦПЮЛЛЕ НОПЕДЕКЪЕРЯЪ ОНЩКЕЛЕМРМН. мЮОПХЛЕП,

Dim B(l To 2, 1 рН 2) As Single

B(l,l)=2

б(1,2)=4

б(2,1)=1

б(1,2)=6

сДНАМШЛ ЯОНЯНАНЛ НОПЕДЕКЕМХЪ НДМНЛЕПМШУ ЛЮЯЯХБНБ ЪБКЪЕРЯЪ ТСМЙЖХЪ Array, ОПЕНАПЮГСЧЫЮЪ ЯОХЯНЙ ЩКЕЛЕМРНБ, ПЮГДЕКЕММШУ ГЮОЪРШЛХ, Б БЕЙРНП ХГ ЩРХУ ГМЮВЕМХИ, Х ОПХЯБЮХБЮЧЫЮЪ ХУ ОЕПЕЛЕММНИ РХОЮ variant. мЮОПХЛЕП,

Dim A As Variant

ю = юЦЦЮС(10,20,30)

б = ю(2)

дХМЮЛХВЕЯЙХЕ ЛЮЯЯХБШ

хМНЦДЮ Б ОПНЖЕЯЯЕ БШОНКМЕМХЪ ОПНЦПЮЛЛШ РПЕАСЕРЯЪ ХГЛЕМЪРЭ ПЮГЛЕП ЛЮЯЯХБЮ. б ЩРНЛ ЯКСВЮЕ ОЕПБНМЮВЮКЭМН ЛЮЯЯХБ НАЗЪБКЪЧР ЙЮЙ ДХМЮЛХВЕЯЙХИ. дКЪ ЩРНЦН ОПХ НАЗЪБКЕМХХ ЛЮЯЯХБЮ МЕ МЮДН СЙЮГШБЮРЭ ПЮГЛЕПМНЯРЭ, МЮОПХЛЕП:

Dim R() As Single

б ОПНЦПЮЛЛЕ ЯКЕДСЕР БШВХЯКХРЭ МЕНАУНДХЛШИ ПЮГЛЕП ЛЮЯЯХБЮ Х ЯБЪГЮРЭ ЕЦН Я МЕЙНРНПНИ ОЕПЕЛЕММНИ, МЮОПХЛЕП n, ГЮРЕЛ ХГЛЕМХРЭ ПЮГЛЕП ДХМЮЛХВЕЯЙНЦН ЛЮЯЯХБЮ Я ОНЛНЫЭЧ НОЕПЮРНПЮ ReDim.

яХМРЮЙЯХЯ:

ReDim [Preserve] хЛЪоЕПЕЛЕММНИ(хМДЕЙЯШ) [As рХО] [, хЛЪоЕПЕЛЕММНИ(хМДЕЙЯШ) [As рХО]] ...

юПЦСЛЕМРШ:

| Preserve

йКЧВЕБНЕ ЯКНБН, ХЯОНКЭГСЕЛНЕ ДКЪ ЯНУПЮМЕМХЪ ДЮММШУ Б ЯСЫЕЯРБСЧЫЕЛ ЛЮЯЯХБЕ ОПХ ХГЛЕМЕМХХ ГМЮВЕМХЪ ОНЯКЕДМЕИ ПЮГЛЕПМНЯРХ

хЛЪоЕПЕЛЕММНИ

хЛЪ ОЕПЕЛЕММНИ, СДНБКЕРБНПЪЧЫЕЕ ЯРЮМДЮПРМШЛ ОПЮБХКЮЛ ХЛЕМНБЮМХЪ ОЕПЕЛЕММШУ

хМДЕЙЯШ

пЮГЛЕПМНЯРХ ОЕПЕЛЕММНИ ЛЮЯЯХБЮ; ДНОСЯЙЮЕРЯЪ НОХЯЮМХЕ ДН 60 ПЮГЛЕПМНЯРЕИ. юПЦСЛЕМР ХМДЕЙЯШ ХЯОНКЭГСЕР ЯКЕДСЧЫХИ ЯХМРЮЙЯХЯ:

[мХФМХИ рН] бЕПУМХИ [, [мХФМХИ рН] бЕПУМХИ] . . .

еЯКХ МХФМХИ ХМДЕЙЯ МЕ ГЮДЮМ ЪБМН, МХФМЪЪ ЦПЮМХЖЮ ЛЮЯЯХБЮ НОПЕДЕКЪЕРЯЪ ХМЯРПСЙЖХЕИ Option Base. еЯКХ НРЯСРЯРБСЕР ХМЯРПСЙЖХЪ option Base, МХФМЪЪ ЦПЮМХЖЮ ЛЮЯЯХБЮ ПЮБМЪЕРЯЪ МСКЧ

Тип

Тип данных массива

Например, установим границы массивы R:

ReDim R(l To 10)

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

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

При работе с массивами бывает полезно применять следующие функции и процедуры.

Array (СписокАргументов)

Создает массив типа variant. Аргумент спи-сокАргументов представляет разделенный запятыми список значений, присваиваемых элементам массива. Пример:

Dim День As Variant День = Array ("Пн", "Вт", "Ср", "Чт", "Пт")

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

Возвращает True, если переменная содержит массив; в противном случае возвращается False. Функцию IsArray используют дляпроверки значений переменных типа variant, содержащих массивы

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

и

Ubound (ИмяМассива

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

  • ИмяМассива ≈ имя переменной массива

[, Размерность])

  • Размерность ≈ целое число, указывающее размерность, нижнюю или верхнюю границу которой возвращает функция. Для первой размерности следует указать 1, для второй 2 и т. д. Если аргумент Размерность опущен, подразумевается значение 1


Erase СписокМассивов

Повторно инициализирует элементы массивов фиксированной длины и освобождает память, отведенную для динамического массива, списокМассивов представляет имена одной или нескольких очищаемых переменных массивов, разделенных запятой. Инструкция Erase устанавливает элементы массивов фиксированной длины следующим образом: массив чисел или строк фиксированной длины (присваивает каждому элементу значение 0), массив строк переменной длины (присваивает каждому элементу значение пустой строки), массив типа variant (присваивает каждому элементу значение Empty). Erase освобождает память, используемую динамическими массивами. Перед тем как из программы вновь появится возможность сослаться на динамический массив, необходимо переопределить размерности переменной массива с помощью инструкции ReDim.

 

Константы

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

Синтаксис:

[Public | Private] Const ИмяКонстанты [As Тип] = Выражение

Аргументы:

Public

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

Private

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

ИмяКонстанты

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

Тип


Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double. Decimal (в
настоящее время не поддерживается), Date, string или variant. Для каждой описываемой константы следует использовать отдельное предложение AS тип

Выражение

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

Пример:

Const ПроцентнаяСтавка As Single = 0.2

Const Фирма = "OOO Бескрайние просторы"

Тип данных, определенный пользователем

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

Синтаксис:

[Private | Public] Type ИмяПеременной ИмяЭлемента [([Индексы])] Аs тип [ИмяЭлемента [([Индексы])] As тип]

End Type

Аргументы:

Public

Используется телем типов, всех модулях для описания определяемых пользова-которые доступны для всех процедур во всех проектов

 

Private

Используется для описания определяемых пользователем типов, которые доступны только в модуле, в котором выполняется описание

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

Имя типа, определяемого пользователем

ИмяЭлемента

Имя элемента, определяемого пользователем типа

Индексы

Размерности элемента, являющегося массивом. Для, задания массива, размеры которого могут изменяться, указываются только скобки. Аргумент Индексы использует следующий синтаксис:

[Нижний То] Верхний [, [Нижний То] Верхний] . .

Тип

Тип данных элемента; поддерживаются типы: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (для строк переменной длины), String* длина (для строк фиксированной длинны), Object, variant и другой, определяемый пользователем тип или объектный тип

В данном примере инструкция туре используется для определения типа данных (только на уровне модуля). При появлении в модуле класса инструкции туре должно предшествовать ключевое слово Private. '

' Тип, определенный пользователем

Туре Студент '

' Элементы типа данных

'

Фамилия As String * 20 Имя As String * 20

Отчество As String * 20 НомерЗачетки As Integer

Группа As String * 10 Курс As Long

ДатаРождения As Date

End Type

Sub ВводДанных()

' Описание переменной Экономист

'

Dim Экономист As Студент

' Присвоение значений элементам переменной Экономист

With Экономист

.НомерЗачетки = 12003

.Группа = "Менеджмент"

End With

End Sub

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

Dim СтудентЭкономист(1 to 20) As Студент

' Присваивает значения элементам первой компоненты массива

CтудентЭкономист(1). Фамилия = "Промокашкин"

CтудентЭкономист(1).

Имя = "Евстегней" СтудентЭкономист(1).

Отчество = "Поликарпович"

Операции VBA

В программах на VBA можно использовать стандартный набор операций над данными. Имеются три основных типа операций:

Приведем операции VBA указанных и дополнительных категорий. Математические операции.

Операнд!] + [Операнд2]

Сложение

[ Операнд!] -- [Операнд2]

Вычитание

- [Операнд]

Перемена знака

Операнд!] * [Операнд2]

Умножение

[Операнд!] / [Операнд2]

Деление

[Операнд1] \ [Операнд2]

Целочисленное деление

[Операнд1] Mod [Операнд2]

Остаток от деления по модулю

[Операнд1] ^ [Операнд2]

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

Операции отношения.

[Операнд1] < [Операнд2]

Меньше

[Операнд1] > [Операнд2]

Больше

[Операнд1] <= [Операнд2]

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

[Операнд1] >= [Операнд2]

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

[Операнд1] <> [Операнд2]

Не равно

[Операнд1] = [Операнд2]

Равно

[Операнд1] Is [Операнд2]

Сравнение двух операндов, содержащих ссылки на объекты

[Операнд1] Like [Операнд2]

Сравнение двух строковых выражений

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

[Операнд1] And [Операнд2]

Логическое умножение

[Операнд1] Or [Операнд2]

Логическое сложение

[Операнд1] Хог [Операнд2]

Исключающее or (или)

[Операнд1] Not [Операнд2]

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

[Операнд1] Imp [Операнд2]

Логическая импликация (в настоящее время почти не используется)

[Операнд1] Equ [Операнд2]

Логическая эквивалентность (в настоящее время почти не используется)

Другие операции.

[Строка1] & [Строка2]

Сложение строк. Для сложения строк допустимо использование операции [Строка1] + [Строка2] , но предпочтительнее, во избежания путаницы, применять операцию со знаком &

 

Приоритеты операций

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

Приоритет

Операция

1

Вызов функции и скобки

2

^

3

- (смена знака)

4

*, /

5

\

6

Mod

7

+, -

8

>, <, >=, <=, о, =

9

Not

10

And

11

Or

12

Xor

13

Equ

14

Imp

 

Встроенные функции VBA

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

Ниже рассмотрены основные функции из этих категорий.

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

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

Функция

Возвращаемое значение

Abs (число)

Atn (число)

Cos (число)

Модуль (абсолютная величина)числа

Арктангенс

Косинус

Ехр (число)

Экспонента, т. е. результат возведения основания натурального логарифма в указанную степень

Log (число)

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

Rnd (число)

Случайное число из интервала [0,1).

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

Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента

Sgn (число)

Знак числа

Sin (число)

Синус

Sqr (число)

Квадратный корень из числа

Tan (число)

Тангенс

Fix (число) И Int (число)

Обе функции, int и Fix, отбрасывают дробную часть числа и возвращают целое значение.

Различие между функциями int и Fix состоит в том, что для отрицательного значения аргумента число функция int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, a Fix ≈ ближайшее отрицательное целое число, большее либо равное указанному

 

Функции проверки типов

Функции проверки типов проверяют, является ли переменная выражением специфицированного типа.

Функция

Проверка

IsArray (переменная)

IsDate (переменная)

IsEmpty (переменная)

IsError (переменная)

IsNull (переменная)

IsNumeric (переменная)

IsObject (переменная)

Является ли переменная массивом

Является ли переменная датой

Была ли переменная описана инструкцией Dim

Является ли переменная кодом ошибки

Является ли переменная пустым значением (Null)

Является ли переменная числовым значением

Является ли переменная объектом

 

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

Преобразование строки в число и обратно осуществляют следующими функциями.

Val (строка)

Возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа

Str (число)

Возвращает значение типа variant (String), являющееся строковым представлением числа

В качестве допустимого десятичного разделителя функция str воспринимает только точку. При наличии другого десятичного разделителя (например, запятой) для преобразования чисел в строки следует использовать функцию cstr, описанную ниже.

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

Format

Возвращает значение типа variant (string), содержащее выражение, отформатированное согласно инструкциям, заданным в описании формата.

Синтаксис:

Format (Выражение [, Формат [, ПервыйДеньНедели [ , ПерваяНеделяГода] ] ])

  • Выражение ≈ любое допустимое выражение
  • Формат ≈ любое допустимое именованное или определяемое пользователем выражение формата. Примером именованного формата является Fixed ≈ формат действительного числа с двумя значащими цифрами после десятичной точки
  • ПервыйДеньНедели ≈ постоянная, определяющая первый день недели
  • ПерваяНеделяГода ≈ постоянная, определяющая первую неделю года

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

0

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

#

Резервирует позицию цифрового разряда. Отображает цифру или ничего не отображает. Если у числа, представленного аргументом, есть какая-нибудь цифра в той позиции разряда, где в строке формата находится #, функция отображает эту цифру аргумента, если нет ≈ в исходной позиции не отображается ничего. Действие данного символа аналогично действию о, за исключением того, что лидирующие нули не отображаются

.

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

%

Резервирует процентное отображение числа

,

Разделитель разряда сотен от тысяч


Разделитель часов, минут и секунд в категории форматов Время (Time)

/

Разделитель дня, месяца и года в категории форматов Дата (Date)

E+, E-, e+, e-

Разделитель мантиссы и порядка в экспоненциальном формате

Кроме функций vai и str в VBA имеются следующие функции преобразования типов выражений из данного в указанный.

Функция

Тип, в который преобразуется выражение

CBool (Выражение)

Boolean

CByte (Выражение)

Byte

CCur (Выражение)

Currency

CDate (Выражение)

Date

СDbl (Выражение)

Double

CDec (Выражение)

Decimel

CInt (Выражение)

Integer

CLng (Выражение)

Long

CSng (Выражение)

Single

CVar (Выражение)

Variant

CStr (Выражение)

String

 

Функции обработки строк

В VBA имеются следующие функции обработки строковых выражений.

Функция

Возвращаемое выражение

ASC

Возвращает ASCII-код начальной буквы строки.

Синтаксис:

Asc (Строка)

Chr

Преобразует ASCII-код в строку.

Синтаксис:

Chr (Код)

Например

Chr ( 13 ) ≈ переход на новую строку,

Chr ( 97 ) = "а"

Lease

Преобразует строку к нижнему регистру.

Синтаксис:

Lease (Строка)

Ucase

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

Синтаксис:

Ucase (Строка)

Left

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

Синтаксис:

Left (string, length)

Аргументы:

  • length ≈ число символов
  • string ≈ исходная строка

Right

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

Синтаксис:

Right (string, length)

Аргументы:

  • length ≈ число символов
  • string ≈ исходная строка

Mid

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

Синтаксис:

Midlstring, start [, length])

Аргументы:

  • string ≈ строковое выражение, из которого извлекается подстрока
  • start ≈ позиция символа в строке string, с которого начинается нужная подстрока
  • length ≈ число возвращаемых символов подстроки.

Len

Возвращает число символов строки.

Синтаксис:

Len (Строка)

Функция

Возвращаемое выражение

LTrim

Возвращает копию строки без пробелов в начале.

Синтаксис:

LTrim (Строка)

Rtrim

Возвращает копию строки без пробелов в конце.

Синтаксис:

RTrim (Строка)

Trim

Возвращает копию строки без пробелов в начале и в конце

Синтаксис:

Trim (Строка)

Space

Возвращает строку, состоящую из указанного числа пробелов.

Синтаксис:

Space (Число)

String

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

Синтаксис:

String (number, character)

Аргументы:

  • number ≈ число повторений символа О character ≈ повторяемый символ

StrComp

Возвращает результат сравнения двух строк.

Синтаксис:

StrComp(stringl, string2 [, compare])

Аргументы:

  • string1 и string2 ≈ два любых строковых выражения
  • compare ≈ указывает способ сравнения строк. Допустимые значения: 0 (двоичное сравнение), 1 (посимвольное сравнение без учета регистра)

Возвращаемые значения:

  • stringl меньше, чем string2, то -1
  • stringl равняется string2, то 0
  • stringl больше, чем string2, то 1

InStr

Возвращает позицию первого вхождения одной строки внутри другой строки.

Синтаксис:

InStr ( [start, ] stringl, st'ring2 [ , compare])

Аргументы:

  • start ≈ числовое выражение, задающее позицию, с которой начинается каждый поиск. Если этот аргумент опущен, поиск начинается с первого символа строки
  • stringl ≈ строковое выражение, в котором выполняется поиск
  • string2 ≈ искомое строковое выражение
  • compare ≈ указывает способ сравнения строк. Допустимые значения: 0 (для двоичного сравнения), 1 (посимвольное сравнение без учета регистра)

 

Функции времени и даты

В VBA имеются следующие, функции времени и даты.

Функция

Возвращаемое значение

Date

Возвращает значение типа Variant (Date) , содержащее текущую системную дату

Time

Возвращает значение типа Variant (Date) , содержащее текущее время по системным часам компьютера

Now

Возвращает значение типа Variant (Date) , содержащее текущую дату и время по системному календарю и часам компьютера

Hour, Minute, Second

Возвращают значения типа variant (integer), содержащее целое число, которое представляет часы, минуты и секунды в значении времени.

Синтаксис:

Hour (время) Minute (время) Second (время)

  • время ≈ значение времени или выражение, его определяющее В следующем примере переменной Час присваивается 16, Минута ≈ 35 иСекунда ≈ 17: РасчетноеВремя = #4:35:17 РМ# Час = Hour (РасчетноеВремя) Минута = Minute (РасчетноеВремя) Секунда = Second (РасчетноеВремя)

Day, Month, Year

Возвращает значение типа Variant (Integer), содержащее целое число, которое представляет день, месяц, год в значении даты. Синтаксис: Month (дата) Year (дата) Q дата ≈значение даты или выражение, ее определяющее

Функция

Возвращаемое значение

Weekday

Timer DateDif f

В следующем примере переменной день присваивается 17, Месяц ≈ May, Год≈ I960: День Рождения = #Мау 17, 1960# День = Day (День Рождения) Месяц = Month (День Рождения) Год = Year (День Рождения) Возвращает значение типа Variant (integer) , содержащее целое число, представляющее день недели. Синтаксис: Weekday (date, [ f irstdayofweek] )

  • date ≈ выражение, представляющее дату
  • f irstdayofweek ≈ указывает первый день недели. Если этот аргумент опущен, подразумевается vbSunday (воскресенье). Допустимы также значения: vbMonday (понедельник), vbTuesday (вторник), vbWednesday (среда), vbThursday (четверг), vbFriday (пятница) и vbSaturday (суббота) В следующем примере переменной День Не дели присваивается 3, т. е. вторник: ДеньРождения = #Мау 17, 1960# ДеньНедели = Weekday (ДеньРождения) Возвращает значение типа Single, представляющее число секунд, прошедших после полуночи Возвращает значение типа Variant (Long) , указывающее число временных интервалов между двумя датами.

Синтаксис:

DateDif f (interval, datel, date2[, firstdayofweek [, f irstweekof year] ] )

Аргументы:

  • Interval ≈ строковое выражение, указывающее тип временного интервала, который следует использовать при вычислении разности между датами datel и date2. Допустимые значения: уууу (год), q (квартал), m (месяц), у (день года), d (день месяца), w (день недели), ww (неделя), h (часы), m (минуты), s (секунды)
  • datel, date2 ≈ значения типа Variant (Date). Две даты, разность между которыми следует вычислить
  • firstdayofweek ≈ постоянная, указывающая первый день недели Q firstweekofyear≈ постоянная, указывающая первую неделю года В следующем примере переменной ПрожилМесяцевСРождения присваивается 465: ПрожилМесяцевСРождения = DateDiff ("m", #5/17/601, Now)

Функция

Возвращаемое значение

DatePart DateAdd

TimeSerial DateSerial TimeValue

Возвращает значение типа variant (Integer) , содержащее указанный компонент даты.

Синтаксис:

DatePart (interval, date [, firstdayofweek[, firstweekofyear] ] )

Возвращает значение типа Variant ( Date ) , содержащее дату, к которой добавлен указанный временной интервал.

Синтаксис:

DateAdd'(interval, number, date)

Аргументы:

  • Iinterval ≈ строковое выражение, указывающее тип добавляемого временного интервала
  • number ≈ числовое выражение, указывающее число временных интервалов, которое следует добавить. Оно может быть положительным (для получения более поздних дат) или от-. рицательным (для получения более ранних дат).
  • date ≈ значение типа Variant (Date) или литерал даты, представляющий дату, к которой добавляется указанный временной интервал

В следующем примере переменной день присваивается 03/17/63-: День = DateAdd ("m", 34, |05/17/60#) Возвращает значение типа Variant (Date) , содержащее значение времени, соответствующее указанным часу, минуте и секунде.

Синтаксис:

TimeSerial (hour, minute, second)

Аргументы:

  • hour, minute и second ≈ значения типа Variant ( Integer) В данном примере переменной Время присваивается 16:35:17: Время = TimeSerial (16, 35, 17)

Возвращает значение типа Variant (Date) , соответствующее указанному году, месяцу и дню. Синтаксис: DateSerial (year, month, day)

Аргументы:

  • year, month и day ≈ значения типа Integer

В следующем примере переменной Дата присваивается

05/17/60: Дата = DateSerial (1960, 5, 17) Преобразует строку в формат времени

 

Функции выбора

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

Функция

Возвращаемое значение

lit

Choose

Switch

Возвращает одну из двух альтернатив.

Синтаксис:

  • If(expr, truepart, falsepart)
  • expr ≈ проверяемое выражение
  • truepart ≈ значение или выражение, возвращаемое, если ехрг имеет значение True
  • falsepart ≈ значение или выражение, возвращаемое, если ехрг имеет значение False В следующем примере, если значение переменной ОценкаЦифрой равно 5, то переменной ОценкаПрописыо присваивается строковая константа Отлично. В противном случае ей присваивается значение Не отлично: ОценкаПрописью = Ilf (ОценкаЦифрой = 5, "Отлично", "Не отлично")

Возвращает значение, выбранное из списка аргументов.

Синтаксис:

Choose (индекс, вариант-1[, вариант-2, ... [, вариант-п] ] )

  • индекс ≈ числовое выражение или поле, значением которого является число, лежащее между 1 и числом элементов в списке
  • вариант ≈ выражение типа Variant, содержащее один из элементов списка

Действие функции Choose: если индекс равняется 1 , возвращается первый элемент списка, если индекс равняется 2, возвращается второй элемент списка и т. д. Функцию choose можно использовать для выбора одного из возможных значений, представленных в виде списка. В следующем примере, если аргумент Выбор принимает значение 3, то переменной РезультатВыборы присваивается значение "три": РезультатВыборы = Choose (Выбор, "один", "два", "три") Возвращается значение, соответствующее первому истинному выражению в списке.

Синтаксис:

Switch ( выражение- 1, значение-1, выражение-2, значение-2 ... [, выражение-n, значение-п] ] )

 

Функции, возвращающие строки

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

Перечисленные ниже функции возвращают значения типа String, если к их имени добавляется символ доллара ($). Эти функции имеют такое же применение и синтаксис, как и их эквиваленты без символа доллара, возвращающие тип Variant.

Chr$

CurDir$

Date$

Dir$

Error$

Format$

Input$

InputB$

LCase$

Left$

LTrim$

MidS

Right$

Rtrim$

Space$

Str$

String$

Тime $

Trim$

Ucase$

 

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

В проектах VBA часто встречаются две разновидности диалоговых окон: окна сообщений и окна ввода. Они встроены в VBA, и если их возможностей достаточно, то можно обойтись без проектирования диалоговых окон. Окно сообщений (MsgBox) выводит простейшие сообщения для пользователя, а окно ввода (InpuBox) обеспечивает ввод информации.

Функция

Выводит на экран диалоговое окно, содержащее сообщение

InputBox

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

Синтаксис:

InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Аргументы:

  • prompt ≈ строковое выражение, отображаемое как сообщение в диалоговом окне. Строковое значение prompt может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (Сhr(13)), символа перевода строки (chr (10)) или комбинацию этих символов (Chr( 13) & Chr (10)) П title ≈ строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения
  • default ≈ строковое выражение, Отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода изображается пустым
  • xpos ≈ числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали
  • ypos ≈ числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана. Если этот аргумент опущен, диалоговое окно помещается по вертикали примерно на одну треть высоты экрана
  • helpfile ≈ строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо наличие также аргумента context
  • context - числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо наличие также аргумента helpfile

Процедура

Выводит на экран диалоговое окно, содержащее сообщение,

MsgBox

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

Синтаксис:

MsgBox (prompt [, buttons] [, title] [, helpfile, context])

Аргументы:

  • prompt ≈ строковое выражение, отображаемое как сообщение в диалоговом окне
  • buttons ≈ числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию этого аргумента равняется 0. Значения констант, определяющих число и тип кнопок используемого значка, приведены в табл. 11.1 ≈ 11.3
  • title ≈ строковое выражение, отображаемое в строке , заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения
  • helpfile ≈ строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо указать также аргумент context
  • context ≈ числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот аргумент указан, необходимо указать также аргумент helpfile


Таблица 11.1. Значения аргумента buttons процедуры MsgBox, определяющие отображаемые кнопки в диалоговом окне

Константа Значение Отображаются кнопки
vbOKOnly 0
VbOKCancel 1
VbAbortRetrylgnore 2
VbYesNoCancel 3
VbYesNo 4
VbRetryCancel 5

Таблица 11.2. Значения аргумента buttons процедуры м$двох, определяющие отображаемые информационные значки в диалоговом окне

Константа

Значение

Значок сообщения

VbCritical

16

VbQuestion

32

VbExclamation

48

VbInformation

64

 

Таблица 11.3. Значения аргумента buttons процедуры MsgBox, определяющие

основную кнопку в диалоговом окне

Константа

Значение

Номер основной кнопки

VbDefaultButton1

0

1

VbDefaultButton2

256

2

VbDefaultButton3

512

3

VbDefaultButton4

768

4

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

Константа.

Значение

Нажатая кнопка

vbOK

1

OK

vbCancel

2

Отмена (Cancel)

vbAbort

3

Прервать (Abort)

vbRetry

4

Повторить (Retry)

vbIgnore

5

Пропустить (Ignore)

vbYes

6

Да (Yes)

vbNo

7

Нет (No)

Приведем пример использования окон сообщений. В результате действия приведенной ниже процедуры Тестокон появится диалоговое окно пример окна ввода с полем ввода (рис. 11.1). Следуя приглашению в этом диалоговом окне, введем в поле ввода имя, например Андрей. Нажмем кнопку ок.

На экране отобразится диалоговое окно пример окна сообщения с текстом приветствия (рис. 11.2). Если пользователь не введет имя в поле ввода диалогового окна пример окна ввода или нажмет кнопку Отмена, то компьютер выразит свое неудовлетворение действиями пользователя отображением диалогового окна Еще один пример окна сообщения (рис. 11.3).

Рис. 11.1. Диалоговое окно Пример окна ввода

Рис. 11.2. Диалоговое окно

Пример окна сообщения

Рис. 11.3. Диалоговое окно Еще один пример окна сообщения

Private Sub ТестОкон()

'

' Описание переменной

Dim ИмяКлиента As String

'

' Ввод имени пользователя

'

ИмяКлиента = InputBox("Введите ваше имя", "Пример окна ввода")

' Реакция программы на ввод имени пользователя

If, ИмяКлиента <> "" Then

MsgBox "Привет, " & ИмяКлиента, vbInformation,

"Пример окна сообщения"

Else

MsgBox "Невежа, ты забыл ввести свое имя " & ИмяКлиента,

vbExclamation, "Еще один пример окна сообщения"

End If

End Sub

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

Sub ТриКнопки()

Dim Сообщение As String

Dim Кнопка As Integer

'

' В переменной Сообщение задается структура диалогового окна

'

Сообщение = vbYesNoCancel + vbQuestion + vbDefaultButtonl

'

' В переменную Кнопка вводится целое число, возвращаемое MsgBox

' при нажатии кнопки

'

Кнопка= MsgBox("Выбираете Да, Нет или Отмена?", Сообщение, "Еще пример")

'

' В зависимости от значения переменной Кнопка,

' на экране отображается соответствующее сообщение '

Select Case Кнопка Case vbYes

MsgBox "Выбрали Да", vblnformation, "Еще пример" Case vbNo

MsgBox "Выбрали Нет", vblnformation, "Еще пример" Case vbCancel

MsgBox "Выбрали Отмена", vblnformation, "Еще пример"

End Select

End Sub

Инструкции VBA

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

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

Оператор присвоения присваивает значение выражения переменной, константе или свойству объекта. Оператор присвоения всегда включает знак равенства (=).

Синтаксис:

[Let] Переменная (или Постоянная или Свойство Объекта) = Выражение

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

х = 2

х = х + 2

переменной х будет присвоено 4.

Для присвоения переменной ссылки на объект применяется инструкция Set. В следующем примере инструкция Set присваивает переменной Область диапазон А1:B3:

Set Область = Range("Al:B3")

В общем случае инструкция set имеет следующий синтаксис:

Set объектнаяПеременная = {[New] объектноеВыражение | Nothing}

Перенос строки

Расположение символов (пробел) + (Знак подчеркивания) в конце строки обеспечивает то, что последующая строка является продолжением предыдущей. При этом надо помнить, что:

В следующем примере первая из конструкций является разбиением второй на две строки:

у = sin(Application.Pi()*х) + (1 + х)^(1/2)/(1 + х^2)

у = Sin (Application. Pi ()*x) + (1 + х)^(1/2)/(1 + х^2)

Комментарии

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

  1. Делают программу легко читаемой, поясняя смысл программных кодов и алгоритма.
  2. Временно отключают фрагменты программы при ее отладке. В языке VBA существуют два способа ввода комментариев:

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

Dim a As Integer

'

' а ≈ целая переменная

'

Dim b As String

'

b ≈ строковая переменная

Расположение нескольких операторов на одной строке

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

1. х = х + 1

и

2. х = х + 1:у = х + 2

у = х + 2

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

Перечислим операторы перехода и выбора VBA.

Оператор

Действие

GoTo

If Then Else

Select Case

Оператор безусловного перехода.

Синтаксис:

GoTo Строка

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

Синтаксис:

If Условие Then [Инструкции] [Else Инструкции else]

Если Условие принимает значение True, то выполняется инструкция (или инструкции) после Then, если False, то выполняется инструкция (или инструкции) после Else. Ветвь Else является необязательной.

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

If Условие Then [Инструкции]

[Elself Условие-n Then [Инструкции

elseif ] . . . [Else [Инструкции else] ] End If Оператор выбора. Синтаксис: Select Case выражение [Case списокВыражений-1 [ инструкции- 1] ]

[Case списокВыражений-n [инструкции-п] ] [Case Else [инструкции else] ]

End Select

Оператор

Действие


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

On Error GoTo строка

Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением последнего может быть любая метка строки или номер строки. Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, необходимо помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

Sub InitializeMatrix (Varl, Var2, Var3, Var4) On Error GoTo ОбработкаОшибок

Exit Sub ОбработкаОшибок :

Resume Next .

End Sub

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

On Error Resume Next

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

On Error GoTo 0

Отключает любой активизированный обработчик ошибок в текущей процедуре

 

Операторы повтора

Перечислим операторы повтора VBA.

Оператор

Действие

For ≈ Next

Синтаксис:

For Счетчик = Начало То Конец [Step Шаг] [Инструкции]

For Each - Next Do Until ≈ Loop

Do ≈ Loop While Do While ≈ Loop

[Exit For] [Инструкции] Next [Счетчик] Повторяет выполнение группы инструкций, пока Счетчик изменяется от начального значения до конечного с указанным шагом. Если Шаг не указан, то он полагается равным 1.

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

Синтаксис:

For Each Элемент

In Группа [Инструкции] [Exit For] [Инструкции]

Next [Элемент]

Повторяет выполнение группы инструкций для каждого элемента массива или семейства. Альтернативный способ выхода из цикла предоставляет инструкция Exit For

Синтаксис:

Do [While Условие] [Инструкции] [Exit Do] [Инструкции] Loop

Повторяет выполнение набора инструкций, пока условие имеет значение True. Условие проверяется после выполнения инструкции по крайней мере один раз. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

Do [Инструкции] [Exit Do] [Инструкции] Loop [While Условие]

Повторяет выполнение набора инструкций, пока условие имеет значение True. Сначала выполняется инструкция, а потом проверяется условие. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

Do [While Условие] [Инструкции] [Exit Do]

Оператор

Действие

Do ≈ Loop Until While ≈ Wend

[Инструкции] Loop Повторяет выполнение набора инструкций, пока условие не примет значение True. Условие проверяется после выполнения инструкции по крайней мере один раз. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

Do [Инструкции] [Exit Do] [Инструкции] Loop [While Условие]

Повторяет выполнение набора инструкций, пока условие не примет значение True. Сначала выполняется инструкция, а потом проверяется условие. Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Синтаксис:

While Условие [Инструкции] Wend

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

 

Условная компиляция

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

Синтаксис:

#Const имяКонстанты = выражение

Аргументы:

ИмяКонстанты

Имя константы; должно соответствовать стандартным соглашениям об именах переменных

выражение

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

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

Синтаксис:

#If выражение Then

инструкции [#Elself выражение-n Then

[инструкции_elseif]] [#Еlse

[инструкции_elseif ]],

#End If

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

IConst WinPl = 1

' если Windows95, то Const WinPl = 1

' если Windows NT, то Const WinPl = 2

#If WinPl = 1 Then ФайлЗаставка = Start95.bmp"

#If WinPl = 2 Then ФайлЗаставка = "StartNT.bmp"

Процедура

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

Синтаксис:

[Private | Public] [Static] Sub Имя [(СписокАргументов)] [Инструкции]

[Exit Sub] [Инструкции]

End, Sub

Элементы описания:

Public

Указывает, что процедура Sub доступна для всех других процедур во всех модулях

Private

Указывает, что процедура sub доступна для других процедур только того модуля, в котором она описана

Static

Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры

Имя

Имя процедуры Sub, удовлетворяющее стандартным правилам именования переменных

СписокАргументов

Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой

Инструкции

Любая группа инструкций, выполняемых в процедуре

Sub

Инструкция Exit sub приводит к немедленному выходу из процедуры sub.

Синтаксис элемента СписокАргументов:

[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )]

[As тип] [= поУмолчанию]

Optional

Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как Optional, должны иметь тип variant. He допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray

ByVal

Указывает, что этот аргумент передается по значению

ByRef

Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию

ParamArray

Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как Optional массив значений типа variant. Ключевое слово paramArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами Byval, ByRef или Optional


имяПеременной

Имя переменной, удовлетворяющее стандартным правилам именования переменных

тип

Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только строки

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

поУмолчанию

Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing

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

Синтаксис:

[Public I Private] [Static] Function Имя [(СписокАргументов)]

[As Тип]

[Инструкции]

[Имя = Выражение]

[Exit Function]

[Инструкции]

[Имя = Выражение] End Function

Синтаксис инструкции Function содержит те же элементы, что и sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function.

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

Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках.

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

Переход в подпрограмму и возвращение из подпрограммы

В VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub- Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции.

Синтаксис:

GoSub строка

строка

Return

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

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

Вызов процедуры

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

Первый способ вызова процедуры Sub: ИмяПроцедуры СписокФактическихПараметров

ИмяПроцедуры

Имя вызываемой процедуры

СписокФактическихПараметров

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

Если требуется использовать несколько процедур с одинаковыми названиями, при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно, ИмяМодуля.ИмяПроцедуры СписокФактическихПараметров

Второй способ вызова процедуры sub производится с помощью инструкции Call.

ИмяПроцедуры (СписокФактическихПараметров)

Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.

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

Приведенный ниже пример показывает основные способы передачи параметров в процедуры.

Dim с As Double ',

'

' с - глобальный параметр '

Function F(ByVal x As Integer) As Integer

F = x ^ 2

End Function

Sub Assistant(ByVal a As Integer, ByVal b As Integer)

'

' Процедура, находящая сумму двух чисел и выводящая

' результат в диалоговом окне

'

с = а + b

'

MsgBox CStr(c)

End Sub

'

Sub Main ()

'

' Процедура, находящая сумму двух чисел и выводящая

' результат в диалоговом окне

Dim x, у As Double

' x, у ≈ переменные, используемые в качестве фактических параметров

' Вызов процедуры с конкретными числами как фактическими параметрами

'

Assistant 1, 3

' Первоначальное присвоение переменным значений,

' с последующим вызовом процедуры

'

х = 1: у = 1 Assistant x, у + 2

' Использование функции как фактического параметра

'

х = 1: у = 3

Assistant F(x), у

'

' Вызов процедуры с указанием фактических параметров по имени

'

Assistant a:=l, b:=3

End Sub

Приведем пример процедуры с необязательными параметрами. Процедура СторонаТреугольника позволяет найти длину недостающей стороны прямоугольного треугольника, где переменные А и В отведены под длины катетов, а переменная с ≈ под гипотенузу. Например, формула

=СторонаТреугольника(;В2;С2)

вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию isMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.

Function СторонаТреугольника(Optional A,

Optional В, Optional С)

If Not (IsMissing(A)) And Not (IsMissing(В)) Then

СторонаТреугольника = Sqr(А ^ 2 + В ^ 2)

End If

If Not (IsMissing(A)) And Not (IsMissing(C)) Then

СторонаТреугольника = Sqr(С ^ 2 - А ^ 2)

End If

If Not (IsMissing(B)) And Not (IsMissing(C)) Then

СторонаТреугольника = Sqr(C ^ 2 - В ^ 2)

End If

End Function

Назначение значений по умолчанию необязательным параметрам

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

Function Сумма (a As Double, Optional b As Double = 8)

Сумма = a + b End Function

Использование неопределенного количества параметров

Как правило, количество передаваемых параметров в процедуру совпадает с количеством определенных у этой процедуры параметров. Однако ключевое слово ParamArray предоставляет возможность ввода в процедуру произвольного, заранее не указанного числа параметров (например, как это происходит при использовании функции рабочего листа СУММ (sum)). В качестве примера приведем процедуру, которая выполняет то же действие, что и функция рабочего листа СУММ. Отличием функции СуммаПользователя от СУММ является то, что в ней в каждое поле ввода диалогового окна мастера функций можно вводить только либо число, либо ссылку на ячейку, а не на диапазон, как при работе с функцией СУММ.

Function СуммаПользователя(ParamArray Массив())

s = 0

For Each a In Массив

s = s + а Next a

СуммаПользователя = s

End Function

Рекурсивные процедуры

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

Fact(n) =n!, где Fact (0) =1.

Ясно, что

Fact(n) = n Fact (n - 1}

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

Function Fact(n As Integer) As Integer

If n<l Then

Fact = 1 Else

Fact = Fact(n - 1) n

End If

End Function

Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (нод) двух целых чисел ≈ это наибольшее целое, на которое делятся оба числа. Например, HOД(10, 14} = 2 и НОД (15, 31} = 1.

Алгоритм Евклида состоит в следующем:

  1. Если а делится на b, то НОД(а, b) = b
  2. В противном случае ≈ НОД(а, b) = НОД(b, a Mod b) Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

Function НОД(Целое1 As Long, Целое2 As Long) As Long

If Целое2 Mod Целое1 = 0 Then

НОД = Целое1 Else

НОД = НОД(Целое2, Целое1 Mod Целое2)

End If

End Function

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

Область определения переменной

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

  1. Переменные уровня процедуры используются только в процедуре, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.
  2. Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур.
  3. Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.

Время жизни переменной

Личная (private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.