Функции преобразования типов данных в VBA Excel. Наименования функций, синтаксис, типы возвращаемых данных, диапазоны допустимых значений выражения-аргумента.
Синтаксис функций преобразования
1 |
Функция(Выражение) |
Выражение (аргумент) – это любое строковое или числовое выражение, возвращающее значение, входящее в диапазон допустимых значений для аргумента. Выражение может быть представлено переменной или другой функцией.
Если аргумент, переданный в функцию, не входит в диапазон типа, в который преобразуются данные, происходит ошибка.
Функции преобразования типов
Наименования функций преобразования типов, типы возвращаемых данных, диапазоны допустимых значений для аргумента:
Функция | Тип данных | Диапазон значений аргумента |
---|---|---|
CBool | Boolean | Любое допустимое строковое или числовое выражение. |
CByte | Byte | От 0 до 255. |
CCur | Currency | От -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
CDate | Date | Любое допустимое выражение даты. |
CDbl | Double | От -1,79769313486231E308 до -4,94065645841247E-324 для отрицательных значений; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений. |
CDec | Decimal | 79 228 162 514 264 337 593 543 950 335 для чисел без десятичных знаков. Для чисел с 28 десятичными знаками диапазон составляет 7,9228162514264337593543950335. Наименьшим возможным числом, отличным от нуля, является число 0,0000000000000000000000000001. |
CInt | Integer | От -32 768 до 32 767, дробная часть округляется. |
CLng | Long | От -2 147 483 648 до 2 147 483 647, дробная часть округляется. |
CSng | Single | От -3,402823E38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. |
CStr | String | Результат, возвращаемый функцией CStr, зависит от аргумента Выражение. |
CVar | Variant | Диапазон совпадает с типом Double для числовых значений и с типом String для нечисловых значений. |
Дополнительно для VBA7:
Функция | Тип данных | Диапазон значений аргумента |
---|---|---|
CLngLng | LongLong | От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, дробная часть округляется. Действительно только для 64-разрядных платформ. |
CLngPtr | LongPtr | От -2 147 483 648 до 2 147 483 647 для 32-разрядных платформ, от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 для 64-разрядных платформ, дробная часть округляется в обоих типах систем. |
Примеры преобразования типов
Функция CBool
Функция CBool используется для преобразования выражений в тип данных Boolean.
1 2 3 4 5 6 7 8 9 10 11 |
Dim a a = CBool(10) 'Результат: True a = CBool(0) 'Результат: False a = CBool("True") 'Результат: True a = CBool("Test") 'Результат: Error Dim a, b, c a = "Test1" b = "Test2" c = CBool(a = b) 'Результат: False c = CBool(a <> b) 'Результат: True |
Функция CByte
Функция CByte используется для преобразования выражений в тип данных Byte.
1 2 3 4 5 6 7 8 9 |
Dim a, b, c a = 654 b = 3.36 c = a / b 'Результат: 194,642857142857 c = CByte(c) 'Результат: 195 c = a * b 'Результат: 2197,44 c = CByte(c) 'Результат: Error |
Функция CCur
Функция CCur используется для преобразования выражений в тип данных Currency.
1 2 3 4 5 |
Dim a, b, c a = 254.6598254 b = 569.2156843 c = a + b 'Результат: 823,8755097 c = CCur(a + b) 'Результат: 823,8755 |
Функция CDate
Функция CDate используется для преобразования выражений в тип данных Date. Она распознает форматы даты в соответствии с национальной настройкой системы.
1 2 3 4 5 6 7 8 9 |
Dim a As String, b As Date, c As Double a = "28.01.2021" b = CDate(a) 'Результат: #28.01.2021# c = CDbl(b) 'Результат: 44224 Dim a a = CDate(44298.63895) 'Результат: #12.04.2021 15:20:05# a = CDate(44298) 'Результат: #12.04.2021# a = CDate(0.63895) 'Результат: #15:20:05# |
Функция CDbl
Функция CDbl используется для преобразования выражений в тип данных Double.
1 2 3 4 |
Dim a As String, b As String, c As Double a = "45,3695423" b = "548955,756" c = CDbl(a) + CDbl(b) 'Результат: 549001,1255423 |
Eсли основной язык системы – русский, при записи в редакторе VBA Excel дробного числа в виде текста, ставим в качестве разделителя десятичных разрядов – запятую. Проверьте разделитель по умолчанию для своей национальной системы:
MsgBox Application.DecimalSeparator
Функция CDec
Функция CDec используется для преобразования выражений в тип данных Decimal.
1 2 3 4 5 6 7 8 9 |
Dim a As String, b As Double, c a = "5,9228162514264337593543950335" b = 5.92281625142643 c = CDec(a) - CDec(b) 'Результат: 0,0000000000000037593543950335 Dim a As Double, b As String, c a = 4.2643E-14 b = CStr(a) 'Результат: "4,2643E-14" c = CDec(a) 'Результат: 0,000000000000042643 |
Функция CInt
Функция CInt используется для преобразования выражений в тип данных Integer.
1 2 3 |
Dim a As String, b As Integer a = "2355,9228" b = CInt(a) 'Результат: 2356 |
Функция CLng
Функция CLng используется для преобразования выражений в тип данных Long.
1 2 3 4 |
Dim a As Date, b As Long a = CDate(44298.63895) 'Результат: #12.04.2021 15:20:05# b = CLng(a) 'Результат: 44299 a = CDate(b) 'Результат: #13.04.2021# |
Функция CSng
Функция CSng используется для преобразования выражений в тип данных Single.
1 2 3 |
Dim a As String, b As Single a = "3,2365625106" b = CSng(a) 'Результат: 3,236562 |
Функция CStr
Функция CStr используется для преобразования выражений в тип данных String.
1 2 3 |
Dim a As Single, b As String a = 5106.23 b = CStr(a) 'Результат: "5106,23" |
Функция CVar
Функция CVar используется для преобразования выражений в тип данных Variant.
1 2 3 4 5 |
Dim a As Double, b As String, c a = 549258.232546 b = "Новое сообщение" c = CVar(a) 'Результат: 549258,232546 (Variant/Double) c = CVar(b) 'Результат: "Новое сообщение" (Variant/String) |
эта команда прекрасно преобразует текст в дату
этот макрос позволяет выделенный диапазон представить в виде даты
но здесь новые значения получают новую прописку (новый, другой адрес)
а как сделать чтобы «b» прописывалась на месте «а»
и еще один вопрос
а можно ли обойтись без цикла ?
т.е. массиву присвоить переменную
а потом
По первому вопросу:
a = CDate(a)
По второму вопросу: массив не может быть аргументом функции CDate.
Здравствуйте, Евгений!
Здравствуйте, коллеги!
Почему
работает, а
выдаёт Type mismatch?
Добрый день!
Если
Пустая_ячейка
имеет общий формат, то пустая строка, возвращенная выражениемReplace(Пустая_ячейка, " ", "")
, преобразуется в ней в Empty, и функцияCSng(Пустая_ячейка)
возвращает ноль. Если задать этой ячейке текстовый формат, тоx = CSng(Пустая_ячейка)
, как и выражениеx = CSng(Replace(Пустая_ячейка, " ", ""))
, выдаст ошибкуType mismatch
.Проверочный код:
Увы, формат Общий ни на что не влияет в этом случае. Код
спотыкается Type mismatch на последней строке, какой бы тип у Cells(1, 1) ни был, если она пустая. А
работает при «1 2» в Cells(1, 1) любого типа.
Я об этом:
Большое спасибо за участие, Евгений.
Но ясности нет. Если в Sub tmp1() заменить
на
то всё тот же Type mismatch.
Функция Replace всегда возвращает строку. CSng(строка) вызывает Type mismatch. Если строка может интерпретироваться как число, например: «256», VBA преобразует его в аргументе функции CSng в число, а пустую строку в ноль не преобразовывает:
Если ячейка Cells(1, 1) содержит Empty или пустую строку, выражение
Replace(Cells(1, 1), " ", "")
возвращает пустую строку, и, соответственно,CSng(Replace(Cells(1, 1), " ", ""))
возвращает ошибку Type mismatch.Replace(Cells(1, 1), " ", "")
возвращает пустую строку.Стало быть, после
Cells(1, 1) = Replace(Cells(1, 1), " ", "")
вCells(1, 1)
пустая строка.Тогда, по-Вашему, и
CSng(Cells(1, 1))
тоже должен давать Type mismatch, но этого вSub tmp1()
не происходит.Это я уже объяснил ранее: в
Sub tmp1()
ячейке Cells(1, 1) присваивается общий формат, при котором пустая строка, возвращенная выражениемCells(1, 1) = Replace(Cells(1, 1), " ", "")
, автоматически преобразуется в Empty, аCSng(Empty)
возвращает ноль. ВSub tmp2()
, где ячейке Cells(1, 1) присваивается текстовый формат, преобразования пустой строки в Empty не происходит, иCSng("")
генерирует ошибку Type mismatch.Так почему код
даёт Type mismatch несмотря на присвоение общего формата и автоматического преобразования Replace’ом в Empty?
А где вы видите преобразование в ячейке:
x = CSng(Replace(Cells(1, 1), " ", ""))
? Преобразование в ячейке:Cells(1, 1) = Replace(Cells(1, 1), " ", "")
!Обсуждение закрыто.