Функции преобразования типов данных в VBA Excel. Наименования функций, синтаксис, типы возвращаемых данных, диапазоны допустимых значений выражения-аргумента.
Синтаксис функций преобразования
Выражение (аргумент) – это любое строковое или числовое выражение, возвращающее значение, входящее в диапазон допустимых значений для аргумента. Выражение может быть представлено переменной или другой функцией.
Если аргумент, переданный в функцию, не входит в диапазон типа, в который преобразуются данные, происходит ошибка.
Функции преобразования типов
Наименования функций преобразования типов, типы возвращаемых данных, диапазоны допустимых значений для аргумента:
Функция | Тип данных | Диапазон значений аргумента |
---|---|---|
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.
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.
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.
Dim a, b, c a = 254.6598254 b = 569.2156843 c = a + b ‘Результат: 823,8755097 c = CCur(a + b) ‘Результат: 823,8755 |
Функция CDate
Функция CDate используется для преобразования выражений в тип данных Date. Она распознает форматы даты в соответствии с национальной настройкой системы.
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.
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.
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.
Dim a As String, b As Integer a = «2355,9228» b = CInt(a) ‘Результат: 2356 |
Функция CLng
Функция CLng используется для преобразования выражений в тип данных Long.
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.
Dim a As String, b As Single a = «3,2365625106» b = CSng(a) ‘Результат: 3,236562 |
Функция CStr
Функция CStr используется для преобразования выражений в тип данных String.
Dim a As Single, b As String a = 5106.23 b = CStr(a) ‘Результат: «5106,23» |
Функция CVar
Функция CVar используется для преобразования выражений в тип данных Variant.
Dim a As Double, b As String, c a = 549258.232546 b = «Новое сообщение» c = CVar(a) ‘Результат: 549258,232546 (Variant/Double) c = CVar(b) ‘Результат: «Новое сообщение» (Variant/String) |
Функции преобразования типов данных используются в тексте процедур VBA Excel для того, чтобы указать, что результатом выполнения той или иной операции должны стать данные определенного типа, отличающегося от типа, заданного по умолчанию.
Содержание
- Функции преобразования типов
- Синтаксис
- Возвращаемые типы
- Примечания
- Пример функции CBool
- Пример функции CByte
- Пример функции CCur
- Пример функции CDate
- Пример функции CDbl
- Пример функции CDec
- Пример функции CInt
- Пример функции CLng
- Пример функции CSng
- Пример функции CStr
- Пример функции CVar
- См. также
- Поддержка и обратная связь
- Метод Application.ConvertFormula (Excel)
- Синтаксис
- Параметры
- Возвращаемое значение
- Примечания
- Пример
- Поддержка и обратная связь
- Type conversion functions
- Syntax
- Return types
- Remarks
- CBool function example
- CByte function example
- CCur function example
- CDate function example
- CDbl function example
- CDec function example
- CInt function example
- CLng function example
- CSng function example
- CStr function example
- CVar function example
- See also
- Support and feedback
Функции преобразования типов
Каждая функция приводит выражение к нужному типу данных.
Синтаксис
- CBool(выражение)
- CByte(выражение)
- CCur(выражение)
- CDate(выражение)
- CDbl(выражение)
- CDec(выражение)
- CInt(выражение)
- CLng(выражение)
- CLngLng(выражение) (действительно только для 64-разрядных платформ).
- CLngPtr(выражение)
- CSng(выражение)
- CStr(выражение)
- CVar(выражение)
Обязательный аргумент выражение — это любое строковое или числовое выражение.
Возвращаемые типы
Тип возвращаемого значения определяется по имени функции в соответствии со следующей таблицей:
Функция | Тип возвращаемых данных | Диапазон выражения-аргумента |
---|---|---|
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, дробная часть округляется. |
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-разрядных систем; дробная часть округляется в обоих типах систем. |
CSng | Single | От -3,402823E38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,402823E38 для положительных значений. |
CStr | String | Результат, возвращаемый функцией CStr, зависит от аргумента выражение. |
CVar | Variant | Диапазон совпадает с типом Double для числовых значений и с типом String для нечисловых значений. |
Примечания
Если выражение, переданное в функцию, не входит в диапазон типа, в который преобразуются данные, происходит ошибка.
Для явного присвоения значений типа LongLong (включая тип LongPtr на 64-разрядных платформах) целочисленным типам данных меньшего размера должны использоваться функции преобразования. Неявные преобразования типа LongLong в меньшие целочисленные типы не допускаются.
Как правило, функции преобразования типов используются в тексте программ для того, чтобы указать, что результатом той или иной операции должны стать данные определенного типа, а не типа, заданного по умолчанию. Например, с помощью функции CCur можно принудительно перейти к вычислениям в денежном формате в тех случаях, в которых обычно используются действия с числами с обычной точностью, двойной точностью или с целыми числами.
Функции преобразования типа данных следует использовать вместо функции Val для преобразования типов данных в приложениях, поддерживающих различные региональные стандарты. Например, при использовании функции CCur десятичные разделители, разделители групп разрядов и параметры денежных единиц распознаются в соответствии с языковыми и региональными параметрами компьютера.
Если дробная часть целого числа строго равна 0,5, функции CInt и CLng всегда округляют результат до ближайшего четного числа. Например, 0,5 округляется до 0, а 1,5 — до 2. Функции CInt и CLng отличаются от функций Fix и Int, которые отбрасывают дробную часть числа, а не округляют ее. Кроме того, функции Fix и Int всегда возвращают значение того же типа, что и переданное им выражение.
Для определения возможности преобразования date в дату или время используется функция IsDate. Функция CDate распознает литералы даты и времени, а также некоторые числа, которые находятся в диапазоне допустимых дат. При преобразовании числа в дату преобразуется целая часть числа. Дробная часть преобразуется во время суток, начиная с полуночи.
Функция CDate распознает форматы даты в соответствии с национальной настройкой системы. Если формат передаваемого аргумента не соответствует распознаваемым настройкам даты, функция не сможет определить правильный порядок дней, месяцев и лет. Кроме того, длинный формат даты не распознается, если в нем содержится строка дня недели.
Функция CVDate предназначена для обеспечения совместимости с предыдущими версиями Visual Basic. Синтаксис функции CVDate не отличается от синтаксиса функции CDate; однако функция CVDate возвращает тип Variant, подтипом которого является тип Date, а не собственно тип Date. Поскольку теперь реализован встроенный тип Date, необходимость в функции CVDate отпадает. Такой же результат можно получить, если преобразовать выражение в тип Date и присвоить его типу Variant. Этот способ позволяет преобразовать все прочие встроенные типы в эквивалентные им подтипы Variant.
Функция CDec не возвращает отдельный тип данных. Вместо этого она всегда возвращает результат типа Variant, значение которого преобразовано в подтип Decimal.
Пример функции CBool
В этом примере функция CBool используется для преобразования выражения в тип Boolean. Если выражение разрешается в ненулевое значение, функция CBool возвращает значение True, в противном случае она возвращает значение False.
Пример функции CByte
В этом примере функция CByte используется для преобразования выражения в тип Byte.
Пример функции CCur
В этом примере функция CCur используется для преобразования выражения в тип Currency.
Пример функции CDate
В этом примере функция CDate используется для преобразования выражения в тип Date. Как правило, не рекомендуется определять дату и время в виде строк (как показано в этом примере). Вместо этого рекомендуется использовать литералы даты и времени, такие как #2/12/1969# и #4:45:23 PM# .
Пример функции CDbl
В этом примере функция CDbl используется для преобразования выражения в тип Double.
Пример функции CDec
В этом примере функция CDec используется для преобразования выражения в тип Decimal.
Пример функции CInt
В этом примере функция CInt используется для преобразования выражения в тип Integer.
Пример функции CLng
В этом примере функция CLng используется для преобразования выражения в тип Long.
Пример функции CSng
В этом примере функция CSng используется для преобразования выражения в тип Single.
Пример функции CStr
В этом примере функция CStr используется для преобразования выражения в тип String.
Пример функции CVar
В этом примере функция CVar используется для преобразования выражения в тип Variant.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Метод Application.ConvertFormula (Excel)
Преобразует ссылки на ячейки в формулу между стилями ссылок A1 и R1C1, между относительными и абсолютными ссылками или и тем, и другим. Variant.
Синтаксис
expression. ConvertFormula (Formula, FromReferenceStyle, ToReferenceStyle, ToAbsolute, RelativeTo)
выражение: переменная, представляющая объект Application.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Formula | Обязательный | Variant | Строка, содержащая формулу, которую требуется преобразовать. Это должна быть допустимая формула, и она должна начинаться со знака равенства. |
FromReferenceStyle | Обязательный | XlReferenceStyle | Пример стиля формулы. |
ToReferenceStyle | Необязательный | Variant | Константу XlReferenceStyle , указывающую стиль ссылки, который требуется вернуть. Если этот аргумент опущен, стиль ссылки не изменяется; формула остается в стиле, заданном параметром FromReferenceStyle. |
ToAbsolute | Необязательный | Variant | Константой XlReferenceType , указывающей преобразованный ссылочный тип. Если этот аргумент опущен, ссылочный тип не изменяется. |
RelativeTo | Необязательный | Variant | Объект Range , содержащий одну ячейку. Относительные ссылки относятся к этой ячейке. |
Возвращаемое значение
Примечания
Существует ограничение в 255 символов для формулы.
Пример
В этом примере формула SUM, содержащая ссылки в стиле R1C1, преобразуется в эквивалентную формулу, содержащую ссылки в стиле A1, а затем отображается результат.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Type conversion functions
Each function coerces an expression to a specific data type.
Syntax
- CBool(expression)
- CByte(expression)
- CCur(expression)
- CDate(expression)
- CDbl(expression)
- CDec(expression)
- CInt(expression)
- CLng(expression)
- CLngLng(expression) (Valid on 64-bit platforms only.)
- CLngPtr(expression)
- CSng(expression)
- CStr(expression)
- CVar(expression)
The required expression argument is any string expression or numeric expression.
Return types
The function name determines the return type as shown in the following:
Function | Return type | Range for expression argument |
---|---|---|
CBool | Boolean | Any valid string or numeric expression. |
CByte | Byte | 0 to 255. |
CCur | Currency | -922,337,203,685,477.5808 to 922,337,203,685,477.5807. |
CDate | Date | Any valid date expression. |
CDbl | Double | -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values. |
CDec | Decimal | 79,228,162,514,264,337,593,543,950,335 for zero-scaled numbers, that is, numbers with no decimal places. For numbers with 28 decimal places, the range is 7.9228162514264337593543950335. The smallest possible non-zero number is 0.0000000000000000000000000001. |
CInt | Integer | -32,768 to 32,767; fractions are rounded. |
CLng | Long | -2,147,483,648 to 2,147,483,647; fractions are rounded. |
CLngLng | LongLong | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807; fractions are rounded. (Valid on 64-bit platforms only.) |
CLngPtr | LongPtr | -2,147,483,648 to 2,147,483,647 on 32-bit systems, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 on 64-bit systems; fractions are rounded for 32-bit and 64-bit systems. |
CSng | Single | -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values. |
CStr | String | Returns for CStr depend on the expression argument. |
CVar | Variant | Same range as Double for numerics. Same range as String for non-numerics. |
If the expression passed to the function is outside the range of the data type being converted to, an error occurs.
Conversion functions must be used to explicitly assign LongLong (including LongPtr on 64-bit platforms) to smaller integral types. Implicit conversions of LongLong to smaller integrals are not allowed.
In general, you can document your code using the data-type conversion functions to show that the result of some operation should be expressed as a particular data type rather than the default data type. For example, use CCur to force currency arithmetic in cases where single-precision, double-precision, or integer arithmetic normally would occur.
You should use the data-type conversion functions instead of Val to provide internationally aware conversions from one data type to another. For example, when you use CCur, different decimal separators, different thousand separators, and various currency options are properly recognized depending on the locale setting of your computer.
When the fractional part is exactly 0.5, CInt and CLng always round it to the nearest even number. For example, 0.5 rounds to 0, and 1.5 rounds to 2. CInt and CLng differ from the Fix and Int functions, which truncate, rather than round, the fractional part of a number. Also, Fix and Int always return a value of the same type as is passed in.
Use the IsDate function to determine if date can be converted to a date or time. CDate recognizes date literals and time literals as well as some numbers that fall within the range of acceptable dates. When converting a number to a date, the whole number portion is converted to a date. Any fractional part of the number is converted to a time of day, starting at midnight.
CDate recognizes date formats according to the locale setting of your system. The correct order of day, month, and year may not be determined if it is provided in a format other than one of the recognized date settings. In addition, a long date format is not recognized if it also contains the day-of-the-week string.
A CVDate function is also provided for compatibility with previous versions of Visual Basic. The syntax of the CVDate function is identical to the CDate function; however, CVDate returns a Variant whose subtype is Date instead of an actual Date type. Since there is now an intrinsic Date type, there is no further need for CVDate. The same effect can be achieved by converting an expression to a Date, and then assigning it to a Variant. This technique is consistent with the conversion of all other intrinsic types to their equivalent Variant subtypes.
The CDec function does not return a discrete data type; instead, it always returns a Variant whose value has been converted to a Decimal subtype.
CBool function example
This example uses the CBool function to convert an expression to a Boolean. If the expression evaluates to a nonzero value, CBool returns True, otherwise, it returns False.
CByte function example
This example uses the CByte function to convert an expression to a Byte.
CCur function example
This example uses the CCur function to convert an expression to a Currency.
CDate function example
This example uses the CDate function to convert a string to a Date. In general, hard-coding dates and times as strings (as shown in this example) is not recommended. Use date literals and time literals, such as #2/12/1969# and #4:45:23 PM# , instead.
CDbl function example
This example uses the CDbl function to convert an expression to a Double.
CDec function example
This example uses the CDec function to convert a numeric value to a Decimal.
CInt function example
This example uses the CInt function to convert a value to an Integer.
CLng function example
This example uses the CLng function to convert a value to a Long.
CSng function example
This example uses the CSng function to convert a value to a Single.
CStr function example
This example uses the CStr function to convert a numeric value to a String.
CVar function example
This example uses the CVar function to convert an expression to a Variant.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Преобразовать все данные на листе в значения |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
На чтение 23 мин. Просмотров 18.5k.
Содержание
- Краткое руководство по текстовым функциям
- Введение
- Прочитайте это в первую очередь!
- Добавление строк
- Извлечение части строки
- Поиск в строке
- Удаление пробелов
- Длина строки
- Перевернуть текст
- Сравнение
- Сравнение строк с использованием сопоставления с шаблоном
- Заменить часть строки
- Преобразовать типы в строку (базовый)
- Преобразовать строку в число — CLng, CDbl, Val и т.д.
- Генерация строки элементов — функция строки
- Преобразовать регистр / юникод — StrConv, UCase, LCase
- Использование строк с массивами
- Форматирование строки
- Заключение
Краткое руководство по текстовым функциям
Текстовые операции | Функции |
Добавить две или более строки | Format or «&» |
Построить текст из массива | Join |
Сравнить | StrComp or «=» |
Сравнить — шаблон | Like |
Преобразовать в текст | CStr, Str |
Конвертировать текст в дату | Просто: CDate Дополнительно: Format |
Преобразовать текст в число | Просто: CLng, CInt, CDbl, Val Дополнительно: Format |
Конвертировать в юникод, широкий, узкий | StrConv |
Преобразовать в верхний / нижний регистр | StrConv, UCase, LCase |
Извлечь часть текста | Left, Right, Mid |
Форматировать текст | Format |
Найти символы в тексте | InStr, InStrRev |
Генерация текста | String |
Получить длину строки | Len |
Удалить пробелы | LTrim, RTrim, Trim |
Заменить часть строки | Replace |
Перевернуть строку | StrReverse |
Разобрать строку в массив | Split |
Введение
Использование строк является очень важной частью VBA. Есть много типов манипуляций, которые вы можете делать со строками. К ним относятся такие задачи, как:
- извлечение части строки
- сравнение строк
- преобразование чисел в текст
- форматирование даты для включения дня недели
- найти символ в строке
- удаление пробелов
- парсинг в массив
- и т. д.
Хорошей новостью является то, что VBA содержит множество функций, которые помогут вам легко выполнять эти задачи.
Эта статья содержит подробное руководство по использованию строки в VBA. Он объясняет строки в простых терминах с понятными примерами кода. Изложение в статье поможет легко использовать ее в качестве краткого справочного руководства.
Если вы собираетесь использовать строки часто, я рекомендую вам прочитать первый раздел, так как он относится ко многим функциям. В противном случае вы можете прочитать по порядку или просто перейти в нужный раздел.
Прочитайте это в первую очередь!
Следующие два пункта очень важны при работе со строковыми функциями VBA.
Исходная строка не изменяется
Важно помнить, что строковые функции VBA не изменяют исходную строку. Они возвращают новую строку с изменениями, внесенными функцией. Если вы хотите изменить исходную строку, вы просто назначаете результат исходной строке. См. Раздел «Извлечение части строки» для примеров.
Как использовать Compare
Некоторые строковые функции, такие как StrComp (), Instr () и т.д. имеют необязательный параметр Compare. Он работает следующим образом:
vbTextCompare: верхний и нижний регистры считаются одинаковыми
vbBinaryCompare: верхний и нижний регистр считаются разными
Следующий код использует функцию сравнения строк StrComp () для демонстрации параметра Compare.
Sub Comp1() ' Печатает 0 : Строки совпадают Debug.Print StrComp("АБВ", "абв", vbTextCompare) ' Печатает -1 : Строки не совпадают Debug.Print StrComp("АБВ", "абв", vbBinaryCompare) End Sub
Вы можете использовать параметр Option Compare вместо того, чтобы каждый раз использовать этот параметр. Опция сравнения устанавливается в верхней части модуля. Любая функция, которая использует параметр Compare, примет этот параметр по умолчанию. Два варианта использования Option Compare:
- Oпция Compare Text: делает vbTextCompare аргументом сравнения по умолчанию
Option Compare Text Sub Comp2() ' Соответствие строк - использует vbCompareText в качестве 'аргумента сравнения Debug.Print StrComp("АБВ", "абв") Debug.Print StrComp("ГДЕ", "где") End Sub
- Опция Compare Binary: делает vbBinaryCompare аргументом сравнения по умолчанию.
Option Compare Binary Sub Comp2() ' Строки не совпадают - использует vbCompareBinary в качестве 'аргумента сравнения Debug.Print StrComp("АБВ", "абв") Debug.Print StrComp("ГДЕ", "где") End Sub
Если Option Compare не используется, то по умолчанию используется Option Compare Binary.
Теперь, когда вы понимаете эти два важных момента о строке, мы можем продолжить и посмотреть на строковые функции индивидуально.
Добавление строк
Вы можете добавлять строки, используя оператор &. Следующий код показывает несколько примеров его использования.
Sub Dobavlenie() Debug.Print "АБВ" & "ГДЕ" Debug.Print "Иван" & " " & "Петров" Debug.Print "Длинный " & 22 Debug.Print "Двойной " & 14.99 Debug.Print "Дата " & #12/12/2015# End Sub
В примере вы можете видеть, что различные типы, такие как даты и числа, автоматически преобразуются в строки. Вы можете увидеть оператор +, используемый для добавления строк. Разница в том, что этот оператор будет работать только со строковыми типами. Если вы попытаетесь использовать его с другим типом, вы получите ошибку.
Это даст сообщение об ошибке: «Несоответствие типов» Debug.Print "Длинный " + 22
Если вы хотите сделать более сложное добавление строк, вы можете использовать функцию форматирования, описанную ниже.
Извлечение части строки
Функции, обсуждаемые в этом разделе, полезны при базовом извлечении из строки. Для чего-то более сложного можете посмотреть раздел, как легко извлечь любую строку без использования VBA InStr.
Функция | Параметры | Описание | Пример |
Left | строка, длина | Вернуть символы с левой стороны |
Left(«Иван Петров»,4) |
Right | строка, длина | Вернуть символы с правой стороны |
Right(«Иван Петров»,5) |
Mid | строка, начало, длина | Вернуть символы из середины |
Mid(«Иван Петров»,3,2) |
Функции Left, Right и Mid используются для извлечения частей строки. Это очень простые в использовании функции. Left читает символы слева, Right справа и Mid от указанной вами начальной точки.
Sub IspLeftRightMid() Dim sCustomer As String sCustomer = "Иван Васильевич Петров" Debug.Print Left(sCustomer, 4) ' Печатает: Иван Debug.Print Right(sCustomer, 6) ' Печатает: Петров Debug.Print Left(sCustomer, 15) ' Печатает: Иван Васильевич Debug.Print Right(sCustomer, 17) ' Печатает: Васильевич Петров Debug.Print Mid(sCustomer, 1, 4) ' Печатает: Иван Debug.Print Mid(sCustomer, 6, 10) ' Печатает: Васильевич Debug.Print Mid(sCustomer, 17, 6) ' Печатает: Петров End Sub
Как упоминалось в предыдущем разделе, строковые функции VBA не изменяют исходную строку. Вместо этого они возвращают результат в виде новой строки.
В следующем примере вы увидите, что строка Fullname не была изменена после использования функции Left.
Sub PrimerIspolzovaniyaLeft() Dim Fullname As String Fullname = "Иван Петров" Debug.Print "Имя: "; Left(Fullname, 4) ' Исходная строка не изменилась Debug.Print "Полное имя: "; Fullname End Sub
Если вы хотите изменить исходную строку, вы просто присваиваете ей возвращаемое значение функции.
Sub IzmenenieStroki() Dim name As String name = "Иван Петров" ' Присвойте возвращаемую строку переменной имени name = Left(name, 4) Debug.Print "Имя: "; name End Sub
Поиск в строке
Функция | Параметры | Описание | Пример |
InStr | Текст1, текст2 |
Находит положение текста |
InStr(«Иван Петров»,»в») |
InStrRev | Проверка текста, соответствие текста |
Находит позицию текста с конца |
InStrRev(«Иван Петров»,»в») |
InStr и InStrRev — это функции VBA, используемые для поиска текста в тексте. Если текст поиска найден, возвращается позиция (с начала строки проверки) текста поиска. Когда текст поиска не найден, возвращается ноль. Если какой-либо текст имеет значение null, возвращается значение null.
InStr Описание параметров
InStr() Start[Необязат], String1, String2, Compare[Необязат]
- Start [Необязательно — по умолчанию 1]: это число, указывающее начальную позицию поиска слева
- String1: текст, в котором будем искать
- String2: текст, который будем искать
- Compare как vbCompareMethod: см. Раздел «Сравнить» для получения более подробной информации.
Использование InStr и примеры
InStr возвращает первую позицию в тексте, где найден данный текст. Ниже приведены некоторые примеры его использования.
Sub PoiskTeksta() Dim name As String name = "Иван Петров" ' Возвращает 3 - позицию от первой Debug.Print InStr(name, "а") ' Возвращает 10 - позиция первого "а", начиная с позиции 4 Debug.Print InStr(4, name, "а") ' Возвращает 8 Debug.Print InStr(name, "тр") ' Возвращает 6 Debug.Print InStr(name, "Петров") ' Возвращает 0 - текст "ССС" не найдет Debug.Print InStr(name, "ССС") End Sub
InStrRev Описание параметров
InStrRev() StringCheck, StringMatch, Start[Необязат], Compare[Необязат]
- StringCheck: текст, в котором будем искать
- StringMatch: Текст, который будем искать
- Start [Необязательно — по умолчанию -1]: это число, указывающее начальную позицию поиска справа
- Compare как vbCompareMethod: см. Раздел «Сравнить» для получения более подробной информации.
Использование InStrRev и примеры
Функция InStrRev такая же, как InStr, за исключением того, что она ищет с конца строки. Важно отметить, что возвращаемая позиция является позицией с самого начала. Поэтому, если существует только один экземпляр элемента поиска, InStr () и InStrRev () будут возвращать одно и то же значение.
В следующем коде показаны некоторые примеры использования InStrRev.
Sub IspInstrRev() Dim name As String name = "Иван Петров" ' Обе возвращают 1 - позицию, только И Debug.Print InStr(name, "И") Debug.Print InStrRev(name, "И") ' Возвращает 11 - вторую в Debug.Print InStrRev(name, "в") ' Возвращает 3 - первую в с позиции 9 Debug.Print InStrRev(name, "в", 9) ' Returns 1 Debug.Print InStrRev(name, "Иван") End Sub
Функции InStr и InStrRev полезны при работе с базовым поиском текста. Однако, если вы собираетесь использовать их для извлечения текста из строки, они могут усложнить задачу. Я написал о гораздо лучшем способе сделать это в своей статье Как легко извлечь любой текст без использования VBA InStr.
Удаление пробелов
Функция | Параметры | Описание | Пример |
LTrim | Текст | Убирает пробелы слева |
LTrim(» Иван «) |
RTrim | Текст | Убирает пробелы справа |
RTrim(» Иван «) |
Trim | Текст | Убирает пробелы слева и справа |
Trim(» Иван «) |
Функции Trim — это простые функции, которые удаляют пробелы в начале или конце строки.
Функции и примеры использования триммера Trim
- LTrim удаляет пробелы слева от строки
- RTrim удаляет пробелы справа от строки
- Trim удаляет пробелы слева и справа от строки
Sub TrimStr() Dim name As String name = " Иван Петров " ' Печатает "Иван Петров " Debug.Print LTrim(name) ' Печатает " Иван Петров" Debug.Print RTrim(name) ' Печатает "Иван Петров" Debug.Print Trim(name) End Sub
Длина строки
Функция | Параметры | Описание | Пример |
Len | Текст | Возвращает длину строки |
Len («Иван Петров») |
Len — простая функция при использовании со строкой. Она просто возвращает количество символов, которое содержит строка. Если используется с числовым типом, таким как long, он вернет количество байтов.
Sub IspLen() Dim name As String name = "Иван Петров" ' Печатает 11 Debug.Print Len("Иван Петров") ' Печатает 3 Debug.Print Len("АБВ") ' Печатает 4 с Long - это размер 4 байта Dim total As Long Debug.Print Len(total) End Sub
Перевернуть текст
Функция | Параметры | Описание | Пример |
StrReverse | Текст | Перевернуть текст |
StrReverse («Иван Петров») |
StrReverse — еще одна простая в использовании функция. Он просто возвращает данную строку с обратными символами.
Sub RevStr() Dim s As String s = "Иван Петров" ' Печатает: вортеП навИ Debug.Print StrReverse(s) End Sub
Сравнение
Функция | Параметры | Описание | Пример |
StrComp | Текст1, текст2 | Сравнивает 2 текста |
StrComp («Иван», «Иван») |
Функция StrComp используется для сравнения двух строк. Следующие подразделы описывают, как используется.
Описание параметров
StrComp() String1, String2, Compare[Необязат]
- String1: первая строка для сравнения
- String2: вторая строка для сравнения
- Compare как vbCompareMethod: см. Раздел «Сравнить» для получения более подробной информации.
StrComp Возвращаемые значения
Возвращаемое значение | Описание |
0 | Совпадение строк |
-1 | строка1 меньше строки2 |
1 | строка1 больше строки2 |
Null | если какая-либо строка равна нулю |
Использование и примеры
Ниже приведены некоторые примеры использования функции StrComp.
Sub IspStrComp() ' Возвращает 0 Debug.Print StrComp("АБВ", "АБВ", vbTextCompare) ' Возвращает 1 Debug.Print StrComp("АБВГ", "АБВ", vbTextCompare) ' Возвращает -1 Debug.Print StrComp("АБВ", "АБВГ", vbTextCompare) ' Returns Null Debug.Print StrComp(Null, "АБВГ", vbTextCompare) End Sub
Сравнение строк с использованием операторов
Вы также можете использовать знак равенства для сравнения строк. Разница между сравнением equals и функцией StrComp:
- Знак равенства возвращает только true или false.
- Вы не можете указать параметр Compare, используя знак равенства — он использует настройку «Option Compare».
Ниже приведены некоторые примеры использования equals для сравнения строк.
Option Compare Text Sub CompareIspEquals() ' Возвращает true Debug.Print "АБВ" = "АБВ" ' Возвращает true, потому что «Сравнить текст» установлен выше Debug.Print "АБВ" = "абв" ' Возвращает false Debug.Print "АБВГ" = "АБВ" ' Возвращает false Debug.Print "АБВ" = "АБВГ" ' Возвращает null Debug.Print Null = "АБВГ" End Sub
Сравнение строк с использованием сопоставления с шаблоном
Функция | Параметры | Описание | Пример |
Like | Текст, шаблон | проверяет, имеет ли строка заданный шаблон |
«abX» Like «??X» «54abc5» Like «*abc#» |
Знак | Значение |
? | Любой одиночный символ |
# | Любая однозначная цифра (0-9) |
* | Ноль или более символов |
[charlist] | Любой символ в списке |
[!charlist] | Любой символ не в списке символов |
Сопоставление с шаблоном используется для определения того, имеет ли строка конкретный образец символов. Например, вы можете проверить, что номер клиента состоит из 3 цифр, за которыми следуют 3 алфавитных символа, или в строке есть буквы XX, за которыми следует любое количество символов.
Если строка соответствует шаблону, возвращаемое значение равно true, в противном случае — false.
Сопоставление с образцом аналогично функции формата VBA в том смысле, что его можно использовать практически безгранично. В этом разделе я приведу несколько примеров, которые объяснят, как это работает. Это должно охватывать наиболее распространенные виды использования.
Давайте посмотрим на базовый пример с использованием знаков. Возьмите следующую строку шаблона.
[abc][!def]?#X*
Давайте посмотрим, как работает эта строка
[abc] — символ, который является или a, b или c
[! def] — символ, который не является d, e или f
? любой символ
# — любая цифра
X — символ X
* следуют ноль или более символов
Поэтому следующая строка действительна
apY6X
а — один из символов a,b,c
p — не один из символов d, e или f
Y — любой символ
6 — это цифра
Х — это буква Х
В следующих примерах кода показаны результаты различных строк с этим шаблоном.
Sub Shabloni() ' ИСТИНА Debug.Print 1; "apY6X" Like "[abc][!def]?#X*" ' ИСТИНА - любая комбинация символов после x действительна Debug.Print 2; "apY6Xsf34FAD" Like "[abc][!def]?#X*" ' ЛОЖЬ - символ не из[abc] Debug.Print 3; "dpY6X" Like "[abc][!def]?#X*" ' ЛОЖЬ - 2-й символ e находится в [def] Debug.Print 4; "aeY6X" Like "[abc][!def]?#X*" ' ЛОЖЬ - A в позиции 4 не является цифрой Debug.Print 5; "apYAX" Like "[abc][!def]?#X*" ' ЛОЖЬ - символ в позиции 5 должен быть X Debug.Print 1; "apY6Z" Like "[abc][!def]?#X*" End Sub
Реальный пример сопоставления с образцом
Чтобы увидеть реальный пример использования сопоставления с образцом, ознакомьтесь с Примером 3: Проверьте, допустимо ли имя файла.
Важное примечание о сопоставлении с образцом VBA
Оператор Like использует двоичное или текстовое сравнение на основе параметра Option Compare. Пожалуйста, смотрите раздел Сравнение для более подробной информации.
Заменить часть строки
Функция | Параметры | Описание | Пример |
Replace | строка, найти, заменить, начать, считать, сравнивать |
Заменяет текст | Replace («Ива»,»а»,»ан») |
Replace используется для замены текста в строке другим текстом. Он заменяет все экземпляры текста, найденные по умолчанию.
Replace описание параметров
Replace() Expression, Find, Replace, Start[Необязат], Count[Необязат], Compare[Необязат]
- Expression: текст, в котором нужна замена символов
- Find: текст для замены в строке выражения
- Replace: строка для поиска замены текста поиска
- Start [Необязательно — по умолчанию 1]: начальная позиция в строке
- Count [Необязательно — по умолчанию -1]: количество замен. По умолчанию -1 означает все.
- Compare как vbCompareMethod: см. Раздел «Сравнить» для получения более подробной информации.
Использование и примеры
В следующем коде показаны некоторые примеры использования функции замены.
Sub PrimeriReplace() ' Заменяет все знаки вопроса (?) на точку с запятой (;) Debug.Print Replace("A?B?C?D?E", "?", ";") ' Заменить Петров на Иванов Debug.Print Replace("Евгений Петров,Артем Петров", "Петров", "Иванов") ' Заменить AX на AB Debug.Print Replace("ACD AXC BAX", "AX", "AB") End Sub
На выходе:
A;B;C;D;E
Евгений Иванов,Артем Иванов
ACD ABC BAB
В следующих примерах мы используем необязательный параметр Count. Count определяет количество замен. Так, например, установка Count равной единице означает, что будет заменено только первое вхождение.
Sub ReplaceCount() ' Заменяет только первый знак вопроса Debug.Print Replace("A?B?C?D?E", "?", ";", Count:=1) ' Заменяет первые три знака вопроса Debug.Print Replace("A?B?C?D?E", "?", ";", Count:=3) End Sub
На выходе:
A;B?C?D?E
A;B;C;D?E
Необязательный параметр Start позволяет вам вернуть часть строки. Позиция, которую вы указываете с помощью Start, — это место, откуда начинается возврат строки. Он не вернет ни одной части строки до этой позиции, независимо от того, была ли произведена замена или нет.
Sub ReplacePartial() ' Использовать оригинальную строку из позиции 4 Debug.Print Replace("A?B?C?D?E", "?", ";", Start:=4) ' Используйте оригинальную строку из позиции 8 Debug.Print Replace("AA?B?C?D?E", "?", ";", Start:=8) ' Элемент не заменен, но по-прежнему возвращаются только последние '2 символа Debug.Print Replace("ABCD", "X", "Y", Start:=3) End Sub
На выходе:
;C;D;E
;E
CD
Иногда вы можете заменить только заглавные или строчные буквы. Вы можете использовать параметр Compare для этого. Он используется во многих строковых функциях. Для получения дополнительной информации об этом проверьте раздел сравнения.
Sub ReplaceCase() ' Заменить только заглавные А Debug.Print Replace("AaAa", "A", "X", Compare:=vbBinaryCompare) ' Заменить все А Debug.Print Replace("AaAa", "A", "X", Compare:=vbTextCompare) End Sub
На выходе:
XaXa
XXXX
Многократные замены
Если вы хотите заменить несколько значений в строке, вы можете вкладывать вызовы. В следующем коде мы хотим заменить X и Y на A и B соответственно.
Sub ReplaceMulti() Dim newString As String ' Заменить А на Х newString = Replace("ABCD ABDN", "A", "X") ' Теперь замените B на Y в новой строке newString = Replace(newString, "B", "Y") Debug.Print newString End Sub
В следующем примере мы изменим приведенный выше код для выполнения той же задачи. Мы будем использовать возвращаемое значение первой замены в качестве аргумента для второй замены.
Sub ReplaceMultiNested() Dim newString As String ' Заменить A на X, а B на Y newString = Replace(Replace("ABCD ABDN", "A", "X"), "B", "Y") Debug.Print newString End Sub
Результатом обоих этих Subs является:
XYCD XYDN
Преобразовать типы в строку (базовый)
Этот раздел о преобразовании чисел в строку. Очень важным моментом здесь является то, что в большинстве случаев VBA автоматически конвертируется в строку для вас. Давайте посмотрим на некоторые примеры:
Sub AutoConverts() Dim s As String ' Автоматически преобразует число в строку s = 12.99 Debug.Print s ' Автоматически преобразует несколько чисел в строку s = "ABC" & 6 & 12.99 Debug.Print s ' Автоматически преобразует двойную переменную в строку Dim d As Double, l As Long d = 19.99 l = 55 s = "Значения: " & d & " " & l Debug.Print s End Sub
Когда вы запустите приведенный выше код, вы увидите, что число было автоматически преобразовано в строки. Поэтому, когда вы присваиваете значение строке, VBA будет следить за преобразованием большую часть времени. В VBA есть функции преобразования, и в следующих подразделах мы рассмотрим причины их использования.
Явное преобразование
Функция | Параметры | Описание | Пример |
CStr | выражение | Преобразует числовую переменную в строку |
CStr («45.78») |
Str | число | Преобразует числовую переменную в строку |
Str («45.78») |
В некоторых случаях вы можете захотеть преобразовать элемент в строку без необходимости сначала помещать его в строковую переменную. В этом случае вы можете использовать функции Str или CStr. Оба принимают выражение как функцию, и это может быть любой тип, например long, double, data или boolean.
Давайте посмотрим на простой пример. Представьте, что вы читаете список значений из разных типов ячеек в коллекцию. Вы можете использовать функции Str / CStr, чтобы гарантировать, что они все хранятся в виде строк. Следующий код показывает пример этого:
Sub IspStr() Dim coll As New Collection Dim c As Range ' Считать значения ячеек в коллекцию For Each c In Range("A1:A10") ' Используйте Str для преобразования значения ячейки в строку coll.Add Str(c) Next ' Распечатайте значения и тип коллекции Dim i As Variant For Each i In coll Debug.Print i, TypeName(i) Next End Sub
В приведенном выше примере мы используем Str для преобразования значения ячейки в строку. Альтернативой этому может быть присвоение значения строке, а затем присвоение строки коллекции. Итак, вы видите, что использование Str здесь намного эффективнее.
Multi Region
Разница между функциями Str и CStr заключается в том, что CStr преобразует в зависимости от региона. Если ваши макросы будут использоваться в нескольких регионах, вам нужно будет использовать CStr для преобразования строк.
Хорошей практикой является использование CStr при чтении значений из ячеек. Если ваш код в конечном итоге используется в другом регионе, вам не нужно вносить какие-либо изменения, чтобы он работал правильно.
Преобразовать строку в число — CLng, CDbl, Val и т.д.
Функция | Возвращает | Пример |
CBool | Boolean | CBool(«True»), CBool(«0») |
CCur | Currency | CCur(«245.567») |
CDate | Date | CDate(«1/1/2019») |
CDbl | Double | CDbl(«245.567») |
CDec | Decimal | CDec(«245.567») |
CInt | Integer | CInt(«45») |
CLng | Long Integer | CLng(«45.78») |
CVar | Variant | CVar(«») |
Вышеуказанные функции используются для преобразования строк в различные типы. Если вы присваиваете переменную этого типа, VBA выполнит преобразование автоматически.
Sub StrToNumeric() Dim l As Long, d As Double, c As Currency Dim s As String s = "45.923239" l = s d = s c = s Debug.Print "Long is "; l Debug.Print "Double is "; d Debug.Print "Currency is "; c End Sub
Использование типов преобразования дает большую гибкость. Это означает, что вы можете определить тип во время выполнения. В следующем коде мы устанавливаем тип на основе аргумента sType, передаваемого в функцию PrintValue. Поскольку этот тип может быть прочитан из внешнего источника, такого как ячейка, мы можем установить тип во время выполнения. Если мы объявим переменную как Long, то при выполнении кода она всегда будет длинной.
Sub Test() ' Печатает 46 PrintValue "45.56", "Long" ' Печатает 45.56 PrintValue "45.56", "" End Sub Sub PrintValue(ByVal s As String, ByVal sType As String) Dim value ' Установите тип данных на основе строки типа If sType = "Long" Then value = CLng(s) Else value = CDbl(s) End If Debug.Print "Type is "; TypeName(value); value End Sub
Если строка не является допустимым числом (т.е. Содержит символы, другие цифры), вы получаете ошибку «Несоответствие типов».
Sub InvalidNumber() Dim l As Long ' Даст ошибку несоответствия типов l = CLng("45A") End Sub
Функция Val
Функция преобразует числовые части строки в правильный тип числа.
Val преобразует первые встреченные числа. Как только он встречает буквы в строке, он останавливается. Если есть только буквы, то в качестве значения возвращается ноль. Следующий код показывает некоторые примеры использования Val
Sub IspVal() ' Печатает 45 Debug.Print Val("45 Новая улица") ' Печатает 45 Debug.Print Val(" 45 Новая улица") ' Печатает 0 Debug.Print Val("Новая улица 45") ' Печатает 12 Debug.Print Val("12 f 34") End Sub
Val имеет два недостатка
- Не мультирегиональный — Val не распознает международные версии чисел, такие как запятые вместо десятичных. Поэтому вы должны использовать вышеуказанные функции преобразования, когда ваше приложение будет использоваться в нескольких регионах.
- Преобразует недопустимые строки в ноль — в некоторых случаях это может быть нормально, но в большинстве случаев лучше, если неверная строка вызывает ошибку. Затем приложение осознает наличие проблемы и может действовать соответствующим образом. Функции преобразования, такие как CLng, вызовут ошибку, если строка содержит нечисловые символы.
Генерация строки элементов — функция строки
Функция | Параметры | Описание | Пример |
String | число, символ | Преобразует числовую переменную в строку |
String (5,»*») |
Функция String используется для генерации строки повторяющихся символов. Первый аргумент — это количество повторений, второй аргумент — символ.
Sub IspString() ' Печатает: AAAAA Debug.Print String(5, "A") ' Печатает: >>>>> Debug.Print String(5, 62) ' Печатает: (((ABC))) Debug.Print String(3, "(") & "ABC" & String(3, ")") End Sub
Преобразовать регистр / юникод — StrConv, UCase, LCase
Функция | Параметры | Описание | Пример |
StrConv | строка, преобразование, LCID |
Преобразует строку |
StrConv(«abc»,vbUpperCase) |
Если вы хотите преобразовать регистр строки в верхний или нижний регистр, вы можете использовать функции UCase и LCase для верхнего и нижнего соответственно. Вы также можете использовать функцию StrConv с аргументом vbUpperCase или vbLowerCase. В следующем коде показан пример использования этих трех функций.
Sub ConvCase() Dim s As String s = "У Мэри был маленький ягненок" ' верхний Debug.Print UCase(s) Debug.Print StrConv(s, vbUpperCase) ' нижний Debug.Print LCase(s) Debug.Print StrConv(s, vbLowerCase) ' Устанавливает первую букву каждого слова в верхний регистр Debug.Print StrConv(s, vbProperCase) End Sub
На выходе:
У МЭРИ БЫЛ МАЛЕНЬКИЙ ЯГНЕНОК
У МЭРИ БЫЛ МАЛЕНЬКИЙ ЯГНЕНОК
у мэри был маленький ягненок
у мэри был маленький ягненок
У Мэри Был Маленький Ягненок
Другие преобразования
Как и в случае, StrConv может выполнять другие преобразования на основе параметра Conversion. В следующей таблице приведен список различных значений параметров и того, что они делают. Для получения дополнительной информации о StrConv проверьте страницу MSDN.
Постоянные | Преобразует | Значение |
vbUpperCase | 1 | в верхний регистр |
vbLowerCase | 2 | в нижнем регистре |
vbProperCase | 3 | первая буква каждого слова в верхнем регистре |
vbWide* | 4 | от узкого к широкому |
vbNarrow* | 8 | от широкого к узкому |
vbKatakana** | 16 | из Хираганы в Катакану |
vbHiragana | 32 | из Катаканы в Хирагану |
vbUnicode | 64 | в юникод |
vbFromUnicode | 128 | из юникода |
Использование строк с массивами
Функция | Параметры | Описание | Пример |
Split | выражение, разделитель, ограничить, сравнить |
Разбирает разделенную строку в массив |
arr = Split(«A;B;C»,»;») |
Join | исходный массив, разделитель |
Преобразует одномерный массив в строку |
s = Join(Arr, «;») |
Строка в массив с использованием Split
Вы можете легко разобрать строку с разделителями в массив. Вы просто используете функцию Split с разделителем в качестве параметра. Следующий код показывает пример использования функции Split.
Sub StrToArr() Dim arr() As String ' Разобрать строку в массив arr = Split("Иван,Анна,Павел,София", ",") Dim name As Variant For Each name In arr Debug.Print name Next End Sub
На выходе:
Иван
Анна
Павел
София
Если вы хотите увидеть некоторые реальные примеры использования Split, вы найдете их в статье Как легко извлечь любую строку без использования VBA InStr.
Массив в строку, используя Join
Если вы хотите построить строку из массива, вы можете легко это сделать с помощью функции Join. По сути, это обратная функция Split. Следующий код предоставляет пример использования Join
Sub ArrToStr() Dim Arr(0 To 3) As String Arr(0) = "Иван" Arr(1) = "Анна" Arr(2) = "Павел" Arr(3) = "София" ' Построить строку из массива Dim sNames As String sNames = Join(Arr, ",") Debug.Print sNames End Sub
На выходе:
Иван, Анна, Павел, София
Форматирование строки
Функция | Параметры | Описание | Пример |
Format | выражение, формат, firstdayofweek, firstweekofyear |
Форматирует строку |
Format(0.5, «0.00%») |
Функция Format используется для форматирования строки на основе заданных инструкций. В основном используется для размещения даты или числа в определенном формате. Приведенные ниже примеры показывают наиболее распространенные способы форматирования даты.
Sub FormatDate() Dim s As String s = "31/12/2019 10:15:45" ' Печатает: 31 12 19 Debug.Print Format(s, "DD MM YY") ' Печатает: Thu 31 Dec 2019 Debug.Print Format(s, "DDD DD MMM YYYY") ' Печатает: Thursday 31 December 2019 Debug.Print Format(s, "DDDD DD MMMM YYYY") ' Печатает: 10:15 Debug.Print Format(s, "HH:MM") ' Печатает: 10:15:45 AM Debug.Print Format(s, "HH:MM:SS AM/PM") End Sub
В следующих примерах представлены некоторые распространенные способы форматирования чисел.
Sub FormatNumbers() ' Печатает: 50.00% Debug.Print Format(0.5, "0.00%") ' Печатает: 023.45 Debug.Print Format(23.45, "00#.00") ' Печатает: 23,000 Debug.Print Format(23000, "##,000") ' Печатает: 023,000 Debug.Print Format(23000, "0##,000") ' Печатает: $23.99 Debug.Print Format(23.99, "$#0.00") End Sub
Функция «Формат» — довольно обширная тема, и она может самостоятельно занять всю статью. Если вы хотите получить больше информации, то страница формата MSDN предоставляет много информации.
Полезный совет по использованию формата
Быстрый способ выяснить используемое форматирование — использовать форматирование ячеек на листе Excel. Например, добавьте число в ячейку. Затем щелкните правой кнопкой мыши и отформатируйте ячейку так, как вам нужно. Если вы довольны форматом, выберите «Пользовательский» в списке категорий слева. При выборе этого вы можете увидеть строку формата в текстовом поле типа. Это формат строки, который вы можете использовать в VBA.
Заключение
Практически в любом типе программирования вы потратите много времени на манипулирование строками. В этой статье рассматриваются различные способы использования строк в VBA.
Чтобы получить максимальную отдачу, используйте таблицу вверху, чтобы найти тип функции, которую вы хотите использовать. Нажав на левую колонку этой функции, вы попадете в этот раздел.
Если вы новичок в строках в VBA, то я предлагаю вам ознакомиться с разделом «Прочтите это в первую очередь» перед использованием любой из функций.
This is somewhat a continuation on my previous post VBA – Convert XLS to XLSX in which I provided a simple little procedure to upgrade an older xls file to the newer xlsx file format.
I thought to myself, would it be nice to have a more versatile function that could migrate between various other common file formats.
So I set out to take my original function and transform it to enable to user to specify the desired output format and came up with a nice function that enabled anyone to converts Excel compatible files to another Excel compatible format.
Then I said to myself, it must be possible to do something similar for Word and set out to create a function that would enable people to convert file between the various Word compatible formats.
Below are the 2 functions I came up with.
Excel File Format Conversion Function
The following function can be used to convert files between:
- csv -> xlsx
- xls -> xlsx
- xls -> xlsm
- xls -> txt
- xlsx -> txt
- xlsx -> csv
- and so on…
Enum XlFileFormat 'Ref: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlfileformat-enumeration-excel xlAddIn = 18 'Microsoft Excel 97-2003 Add-In *.xla xlAddIn8 = 18 'Microsoft Excel 97-2003 Add-In *.xla xlCSV = 6 'CSV *.csv xlCSVMac = 22 'Macintosh CSV *.csv xlCSVMSDOS = 24 'MSDOS CSV *.csv xlCSVWindows = 23 'Windows CSV *.csv xlCurrentPlatformText = -4158 'Current Platform Text *.txt xlDBF2 = 7 'Dbase 2 format *.dbf xlDBF3 = 8 'Dbase 3 format *.dbf xlDBF4 = 11 'Dbase 4 format *.dbf xlDIF = 9 'Data Interchange format *.dif xlExcel12 = 50 'Excel Binary Workbook *.xlsb xlExcel2 = 16 'Excel version 2.0 (1987) *.xls xlExcel2FarEast = 27 'Excel version 2.0 far east (1987) *.xls xlExcel3 = 29 'Excel version 3.0 (1990) *.xls xlExcel4 = 33 'Excel version 4.0 (1992) *.xls xlExcel4Workbook = 35 'Excel version 4.0. Workbook format (1992) *.xlw xlExcel5 = 39 'Excel version 5.0 (1994) *.xls xlExcel7 = 39 'Excel 95 (version 7.0) *.xls xlExcel8 = 56 'Excel 97-2003 Workbook *.xls xlExcel9795 = 43 'Excel version 95 and 97 *.xls xlHtml = 44 'HTML format *.htm; *.html xlIntlAddIn = 26 'International Add-In No file extension xlIntlMacro = 25 'International Macro No file extension xlOpenDocumentSpreadsheet = 60 'OpenDocument Spreadsheet *.ods xlOpenXMLAddIn = 55 'Open XML Add-In *.xlam xlOpenXMLStrictWorkbook = 61 '(&;H3D) Strict Open XML file *.xlsx xlOpenXMLTemplate = 54 'Open XML Template *.xltx xlOpenXMLTemplateMacroEnabled = 53 'Open XML Template Macro Enabled *.xltm xlOpenXMLWorkbook = 51 'Open XML Workbook *.xlsx xlOpenXMLWorkbookMacroEnabled = 52 'Open XML Workbook Macro Enabled *.xlsm xlSYLK = 2 'Symbolic Link format *.slk xlTemplate = 17 'Excel Template format *.xlt xlTemplate8 = 17 ' Template 8 *.xlt xlTextMac = 19 'Macintosh Text *.txt xlTextMSDOS = 21 'MSDOS Text *.txt xlTextPrinter = 36 'Printer Text *.prn xlTextWindows = 20 'Windows Text *.txt xlUnicodeText = 42 'Unicode Text No file extension; *.txt xlWebArchive = 45 'Web Archive *.mht; *.mhtml xlWJ2WD1 = 14 'Japanese 1-2-3 *.wj2 xlWJ3 = 40 'Japanese 1-2-3 *.wj3 xlWJ3FJ3 = 41 'Japanese 1-2-3 format *.wj3 xlWK1 = 5 'Lotus 1-2-3 format *.wk1 xlWK1ALL = 31 'Lotus 1-2-3 format *.wk1 xlWK1FMT = 30 'Lotus 1-2-3 format *.wk1 xlWK3 = 15 'Lotus 1-2-3 format *.wk3 xlWK3FM3 = 32 'Lotus 1-2-3 format *.wk3 xlWK4 = 38 'Lotus 1-2-3 format *.wk4 xlWKS = 4 'Lotus 1-2-3 format *.wks xlWorkbookDefault = 51 'Workbook default *.xlsx xlWorkbookNormal = -4143 'Workbook normal *.xls xlWorks2FarEast = 28 'Microsoft Works 2.0 far east format *.wks xlWQ1 = 34 'Quattro Pro format *.wq1 xlXMLSpreadsheet = 46 'XML Spreadsheet *.xml End Enum '--------------------------------------------------------------------------------------- ' Procedure : XLS_ConvertFileFormat ' Author : Daniel Pineault, CARDA Consultants Inc. ' Website : http://www.cardaconsultants.com ' Purpose : Converts an Excel compatible file format to another format ' Copyright : The following is release as Attribution-ShareAlike 4.0 International ' (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/ ' Req'd Refs: Uses Late Binding, so none required ' ' Input Variables: ' ~~~~~~~~~~~~~~~~ ' sOrigFile : String - Original file path, name and extension to be converted ' lNewFileFormat: New File format to save the original file as ' bDelOrigFile : True/False - Should the original file be deleted after the conversion ' ' Usage: ' ~~~~~~ ' Convert an xls file into a txt file and delete the xls once completed ' Call XLS_ConvertFileFormat("C:TempTest.xls", xlTextWindows) ' Convert an xls file into a xlsx file and NOT delete the xls once completed ' Call XLS_ConvertFileFormat("C:TempTest.xls", False) ' Convert a csv file into a xlsx file and delete the xls once completed ' Call XLS_ConvertFileFormat("C:TempTest.csv", xlWorkbookDefault, True) ' ' Revision History: ' Rev Date(yyyy/mm/dd) Description ' ************************************************************************************** ' 1 2018-02-27 Initial Release ' 2 2020-12-31 Fixed typo xlDBF24 -> xlDBF4 '--------------------------------------------------------------------------------------- Function XLS_ConvertFileFormat(ByVal sOrigFile As String, _ Optional lNewFileFormat As XlFileFormat = xlOpenXMLWorkbook, _ Optional bDelOrigFile As Boolean = False) As Boolean '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library #Const EarlyBind = False 'Use Late Binding #If EarlyBind = True Then 'Early Binding Declarations Dim oExcel As Excel.Application Dim oExcelWrkBk As Excel.Workbook #Else 'Late Binding Declaration/Constants Dim oExcel As Object Dim oExcelWrkBk As Object #End If Dim bExcelOpened As Boolean Dim sOrigFileExt As String Dim sNewXLSFileExt As String 'Determine the file extension associated with the requested file format 'for properly renaming the output file Select Case lNewFileFormat Case xlAddIn, xlAddIn8 sNewFileExt = ".xla" Case xlCSV, xlCSVMac, xlCSVMSDOS, xlCSVWindows sNewFileExt = ".csv" Case xlCurrentPlatformText, xlTextMac, xlTextMSDOS, xlTextWindows, xlUnicodeText sNewFileExt = ".txt" Case xlDBF2, xlDBF3, xlDBF4 sNewFileExt = ".dbf" Case xlDIF sNewFileExt = ".dif" Case xlExcel12 = 50 'Excel Binary Workbook *.xlsb sNewFileExt = ".xlsb" Case xlExcel2, xlExcel2FarEast, xlExcel3, xlExcel4, xlExcel5, xlExcel7, _ xlExcel8, xlExcel9795, xlWorkbookNormal sNewFileExt = ".xls" Case xlExcel4Workbook = 35 'Excel version 4.0. Workbook format (1992) *.xlw sNewFileExt = ".xlw" Case xlHtml = 44 'HTML format *.htm; *.html sNewFileExt = ".html" Case xlIntlAddIn, xlIntlMacro sNewFileExt = "" Case xlOpenDocumentSpreadsheet 'OpenDocument Spreadsheet *.ods sNewFileExt = ".ods" Case xlOpenXMLAddIn 'Open XML Add-In *.xlam sNewFileExt = ".xlam" Case xlOpenXMLStrictWorkbook, xlOpenXMLWorkbook, xlWorkbookDefault = 51 sNewFileExt = ".xlsx" Case xlOpenXMLTemplate 'Open XML Template *.xltx sNewFileExt = ".xltx" Case xlOpenXMLTemplateMacroEnabled 'Open XML Template Macro Enabled *.xltm sNewFileExt = ".xltm" Case xlOpenXMLWorkbookMacroEnabled 'Open XML Workbook Macro Enabled *.xlsm sNewFileExt = ".xlsm" Case xlSYLK 'Symbolic Link format *.slk sNewFileExt = ".slk" Case xlTemplate, xlTemplate8 ' Template 8 *.xlt sNewFileExt = ".xlt" Case xlTextPrinter 'Printer Text *.prn sNewFileExt = ".prn" Case xlWebArchive 'Web Archive *.mht; *.mhtml sNewFileExt = ".mhtml" Case xlWJ2WD1 'Japanese 1-2-3 *.wj2 sNewFileExt = ".wj2" Case xlWJ3, xlWJ3FJ3 'Japanese 1-2-3 format *.wj3 sNewFileExt = ".wj3" Case xlWK1, xlWK1ALL, xlWK1FMT 'Lotus 1-2-3 format *.wk1 sNewFileExt = ".wk1" Case xlWK3, xlWK3FM3 'Lotus 1-2-3 format *.wk3 sNewFileExt = ".wk3" Case xlWK4 'Lotus 1-2-3 format *.wk4 sNewFileExt = ".wk4" Case xlWKS, xlWorks2FarEast 'Lotus 1-2-3 format *.wks sNewFileExt = ".wks" Case xlWQ1 'Quattro Pro format *.wq1 sNewFileExt = ".wq1" Case xlXMLSpreadsheet 'XML Spreadsheet *.xml sNewFileExt = ".xml" End Select 'Determine the original file's extension for properly renaming the output file sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, ".")) 'Start Excel On Error Resume Next Set oExcel = GetObject(, "Excel.Application") 'Bind to existing instance of Excel If Err.Number <> 0 Then 'Could not get instance of Excel, so create a new one Err.Clear On Error GoTo Error_Handler Set oExcel = CreateObject("Excel.Application") Else 'Excel was already running bExcelOpened = True End If On Error GoTo Error_Handler oExcel.ScreenUpdating = False oExcel.Visible = False 'Keep Excel hidden until we are done with our manipulation Set oExcelWrkBk = oExcel.Workbooks.Open(sOrigFile) 'Open the original file 'Save it as the requested new file format oExcelWrkBk.SaveAS Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat, , , , False XLS_ConvertFileFormat = True 'Report back that we managed to save the file in the new format oExcelWrkBk.Close False 'Close the workbook If bExcelOpened = False Then oExcel.Quit 'Quit Excel only if we started it Else oExcel.ScreenUpdating = True oExcel.Visible = True End If If bDelOrigFile = True Then Kill (sOrigFile) 'Delete the original file if requested Error_Handler_Exit: On Error Resume Next Set oExcelWrkBk = Nothing Set oExcel = Nothing Exit Function Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Source: XLS_ConvertFileFormat" & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" oExcel.ScreenUpdating = True oExcel.Visible = True 'Make excel visible to the user Resume Error_Handler_Exit End Function
Word File Format Conversion Function
The following function can be used to convert files between:
- doc -> docx
- docx -> dotx
- docx -> pdf
- docx -> html
- and so on…
Enum WdSaveFormat 'Ref: https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdsaveformat-enumeration-word wdFormatDocument = 0 'Microsoft Office Word 97 - 2003 binary file format. wdFormatDOSText = 4 'Microsoft DOS text format. *.txt wdFormatDOSTextLineBreaks = 5 'Microsoft DOS text with line breaks preserved. *.txt wdFormatEncodedText = 7 'Encoded text format. *.txt wdFormatFilteredHTML = 10 'Filtered HTML format. wdFormatFlatXML = 19 'Open XML file format saved as a single XML file. ' wdFormatFlatXML = 20 'Open XML file format with macros enabled saved as a single XML file. wdFormatFlatXMLTemplate = 21 'Open XML template format saved as a XML single file. wdFormatFlatXMLTemplateMacroEnabled = 22 'Open XML template format with macros enabled saved as a single XML file. wdFormatOpenDocumentText = 23 'OpenDocument Text format. *.odt wdFormatHTML = 8 'Standard HTML format. *.html wdFormatRTF = 6 'Rich text format (RTF). *.rtf wdFormatStrictOpenXMLDocument = 24 'Strict Open XML document format. wdFormatTemplate = 1 'Word template format. wdFormatText = 2 'Microsoft Windows text format. *.txt wdFormatTextLineBreaks = 3 'Windows text format with line breaks preserved. *.txt wdFormatUnicodeText = 7 'Unicode text format. *.txt wdFormatWebArchive = 9 'Web archive format. wdFormatXML = 11 'Extensible Markup Language (XML) format. *.xml wdFormatDocument97 = 0 'Microsoft Word 97 document format. *.doc wdFormatDocumentDefault = 16 'Word default document file format. For Word, this is the DOCX format. *.docx wdFormatPDF = 17 'PDF format. *.pdf wdFormatTemplate97 = 1 'Word 97 template format. wdFormatXMLDocument = 12 'XML document format. wdFormatXMLDocumentMacroEnabled = 13 'XML document format with macros enabled. wdFormatXMLTemplate = 14 'XML template format. wdFormatXMLTemplateMacroEnabled = 15 'XML template format with macros enabled. wdFormatXPS = 18 'XPS format. *.xps End Enum '--------------------------------------------------------------------------------------- ' Procedure : Word_ConvertFileFormat ' Author : Daniel Pineault, CARDA Consultants Inc. ' Website : http://www.cardaconsultants.com ' Purpose : Converts a Word compatible file format to another format ' Copyright : The following is release as Attribution-ShareAlike 4.0 International ' (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/ ' Req'd Refs: Uses Late Binding, so none required ' ' Input Variables: ' ~~~~~~~~~~~~~~~~ ' sOrigFile : String - Original file path, name and extension to be converted ' lNewFileFormat: New File format to save the original file as ' bDelOrigFile : True/False - Should the original file be deleted after the conversion ' ' Usage: ' ~~~~~~ ' Convert a doc file into a docx file but retain the original copy ' Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF) ' Convert a doc file into a docx file and delete the original doc once converted ' Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF, True) ' ' Revision History: ' Rev Date(yyyy/mm/dd) Description ' ************************************************************************************** ' 1 2018-02-27 Initial Release '--------------------------------------------------------------------------------------- Function Word_ConvertFileFormat(ByVal sOrigFile As String, _ Optional lNewFileFormat As WdSaveFormat = wdFormatDocumentDefault, _ Optional bDelOrigFile As Boolean = False) As Boolean '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library #Const EarlyBind = False 'Use Late Binding #If EarlyBind = True Then 'Early Binding Declarations Dim oWord As Word.Application Dim oDoc As Word.Document #Else 'Late Binding Declaration/Constants Dim oWord As Object Dim oDoc As Object #End If Dim bWordOpened As Boolean Dim sOrigFileExt As String Dim sNewFileExt As String 'Determine the file extension associated with the requested file format 'for properly renaming the output file Select Case lNewFileFormat Case wdFormatDocument sNewFileExt = "." Case wdFormatDOSText, wdFormatDOSTextLineBreaks, wdFormatEncodedText, wdFormatOpenDocumentText, wdFormatText, wdFormatTextLineBreaks, wdFormatUnicodeText sNewFileExt = ".txt" Case wdFormatFilteredHTML, wdFormatHTML sNewFileExt = ".html" Case wdFormatFlatXML, wdFormatXML, wdFormatXMLDocument sNewFileExt = ".xml" Case wdFormatFlatXMLTemplate sNewFileExt = "." Case wdFormatFlatXMLTemplateMacroEnabled sNewFileExt = "." Case wdFormatRTF sNewFileExt = ".rtf" Case wdFormatStrictOpenXMLDocument sNewFileExt = "." Case wdFormatTemplate sNewFileExt = "." Case wdFormatWebArchive sNewFileExt = "." Case wdFormatDocument97 sNewFileExt = ".doc" Case wdFormatDocumentDefault sNewFileExt = ".docx" Case wdFormatPDF sNewFileExt = ".pdf" Case wdFormatTemplate97 sNewFileExt = "." Case wdFormatXMLDocumentMacroEnabled sNewFileExt = ".docm" Case wdFormatXMLTemplate sNewFileExt = ".doct" Case wdFormatXMLTemplateMacroEnabled sNewFileExt = "." Case wdFormatXPS sNewFileExt = ".xps" End Select 'Determine the original file's extension for properly renaming the output file sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, ".")) 'Start Excel On Error Resume Next Set oWord = GetObject(, "Word.Application") 'Bind to existing instance of Word If Err.Number <> 0 Then 'Could not get instance of Word, so create a new one Err.Clear On Error GoTo Error_Handler Set oWord = CreateObject("Word.Application") Else 'Word was already running bWordOpened = True End If On Error GoTo Error_Handler oWord.Visible = False 'Keep Word hidden until we are done with our manipulation Set oDoc = oWord.Documents.Open(sOrigFile) 'Open the original file 'Save it as the requested new file format oDoc.SaveAs2 Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat Word_ConvertFileFormat = True 'Report back that we managed to save the file in the new format oDoc.Close False 'Close the document If bWordOpened = False Then oWord.Quit 'Quit Word only if we started it Else oWord.Visible = True 'Since it was already open, ensure it is visible End If If bDelOrigFile = True Then Kill (sOrigFile) 'Delete the original file if requested Error_Handler_Exit: On Error Resume Next Set oDoc = Nothing Set oWord = Nothing Exit Function Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Source: XLS_ConvertFileFormat" & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" oWord.Visible = True 'Make excel visible to the user Resume Error_Handler_Exit End Function
Missing File Extensions
Unlike the Excel function, the Word function is currently missing some of the file extensions. I created the general framework, but could not easily find the associated file extensions to some of the file format. You need only complete the missing entry and it will work. So simply update the
sNewFileExt = "."
entries as applicable.