Поиск…


Байт

Dim Value As Byte

Байт представляет собой неподписанный 8-битный тип данных. Он может представлять целые числа от 0 до 255, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: Overflow . Байт является единственным внутренним беззнаковым типом, доступным в VBA.

Функция кастинга для преобразования в байт - CByte() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Байт-массивы и строки

Строки и байтовые массивы могут быть заменены друг на друга посредством простого присваивания (необязательные функции преобразования).

Например:

Sub ByteToStringAndBack()

Dim str As String
str = "Hello, World!"

Dim byt() As Byte
byt = str

Debug.Print byt(0)  ' 72

Dim str2 As String
str2 = byt

Debug.Print str2    ' Hello, World!

End Sub

Чтобы иметь возможность кодировать символы Unicode , каждый символ в строке занимает два байта в массиве с первым младшим байтом. Например:

Sub UnicodeExample()

Dim str As String
str = ChrW(&H2123) & "."  ' Versicle character and a dot

Dim byt() As Byte
byt = str

Debug.Print byt(0), byt(1), byt(2), byt(3)  ' Prints: 35,33,46,0

End Sub

целое число

Dim Value As Integer

Целое число - это подписанный 16-битный тип данных. Он может хранить целые числа в диапазоне от -32,768 до 32,767, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

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

Обратите внимание, что в целом лучше использовать Long, а не Integer, если меньший тип не является членом типа или не требуется (либо по API-вызову, либо по другой причине), чтобы быть 2 байтами. В большинстве случаев VBA обрабатывает целые числа как 32-битные внутри, поэтому обычно нет преимуществ при использовании меньшего типа. Кроме того, каждый раз, когда используется тип Integer, он выполняет штраф за производительность, поскольку он бесшумно применяется как Long.

Функция кастинга для преобразования в Integer - это CInt() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

логический

Dim Value As Boolean

Логическое значение используется для хранения значений, которые могут быть представлены как True или False. Внутренне тип данных сохраняется как 16-битное значение с 0, представляющим False, и любое другое значение, представляющее True.

Следует отметить, что когда Boolean применяется к числовому типу, все биты имеют значение 1. Это приводит к внутреннему представлению -1 для подписанных типов и максимальному значению для неподписанного типа (байт).

Dim Example As Boolean
Example = True
Debug.Print CInt(Example)  'Prints -1
Debug.Print CBool(42)      'Prints True
Debug.Print CByte(True)    'Prints 255

Функция кастинга для преобразования в булевское значение - CBool() . Несмотря на то, что он представлен внутренне как 16-битное число, отбрасывание в Boolean из значений вне этого диапазона безопасно от переполнения, хотя оно устанавливает все 16 бит в 1:

Dim Example As Boolean
Example = CBool(2 ^ 17)
Debug.Print CInt(Example)   'Prints -1
Debug.Print CByte(Example)  'Prints 255

Долго

Dim Value As Long

A Long - это подписанный 32-битный тип данных. Он может хранить целые числа в диапазоне от -2,147,483,648 до 2,147,483,647, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

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

Обратите внимание, что поскольку Long соответствует ширине указателя в 32-разрядной операционной системе, Longs обычно используются для хранения и передачи указателей на и из функций API.

Функция кастинга для преобразования в Long - CLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

не замужем

Dim Value As Single

A Single - это подписанный 32-битный тип данных с плавающей точкой. Он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754 . Таким образом, не существует фиксированного диапазона значений, которые могут быть представлены типом данных. Ограничение - это точность сохраненного значения. Единица может хранить значения целочисленных значений в диапазоне от -16,777,216 до 16,777,216 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

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

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

Функция кастинга для преобразования в Single - это CSng() .

двойной

Dim Value As Double

A Double - это подписанный 64-битный тип данных с плавающей точкой. Подобно Single , он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754, и должны быть приняты те же меры предосторожности в отношении точности. Двойной объект может хранить целые значения в диапазоне от -9,007,199,254,740,992 до 9,007,199,254,740,992 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

Двойной переполняется при назначении значения, превышающего примерно 2 1024 . Он не будет переполняться отрицательными показателями, хотя допустимая точность будет сомнительной до того, как будет достигнут верхний предел.

Функция кастинга для преобразования в Double - это CDbl() .

валюта

Dim Value As Currency

Валюта - это подписанный 64-битный тип данных с плавающей точкой, аналогичный Double , но масштабированный на 10 000, чтобы обеспечить большую точность для 4 цифр справа от десятичной точки. Переменная Currency может хранить значения от -922,337,203,685,477.5808 до 922,337,203,685,477.5807, предоставляя ей наибольшую емкость любого встроенного типа в 32-битном приложении. Как следует из названия типа данных, считается, что наилучшим образом использовать этот тип данных при представлении денежных расчетов, поскольку масштабирование помогает избежать ошибок округления.

Функция кастинга для преобразования в валюту - CCur() .

Дата

Dim Value As Date

Тип Даты представлен внутренне в качестве подписанного 64 бит с плавающей точкой типа данных со значением слева от десятичного представляющего количества дней с момента эпохи декабря 30 - го, 1899 (хотя см примечания ниже). Значение справа от десятичного знака представляет время как дробный день. Таким образом, целочисленная дата будет иметь временной компонент в 12:00:00 AM, а x.5 будет иметь временной компонент в 12:00:00 PM.

Допустимые значения Даты находятся между 1 января 100 года и 31 декабря 9999. й Поскольку двойной имеет больший диапазон, можно переполнять Дата путем присвоения значения вне этого диапазона.

Таким образом, его можно использовать взаимозаменяемо с расчетами Double for Date:

