* Променливи, оператори и константи във VBA
Публикувано на 22 септември 2015 в раздел Макроси VBA.
VBA включва всички стандартни примитивни типове данни, които вече са ви познати от уводните курсове по програмиране. Декрарирането на променлива се извършва по следния начин:
Dim <varname> As <Vartype>
Основните типове данни са следните:
Тип | Вид | Стойности |
---|---|---|
Boolean | Булев | True или False |
Byte | Цяло число | 0 до 255 |
Integer | Цяло число | -32,768 до 32,767 |
Long | Цяло число | -2,147,483,648 до 2,147,483,648 |
LongLong | Цяло число (само при 64 битови системи) |
-9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 |
LongPtr | Указател | Long при 32 битови и LongLong при 64 битови системи |
Single | Плаваща запетая | -3.402823E+38 до -1.401298E-45 за отрицателни числа 1.401298E-45 до 3.402823E+38 за положителни числа |
Double | Плаваща запетая | -1.79769313486232e+308 до -4.94065645841247E-324 за отрицателни числа 4.94065645841247E-324 до 1.79769313486232e+308 за положителни числа |
Currency | Фиксиран числов | -922,337,203,685,477.5808 до 922,337,203,685,477.5807 |
Decimal | Фиксиран числов | +/- 79,228,162,514,264,337,593,543,950,335 ако няма десетична запетая +/- 7.9228162514264337593543950335 (28 цифри след десетичната запетая. |
String(фиксирана дължина) | Текстови | 1 до 65,400 символа (кодировката е според източника) |
String(променлива дължина) | Текстови | 0 до 2 милиарда символа (кодировката е според източника) |
Date | Дата и час | January 1, 100 до December 31, 9999 и време от 00:00:00 до 23:59:59 |
Object | Референтен | Всякакъв обект |
Variant | Променлив | Всякакъв без String(фиксирана дължина) |
Ако например искаме да инициализираме променлива MyVar, която да е цяло число от тип Integer, ще напишем следния код:
Dim MyVar As Integer
За да присвоите стойност на тази променлива, използвате оператор за присвояване "=":
MyVar = 10
Важно е в самото начало да се отбележи, че във VBA няма специален символ за край на команда. В други програмни езици съществуват разделители като например ";" и чрез тях можете да изпълните две команди на един ред. При VBA е задължително всяка команда да е на отделен ред. Въпреки това има начин да се декларират променливи на един ред. Ето един пример:
Dim Var1 As Long, Var2 As Integer, Var3 As Single
Специално отбелязваме, че е необходимо да запишете типа на всяка една от изброените променливи. Ако не го направите, те ще станат Variant. Например ако напишете следното:
Dim Var1, Var2, Var3 As Long
може погрешно да си помислите, че сте декларирали и трите променливи като Long. Това не е така. Вие реално сте декларирали следното:
Dim Var1 As Variant, Var2 As Variant, Var3 As Long
Декларирането на променливите във VBA не е задължително. Ако използвате променлива, която не е декларирана, тя автоматично приема тип данни Variant. Този тип данни е по-специален от останалите, защото не е строго фиксиран. Ако например присвоите Byte на Variant променлива и извършвате аритметични операции с нея, тя ще се интерпретира като Byte. Ако обаче по някаква причина прехвърлите типа, тази променлива автоматично ще бъде интерпретирана като по-големия тип - в примера Integer. На пръв поглед този тип данни изглежда много удобен, но все пак трябва да знаете, че той е по-малко ефективен от гледна точка на бързодействие спрямо останалите (разликата е незабележима при малки проекти, но би могло да бъде осезаема при огромно количество изчисления). Затова е добра практика да се научим да подбираме коректно типовете данни, когато можем да ги фиксираме.
Ето един пример за това как можем да декрарираме различни променливи и да им присвоим съответни стойности:
Dim BoolVar As Boolean BoolVar = True Dim ByteVar As Byte ByteVar = 213 Dim IntVar As Integer IntVar = 13991 Dim LongVar As Long LongVar = 19918330 Dim SingleVar As Single SingleVar = 13.98 Dim DoubleVar As Double DoubleVar = 5559.223 Dim VarlenStringVar As String VarlenStringVar = "abcdefgh" Dim FixedlenStringVar As String * 4 FixedlenStringVar = "abcd" Dim DateVar As Date DateVar = #9/22/2015# Dim DateTimeVar As Date DateTimeVar = #9/22/2015 5:15:00 PM# Dim VariantVar As Variant VariantVar = 10 VariantVar = 12.55 VariantVar = "abcd" VariantVar = #9/22/2015#
Възможно е да поставяте коментари в кода. Това се прави или чрез оператор REM или чрез неговия съкратен запис единична кавичка:
Rem this is a comment 'This is also a comment
Аритметичните операции са стандартните, които може да видите във всеки език за програмиране:
Оператор | Тип | Описание | Пример |
---|---|---|---|
+ | Аритметичен | Събира числа от всякакъв тип | Dim A As Integer A = 6 + 5 '11 |
- | Аритметичен | Изважда числа от всякакъв тип | Dim B As Integer B = 10 - 6 '4 |
* | Аритметичен | Умножава числа от всякакъв тип | Dim C As Integer C = 3 * B '12 |
\ | Аритметичен | Дели цели числа | Dim D As Integer D = 32 \ 20 '1 |
MOD | Аритметичен | Остатък от деление на цели числа | Dim E As Integer E = 32 MOD 20 '8 |
/ | Аритметичен | Дели числа с плаваща запетая | Dim F As Double F = 30 / 20 '1.5 |
^ | Аритметичен | Експонента, работи с всякакви числа, но връща винаги Double | Dim G As Double G = 3 ^ 2 '9.0 - винаги Double |
= | Присвояване Сравнение |
Дава стойност на променлива или сравнява изрази | Dim H As Integer H = 8 'Присвоява 8 на H Dim HEven As Boolean HEven = (H Mod 2 = 0) 'Проверява дали H Mod 2 e 0 'и връща true или false на HEven |
<, <=, >, >=, <> | Сравнение | Сравняват изрази | Dim I As Integer, J As Integer I = 3 J = 4 IJCompare As Boolean IJCompare = I < J 'true IJCompare = I >= J 'false IJCompare = I <> J 'true |
AND | Логически | Логическо "И" - ако и двете са истина, връща true - иначе false | Dim LogicalCmp As Boolean LogicalCmp = (I = 3) AND (J = 4) 'true LogicalCmp = (I <5) AND (J > 8) 'false, J не е по-голямо от 8 |
OR | Логически | Логическо "ИЛИ" - ако поне едно от двете е истина, връща true - иначе false | LogicalCmp = (I < 5) OR (J > 8) 'true, I е по-малко от 5 |
NOT | Логически | Логическо отрицание - превръща true във false или false във true | LogicalCmp = NOT (I < 5) 'false, защото I < 5 връща true |
XOR | Логически | Изключващо "ИЛИ" - ако само едното е истина, връща true - иначе false | LogicalCmp = (I < 5) XOR (J >8) 'true, само едно от двете е вярно LogicalCmp = (I < 5) XOR (J >0) 'false, и двете са вярни LogicalCmp = (I <= 0) XOR (J > 10) 'false, нито едно не е вярно |
AndAlso | Логически | Логическо "И" с прекъсване ако първия израз е false | LogicalCmp = (I = 3) AndAlso (J = 4) 'true, и двете са проверени LogicalCmp = (I = 3) AndAlso (J > 10) 'false, и двете са проверени LogicalCmp = (I < 0) AndAlso (J = 4) 'false, само първото е проверено |
& | Конкатенация | Долепва два текстови низа. Ако подадем данни, които не са текстови низ, те се превръщат в String | Dim StrConcatVar As String StrConcatVar = I & J '34 StrConcatVar = "I = " & I & ", J = " & J 'I = 3, J = 4 |
Има и други оператори, които са или по-рядко използвани, или прекалено сложни за обаснение на този етап. Някои от тях ще разгледаме по-нататък.
Възможно е да дефинирате и константи. Това са такива променливи, които след инициализация не могат да бъдат променяни. Константите се декларират и инициализират по следния начин:
Const NameOfConst As Integer = 10
След тази декларация NameOfConst вече не може да си променя стойността.
БРАВО !!!
ОТЛИЧНО !!!