Преобразование текста в число с помощью кода VBA Excel. Массовое преобразование чисел из текстового формата в числовой в заданном диапазоне.
Преобразование текста в число
Преобразование чисел, записанных как текст, в числовой формат осуществляется в VBA Excel с помощью функций преобразования типов данных. Числа в текстовом формате могут быть получены из:
- ячеек рабочего листа с текстовым форматом;
- элементов управления формы (TextBox, ListBox, ComboBox);
- строковых переменных;
- выражений, возвращающих число в виде текста;
- текстового поля функции InputBox.
В большинстве случаев VBA Excel сам распознает текст как число без всяких преобразований:
Sub Primer1() Debug.Print 23.1254 * 5.2 ‘Результат: 120,25208 Debug.Print «23,1254» * «5,2» ‘Результат: 120,25208 Debug.Print TypeName(«23,1254») ‘Результат: String Debug.Print TypeName(CDbl(«23,1254»)) ‘Результат: Double End Sub |
Обратите внимание на разделитель дробной части.
Преобразование смешанной строки
Преобразование в число строки, в начале которой имеются цифры, а далее идут другие символы, осуществляется в VBA Excel с помощью функции Val. Из других символов распознается только точка (.) в качестве разделителя дробной части.
Sub Primer2() Debug.Print Val(«021.36abcde») ‘Результат: 21,36 Debug.Print Format(Val(«021.36abcde»), «000.0») ‘Результат: 021,4 End Sub |
Массовое преобразование чисел
Иногда требуется массовое преобразование чисел из текстового формата в числовой в заданном диапазоне рабочего листа.
Пример преобразования диапазона ячеек с текстовым форматом в общий формат и значений ячеек из строки в число на примере объекта Selection:
Sub Primer3() Dim MyCell As Range Selection.NumberFormat = «General» For Each MyCell In Selection If IsNumeric(MyCell) Then MyCell = MyCell * 1 Next End Sub |
Сначала выбранному диапазону присваивается общий формат ("General"
). Но текстовые значения в ячейках еще не преобразовались в числа. Обходим циклом все ячейки диапазона, и, если текстовое значение ячейки можно интерпретировать как число, умножаем это значение на единицу. После этого текст будет преобразован в число.
Numeric values are defined by data types like integer or byte. These data types are used for optimizing the processing and memory allocation in Excel. In this guide, we’re going to show you how to convert string into number in Excel VBA.
Download Workbook
Data types in VBA
Like in some other programming languages, VBA uses data types to identify what variables it can store and how they are stored. Most of the data types in VBA define numeric values. Here is a brief list of numeric data types:
Data type | Storage | Range |
Byte | 1 byte | 0 to 255 |
Integer | 2 bytes | -32,768 to 32,767 |
Long | 4 bytes | -2,147,483,648 to 2,147,483,647 |
Single | 4 bytes | -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values |
Double | 8 bytes | -1.79769313486231E308 to-4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values |
LongLong | 8 bytes |
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Valid on 64-bit platforms only. |
Currency | 8 bytes | -922,337,203,685,477.5808 to 922,337,203,685,477.5807 |
Decimal | 14 bytes | +/-79,228,162,514,264,337,593,543,950,335 with no decimal point; +/-7.9228162514264337593543950335 with 28 places to the right of the decimal |
Since there are many numeric data types, there are many functions to convert a string into number in Excel VBA.
Functions to a convert string into number in Excel VBA
All conversion functions use the same syntax: Each requires a single string argument to convert into a number. For example:
Each function returns an error If the string argument either is not a numeric or is outside the range of the data type being converted.
CInt(«A») returns a type mismatch error, because the «A» is not a numeric value.
CByte(«1250») returns an overflow exception.
Function | Return type | Example |
CByte | Byte | CByte(«65.75») returns 66 |
CCur | Currency | CCur(«$256,000.50») returns 256000.5 |
CDbl | Double | CDbl(128.239856 * 4.8 * 0.04) returns 24.622052352 |
CDec | Decimal | CDec(«15000000.5678») returns 15000000.5678 |
CInt | Integer | CInt(«1234.56») returns 1235 |
CLng | Long | CLng(«1,500,000.88») returns 15000001 |
CLngLng | LongLong | CLngLng(«1,250,500,000.88») returns 1250500001 |
CSng | Single | CSng(«5.67854») returns 5.67854 |
Bonus: Use IsNumeric function to verify value
To avoid type mismatch errors, you can use the IsNumeric function to check if the expression is numeric or not. The function returns Boolean value based on the expression. TRUE if the expression is numeric, FALSE otherwise.
Here is a sample function that can check the data first, and convert the it into an integer if it is numeric. If the argument is not a valid number, the function returns 0.
Function ConvertInt(arg As String) As Integer If IsNumeric(arg) Then ConvertInt = CInt(arg) End Function
NURLAN Пользователь Сообщений: 4 |
Здравствуйте уважаемые коллеги. Помогите, пожалуйста, решить следующий вопрос: Cells(1, 1).Select Указанный код макроса меняет формат ячеек, но при дальнейшем использовании этих данных в свободной таблицы, расчет значений не производиться так как сами значения не преобразованы в числовой формат. |
GIG_ant Пользователь Сообщений: 3102 |
Если хотите именно макросом, сделайте так: With Cells(1, 1) |
vigor Пользователь Сообщений: 172 |
Если без макроса, то вставляем 1 в ячейку, копируем, а потом спецвставкой, з параметром умножить и вся любовь.Очень полезная штука |
NURLAN Пользователь Сообщений: 4 |
{quote}{login=GIG_ant}{date=01.07.2011 04:59}{thema=}{post} With Cells(1, 1) Помогло! Как теперь сделать если не одну ячейку, а почти весь столбец. Range(Cells(2, col), Cells(lLastRow, col)).Select {/post}{/quote} |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Если без цикла, то спец.вставкой: |
Муля Пользователь Сообщений: 307 |
Доброго дня всем! Function Число() Выдает ошибку значение. |
ran Пользователь Сообщений: 7091 |
For Each objCell In objRange |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Это вообще не функция. Обзовите ее sub. Функция должна возвращать значение. Я сам — дурнее всякого примера! … |
Муля Пользователь Сообщений: 307 |
Ну обозвал Все равно не работает. С ув. Муля! |
Муля Пользователь Сообщений: 307 |
{quote}{login=RAN}{date=02.07.2011 12:59}{thema=}{post}For Each objCell In objRange |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
>> Все равно не работает. Я сам — дурнее всякого примера! … |
Муля Пользователь Сообщений: 307 |
Ув. KukLP! |
ran Пользователь Сообщений: 7091 |
A каким образом не работает макрос KukLP? |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Прочитал сообщение Мули, посмотрел на код Сергея — с кодом всё в порядке. Не поленился проверить — <STRONG>работает</STRONG>. Муля, Вы в следующий раз пишите лучше так: «У МЕНЯ не работает» с указанием ЧТО именно не сработало: не запустился макрос, вместо чисел написал в ячейки нецензурное слово, выдал ошибку и выключил компьютер… <BR>Скорее всего Вы его просто не запустили. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=Юрий М}{date=02.07.2011 04:09}{thema=}{post}Скорее всего Вы его просто не запустили.{/post}{/quote}:-) Я сам — дурнее всякого примера! … |
Муля Пользователь Сообщений: 307 |
Хлопцы! Простите меня дурака, п-та!!! |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Мда… Про сумму прописью знаем, а сумму из прописи…:-) Я сам — дурнее всякого примера! … |
R Dmitry Пользователь Сообщений: 3103 Excel,MSSQL,Oracle,Qlik |
#18 02.07.2011 18:40:03 {quote}{login=KukLP}{date=02.07.2011 05:06}{thema=}{post}Мда… Про сумму прописью знаем, а сумму из прописи…:-){/post}{/quote}
|
|
nerv Пользователь Сообщений: 3071 |
{quote}{login=Муля}{date=02.07.2011 01:24}{thema=}{post}Ну обозвал |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=R Dmitry}{date=02.07.2011 06:40}{thema=Re: }{post}{quote}{login=KukLP}{date=02.07.2011 05:06}{thema=}{post}Мда… Про сумму прописью знаем, а сумму из прописи…:-){/post}{/quote} Я сам — дурнее всякого примера! … |
R Dmitry Пользователь Сообщений: 3103 Excel,MSSQL,Oracle,Qlik |
#21 02.07.2011 21:24:57 {quote}{login=KukLP}{date=02.07.2011 09:03}{thema=Re: Re: }{post}{quote}{login=R Dmitry}{date=02.07.2011 06:40}{thema=Re: }{post}{quote}{login=KukLP}{date=02.07.2011 05:06}{thema=}{post}Мда… Про сумму прописью знаем, а сумму из прописи…:-){/post}{/quote} Ну не знаю как у Муля, но в жизни все может быть, иногда в различных «экспортах» из различных программ встречается и не такое хотя такого честно не встречал ни разу
|
|
Муля Пользователь Сообщений: 307 |
Самый простой пример, где это пригодится. С ув. Муля! |
ikki Пользователь Сообщений: 9709 |
я вижу это как-то так… внимание — заготовка, чисто для примеру. ограничено целыми числами от 1 до 999999 и нет проверок на ошибки. фрилансер Excel, VBA — контакты в профиле |
Муля Пользователь Сообщений: 307 |
Здраствуйте ПЛАНЕТЯНЕ! |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
{quote}{login=Муля}{date=02.07.2011 10:50}{thema=}{post}Самый простой пример, где это пригодится. У ведомости начисления зарплаты месяц словом, а вот у сводной — желательно цифрами. <…> В одном месте месяц словом, а в другоя цифрами.{/post}{/quote} |
MCH Пользователь Сообщений: 3875 |
{quote}{login=ikki}{date=03.07.2011 12:02}{thema=было скучно :)}{post}я вижу это как-то так… внимание — заготовка, чисто для примеру. ограничено целыми числами от 1 до 999999 и нет проверок на ошибки.{/post}{/quote} |
ikki Пользователь Сообщений: 9709 |
{quote}{login=Муля}{date=03.07.2011 12:18}{thema=}{post}Здраствуйте ПЛАНЕТЯНЕ! ну вот Вам и домашнее задание — доработать макрос если более серьёзно — то всё-таки не вижу я в такой задаче практического смысла. короче — ну её нафиг, такую задачку. фрилансер Excel, VBA — контакты в профиле |
ikki Пользователь Сообщений: 9709 |
{quote}{login=MCH}{date=03.07.2011 12:53}{thema=Re: было скучно :)}{post} вот как… фрилансер Excel, VBA — контакты в профиле |
MCH Пользователь Сообщений: 3875 |
Чуток сократил код: UDF — пропись2число2() |
Guest Гость |
#30 03.07.2011 14:03:32 {quote}{login=MCH}{date=03.07.2011 01:16}{thema=}{post}Чуток сократил код: UDF — пропись2число2(){/post}{/quote} |
Иногда при написании макросов необходимо производить вычисления или сравнения числовых значений, которые вносятся в поля «TextBox». Существует небольшая проблемка при работе с этими данными – информация из поля «TextBox» воспринимается программой как текстовая и, соответственно, в расчетах не может использоваться.
Для решения денной проблемы в VBA можно использовать функцию VAL(), которая переводит в численный формат данных. VAL — это функция конвертирующая текстовые значения аргумента в целые числовые или числовые значения с плавающей запятой. Следует отметить что функция Val при преобразовании десятичных дробей в число может распознать только точку, то есть, если вы напишете десятичную дробь через запятую, то функция распознает только первую (целую)часть дроби, остальной текст после запятой функция не воспримет. Например: VAL(«10,8»)= 10
Рассмотрим пример кода с данной функцией (VAL) и без нее:
Существует форма для внесения данных, в которой в два поля «TextBox1» и «TextBox1» вносятся числа, которые сравниваются нажатием кнопки «Сравнить»(CommandButton1) и суммируются нажатием кнопки «Сумма» (CommandButton2).
Если на нажатие кнопки сравнения «Сравнить»(CommandButton1) использовать код:
- Private Sub CommandButton1_Click()
- Dim i, b As String
- i = TextBox1.Value
- b = TextBox2.Value
- If i < b = True Then MsgBox («Второе число больше «)
- If i > b = True Then MsgBox («Первое число больше «)
- End Sub
А на нажатие кнопки суммы «Сумма» (CommandButton2) применить код:
- Private Sub CommandButton2_Click()
- Dim i, b, d As String
- i = UserForm1.TextBox1.Value
- b = UserForm1.TextBox2.Value
- d = i + b
- TextBox3.Value = d End Sub
Сравнение значений будет выполняться верно, но расчеты суммы будут неверными:
Применим функцию VAL () в этих кодах:
1-й код (Сравнение двух чисел)
- Private Sub CommandButton1_Click()
- Dim i, b As String
- i = Val(UserForm1.TextBox1.Value)
- b = Val(UserForm1.TextBox2.Value)
- If i < b = True Then MsgBox («Второе число больше «)
- If i > b = True Then MsgBox («Первое число больше «)
- End Sub
2-й код (Сумма двух чисел)
- Private Sub CommandButton2_Click()
- Dim i, b, d As String
- i = Val(UserForm1.TextBox1.Value)
- b = Val(UserForm1.TextBox2.Value)
- d = i + b
- TextBox3.Value = d End Sub
С таким кодом кнопки формы UserForm1 работают корректно, как показано на скриншоте далее.
Скачать файл с макросом суммы и сравнения двух чисел.
Skip to content
На чтение 3 мин. Просмотров 3.6k.
Что делает макрос: При импорте данных из других источников, в ячейках могут оказаться значения числа, отформатированные как текст. Решение этой проблемы не в ваших силах, потому что независимо от того, что вы делаете, вы не можете отформатировать число в этих ячейках в числовые, валютные или процентные форматы. Вы также можете увидеть смарт-тег на клетки, что говорит вам ячейка отформатирована как текст.
Это достаточно легко исправить вручную, нажав на кнопку Текст по столбцам на вкладке Данные. Нет необходимости проходить через все шаги в этом мастере; просто нажмите на кнопку Готово, чтобы применить исправление.
Опять же, это довольно простое действие. Проблема, однако, заключается в том, что Excel не позволяет выполнять преобразования текста в столбцы фиксируя на несколько колонок. Вы должны применить это исправив одну колонку за один раз. Этот макрос может помочь вам.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
В этом макросе, мы используем две переменные объекта Range, чтобы пройти через наш целевой диапазон. Оператор For Each активирует каждую ячейку в целевом диапазоне.
Каждый раз, когда активируется ячейка, мы просто сбрасываем значение ячейки. Это фактически то же самое, что и преобразования команды «Текст по столбцам».
Код макроса
Sub PreobrazovatTekstVChislo() 'Шаг 1: Объявляем переменные Dim MyRange As Range Dim MyCell As Range 'Шаг 2: Сохраните книгу прежде, чем изменить ячейки? Select Case MsgBox("Перед изменением ячеек. " & _ "Сохранить книгу?", vbYesNoCancel) Case Is = vbYes ThisWorkbook.Save Case Is = vbCancel Exit Sub End Select 'Шаг 3:Определяем целевой диапазон Set MyRange = Selection 'Шаг 4: запускаем цикл по диапазону For Each MyCell In MyRange 'Шаг 5: Возврат в исходное значение ячейки If Not IsEmpty(MyCell) Then MyCell.Value = MyCell.Value End If 'Шаг 6: Получаем следующую ячейку в диапазоне Next MyCell End Sub
Как этот код работает
- Шаг 1 объявляет две переменные объекта Range.
- При выполнении макроса, он уничтожает стек отката.
- Шаг 3 заполняет переменную MyRange с целевым диапазоном.
- Шаг 4 начинает цикл через каждую ячейку в целевом диапазоне, активизируя каждую ячейку, через которую мы проходим.
- После того, как ячейка активируется, макрос использует функцию IsEmpty, чтобы убедиться, что ячейка не пуста. Мы делаем это, чтобы немного сэкономить на производительности,
пропуская пустые ячейки. Затем мы просто преобразуем ячейки к ее собственному значению. Это устраняет любое несоответствие форматирования. - Шаг 6 повторяет цикл, чтобы получить следующую ячейку. После просмотра всех ячеек в целевом диапазоне макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.