Dim MyDate As Double
MyDate = 0                                  'Epoch date.
Debug.Print Format$(MyDate, "yyyy-mm-dd")   'Prints 1899-12-30.
MyDate = MyDate + 365
Debug.Print Format$(MyDate, "yyyy-mm-dd")   'Prints 1900-12-30.

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

строка

Строка представляет последовательность символов и поставляется в двух вариантах:

Переменная длина

Dim Value As String

Строка переменной длины позволяет добавлять и усекать и хранится в памяти как COM BSTR . Это состоит из 4-байтового беззнакового целого числа, которое хранит длину строки в байтах, за которой следуют строковые данные в виде широких символов (2 байта на символ) и заканчивается двумя нулевыми байтами. Таким образом, максимальная длина строки, которую может обрабатывать VBA, составляет 2 147 483 647 символов.

Внутренний указатель на структуру (восстанавливаемый StrPtr() ) указывает на расположение памяти данных , а не на префикс длины. Это означает, что VBA String может быть передана непосредственно API-функциям, которым требуется указатель на массив символов.

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

Фиксированная длина

Dim Value As String * 1024    'Declares a fixed length string of 1024 characters.

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

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

Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar          'Prints "Fooba"

Функция каста для преобразования в строку любого типа - CStr() .

Долго долго

Dim Value As LongLong

LongLong - это подписанный 64-битный тип данных и доступен только в 64-битных приложениях. Он не доступен в 32 - разрядных приложений , работающих на 64 - разрядных операционных системах. Он может хранить целые значения в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

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

Тип данных LongLong был представлен как часть поддержки 64-битной операционной системы VBA. В 64-битных приложениях это значение может использоваться для хранения и передачи указателей на 64-битные API.

Функция литья для преобразования в LongLong - CLngLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Вариант

Dim Value As Variant    'Explicit
Dim Value               'Implicit

A Variant - это тип данных COM, который используется для хранения и обмена значениями произвольных типов, а любой другой тип в VBA может быть назначен Variant. Переменные, объявленные без явного типа, указанные As [Type] умолчанию для варианта.

Варианты хранятся в памяти как структура VARIANT, которая состоит из дескриптора байтового типа ( VARTYPE ), за которым следуют 6 зарезервированных байтов, а затем 8-байтовая область данных. Для числовых типов (включая Date и Boolean) базовое значение сохраняется в самом Variant. Для всех других типов область данных содержит указатель на базовое значение.

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

Основной тип Variant может быть определен с помощью функции VarType() которая возвращает числовое значение, хранящееся в дескрипторе типа, или функцию TypeName() которая возвращает строковое представление:

Dim Example As Variant
Example = 42
Debug.Print VarType(Example)    'Prints 2 (VT_I2)
Debug.Print TypeName(Example)   'Prints "Integer"
Example = "Some text"
Debug.Print VarType(Example)    'Prints 8 (VT_BSTR)
Debug.Print TypeName(Example)   'Prints "String"

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

Значение Результирующий тип
Строковые значения строка
Номера без плавающей запятой в диапазоне Integer целое число
Номера без плавающей запятой в дальнем расстоянии Долго
Номера без плавающей запятой вне дальнего расстояния двойной
Все числа с плавающей запятой двойной

Примечание. Если не существует конкретной причины использовать вариант (т.е. итератор в цикле For Each или требование API), тип обычно следует избегать для обычных задач по следующим причинам:

  • Они не безопасны для типов, что увеличивает вероятность ошибок во время выполнения. Например, вариант, содержащий значение Integer, беззвучно изменяет себя на Long, а не на переполнение.
  • Они вносят накладные расходы на обработку, требуя, по крайней мере, одного дополнительного разыменования указателя.
  • Требование к памяти для Variant всегда на 8 байт выше, чем требуется для хранения базового типа.

Функция кастинга для преобразования в вариант - это CVar() .

LongPtr

Dim Value As LongPtr

LongPtr был представлен в VBA для поддержки 64-битных платформ. В 32-битной системе он рассматривается как Long и на 64-битных системах, он рассматривается как LongLong .

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

Хотя он обрабатывается операционной системой как адрес памяти при использовании в вызовах API, следует отметить, что VBA рассматривает его как подписанный тип (и, следовательно, подвержен неподписанному сигналу переполнения). По этой причине любая арифметика указателя, выполняемая с использованием LongPtrs, не должна использовать > или < сравнения. Этот «quirk» также позволяет добавлять простые смещения, указывающие на действительные адреса в памяти, может привести к ошибкам переполнения, поэтому следует соблюдать осторожность при работе с указателями в VBA.

Функция кастинга для преобразования в LongPtr - CLngPtr() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5 (хотя, поскольку он обычно является адресом памяти, использование его в качестве целевой цели для расчета с плавающей точкой в ​​лучшем случае опасно).

Десятичный

Dim Value As Variant
Value = CDec(1.234)

'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")

Тип данных Decimal доступен только в качестве CDec Variant , поэтому вы должны объявить любую переменную, которая должна содержать Decimal как Variant а затем назначить Decimal значение с CDec функции CDec . Ключевое слово Decimal является зарезервированным словом (которое предполагает, что VBA в конечном итоге будет добавлять поддержку первого класса для этого типа), поэтому Decimal нельзя использовать как имя переменной или процедуры.

Для типа Decimal требуется 14 байт памяти (в дополнение к байтам, которые требуются родительскому варианту), и может хранить номера до 28 знаков после запятой. Для чисел без знаков после запятой диапазон допустимых значений составляет -79,228,162,514,264,337,593,543,950,335 до +79,228,162,514,264,337,593,543,950,335 включительно. Для чисел с максимальным числом знаков в 28 знаков после запятой диапазон допустимых значений составляет -7.9228162514264337593543950335 по +7.9228162514264337593543950335 включительно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow