Числа

Язык VBA поддерживает следующие числовые типы:

  • Byte — целые числа от 0 до 255. Занимает 1 байт;
  • Integer — целые числа от -32 768 до 32 767. Занимает 2 байта;
  • Long — длинные целые числа. Диапазон значений от -2 147 483 648 до 2 147 483 647. Занимает 4 байта;
  • Single — вещественное число. Занимает 4 байта;
  • Double — вещественное число двойной точности. Занимает 8 байт;
  • Currency — числа с фиксированной точкой (четыре цифры после точки). Тип используется для хранения денежных величин. Занимает 8 байт;
  • Decimal — десятичное масштабируемое число. Может содержать значения в диапазоне +/-79 228 162 514 264 337 593 543 950 335 или +/-7.9228162514264337593543950335. Минимальное ненулевое значение равно +/-0.0000000000000000000000000001. Обратите внимание на то, что объявить переменную данного типа явным образом нельзя. Тип Decimal является подтипом типа Variant и создается с помощью функции CDec(). Пример:
Dim p As Variant
p = CDec(12.4546565)
Debug.Print TypeName(p) ' Выведет: Decimal

Создать объект целочисленного типа можно обычным способом:

Dim x As Integer, y As Integer
x = 10
y = -50
Debug.Print x; y ' 10 -50

Кроме того, можно указать число в восьмеричной или шестнадцатеричной форме. Такие числа будут автоматически преобразованы в десятичные целые числа. Восьмеричные числа начинаются с комбинации символов &O и содержат цифры от 0 до 7:

Debug.Print &O7; &O12; &O777 ' 7  10  511

Шестнадцатеричные числа начинаются с комбинации символов &H и могут содержать цифры от 0 до 9 и буквы от A до F:

Debug.Print &H9; &HA; &H10; &HFF ' 9  10  16  255

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

Dim x As Double, y As Double, z As Double
x = 10.5
y = 1.1E+21
z = 2.5E-25
Debug.Print x; y; z ' 10,5  1,1E+21  2,5E-25

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

Debug.Print (0.3 - 0.1 - 0.1 - 0.1) ' -2,77555756156289E-17

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

Dim a As Currency, b As Currency, c As Currency, d As Currency
a = 0.3: b = 0.1: c = 0.1: d = 0.1
Debug.Print (a - b - c - d) ' 0

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

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

  • CByte(<Значение>) — преобразует значение в число типа Byte. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CByte(0)       ' Выведет: 0
Debug.Print CByte(145.8)   ' Выведет: 146
Debug.Print CByte(145.3)   ' Выведет: 145
Debug.Print CByte(145.5)   ' Выведет: 146
  • CInt(<Значение>) — преобразует значение в число типа Integer. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CInt(145.8)   ' Выведет: 146
Debug.Print CInt(145.3)   ' Выведет: 145
Debug.Print CInt(145.5)   ' Выведет: 146
  • CLng(<Значение>) — преобразует значение в число типа Long. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CLng(145.8)   ' Выведет: 146
Debug.Print CLng(145.3)   ' Выведет: 145
Debug.Print CLng(145.5)   ' Выведет: 146
  • CSng(<Значение>) — преобразует значение в число типа Single. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CSng(145)     ' Выведет: 145
Debug.Print CSng("45,5")  ' Выведет: 45,5
  • CDbl(<Значение>) — преобразует значение в число типа Double. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CDbl(145)     ' Выведет: 145
Debug.Print CDbl("45,5")  ' Выведет: 45,5
  • CCur(<Значение>) — преобразует значение в число типа Currency. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CCur(145)     ' Выведет: 145
Debug.Print CCur("45,5")  ' Выведет: 45,5
  • CDec(<Значение>) — преобразует значение в число типа Decimal. Если преобразование невозможно возбуждается исключение. Пример:
Debug.Print CDec(145)     ' Выведет: 145
Debug.Print CDec("45,5")  ' Выведет: 45,5
  • Val(<Строка>) — преобразует строку в целое или вещественное число. Строка просматривается слева направо пока не встретится недопустимый символ. В качестве десятичного разделителя должна быть указана точка. Пробелы, символы табуляции и символ перевода строки игнорируются. В строке могут быть указаны восьмеричные и шестнадцатеричные значения. Восьмеричные значения должны начинаться с комбинации символов &O, а шестнадцатеричные значения — с комбинации символов &H. Если преобразование невозможно функция возвращает значение 0. Пример:
Debug.Print Val("str")           ' 0 (преобразовать нельзя)
Debug.Print Val("125 45.54 str") ' 12545,54
Debug.Print Val("125 45,54 str") ' 12545
Debug.Print Val("&O100")         ' 64 (восьмеричное число)
Debug.Print Val("&Hff")          ' 255 (шестнадцатеричное число)
  • Oct(<Число>) — преобразует десятичное число в восьмеричное. Возвращает строковое представление числа. Пример:
Debug.Print Oct(7)           ' 7
Debug.Print Oct(8)           ' 10
Debug.Print Oct(64)          ' 100
  • Hex(<Число>) — преобразует десятичное число в шестнадцатеричное. Возвращает строковое представление числа. Пример:
Debug.Print Hex(10)          ' A
Debug.Print Hex(16)          ' 10
Debug.Print Hex(255)         ' FF
  • CStr(<Значение>) — преобразует значение в строку. Пример:
Debug.Print "'" & CStr(145) & "'"    ' Выведет: '145'
Debug.Print "'" & CStr(145.5) & "'"  ' Выведет: '145,5'
Debug.Print "'" & CStr(-145.5) & "'" ' Выведет: '-145,5'
  • str(<Число>) — преобразует число в строку. Первый символ в строке резервируется под знак числа. Если число является положительным, то первый символ будет пробелом, а если отрицательным — то первым символом будет знак минус. Обратите также внимание на то, что при выводе десятичный разделитель отображается в виде точки, а не в виде запятой, как это было при использовании функции CStr(). Пример:
Debug.Print "'" & str(145) & "'"     ' Выведет: ' 145'
Debug.Print "'" & str(145.5) & "'"   ' Выведет: ' 145.5'
Debug.Print "'" & str(-145.5) & "'"  ' Выведет: '-145.5'

Функция str() возвращает значение типа Variant (String). Чтобы получить значение типа String следует использовать функцию str$(), имеющую тот же самый формат. Пример:

Debug.Print "'" & str$(145) & "'"     ' Выведет: ' 145'
  • IsNumeric(<Значение>) — возвращает значение True, если значение можно преобразовать в число, и False — в противном случае:
Debug.Print IsNumeric("10")     ' Выведет: True
Debug.Print IsNumeric("10,5")   ' Выведет: True
Debug.Print IsNumeric("10.5")   ' Выведет: False
Debug.Print IsNumeric("Строка") ' Выведет: False

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

Перечислим основные математические функции:

  • Sin(<Число>), Cos(<Число>), Tan(<Число>) — стандартные тригонометрические функции (синус, косинус, тангенс);
  • Atn(<Число>) — арктангенс числа. Получим значение числа Пи:
Debug.Print 4 * Atn(1)          ' 3,14159265358979
  • Exp(<Число>) — экспонента;
  • Log(<Число>) — логарифм;
  • Sqr(<Число>) — квадратный корень:
Debug.Print Sqr(100); Sqr(25)   ' 10  5
  • abs(<Число>) — возвращает абсолютное значение:
Debug.Print Abs(-10); Abs(10); Abs(-12.5)   ' 10  10  12,5
  • Sgn(<Число>) — позволяет определить знак числа. Возвращает одно из следующих значений:
  • 1 — если число больше нуля;
  • 0 — если число равно нулю;
  • -1 — если число меньше нуля.

Пример:

Debug.Print Sgn(5); Sgn(0); Sgn(-5)      ' 1  0 -1

Округление чисел

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

  • Fix(<Число>) — возвращает значение, округленное до целого числа. Дробная часть числа просто отбрасывается:
Debug.Print Fix(1.49); Fix(1.5); Fix(1.51)       ' 1  1  1
Debug.Print Fix(-1.49); Fix(-1.5); Fix(-1.51)    ' -1 -1 -1
  • Int(<Число>) — возвращает значение, округленное до целого числа. Для положительных чисел дробная часть просто отбрасывается, а для отрицательных чисел возвращается ближайшее меньшее значение:
Debug.Print Int(1.49); Int(1.5); Int(1.51)       ' 1  1  1
Debug.Print Int(-1.49); Int(-1.5); Int(-1.51)    ' -2 -2 -2

Для округления чисел можно также воспользоваться функцией CInt():

Debug.Print CInt(1.49); CInt(1.5); CInt(1.51)    ' 1  2  2
Debug.Print CInt(-1.49); CInt(-1.5); CInt(-1.51) ' -1 -2 -2

Генерация псевдослучайных чисел

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

  • Rnd([<Число>]) — возвращает псевдослучайное вещественное число типа Single меньше 1, но большее или равное 0. Если параметр не указан или задано положительное значение, то функция возвращает следующее псевдослучайное число из последовательности:
Debug.Print Rnd()      ' 0,9639515
Debug.Print Rnd()      ' 0,7691374
Debug.Print Rnd()      ' 0,1994485

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

Debug.Print Rnd(-2)      ' 0,7133257
Debug.Print Rnd(-2)      ' 0,7133257
Debug.Print Rnd(-2)      ' 0,7133257
Debug.Print Rnd(-3)      ' 0,9633257
Debug.Print Rnd(-3)      ' 0,9633257

Если указано значение 0, то функция возвращает последнее сгенерированное число:

Debug.Print Rnd()       ' 0,7892948
Debug.Print Rnd(0)      ' 0,7892948
  • Randomize [<Число>] — настраивает генератор псевдослучайных чисел на новую последовательность.

Создадим генератор паролей произвольной длины (листинг 5.1). Для этого добавляем в массив arr все разрешенные символы, а далее в цикле получаем случайный элемент, сгенерировав индекс с помощью пользовательской функции Rand(), возвращающей целое число в указанном диапазоне.

Листинг 5.1. Генератор паролей

Function Rand(От As Integer, До As Integer) As Integer
   Randomize
   Rand = Int((До - От + 1) * Rnd() + От)
End Function

Function PassGen(Длина As Integer) As String
   Dim arr As Variant, s As String, i As Integer, n As Integer
   arr = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", _
         "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", _
         "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", _
         "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", _
         "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", _
         "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", _
         "8", "9", "0")
   s = ""
   n = UBound(arr)
   For i = 1 To Длина
      s = s & arr(Rand(0, n))
   Next
   PassGen = s
End Function

Sub Тест()
   Debug.Print PassGen(6)      ' KEdfSg
   Debug.Print PassGen(8)      ' nwkV786b
   Debug.Print PassGen(10)     ' CLTtJI260Z
End Sub

Visual Basic for Applications (VBA)
Самоучитель по VBA

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

Поиск по сайту в Яндексе