Конференция VBStreets • Просмотр темы — Как преобразовать строку в число?

Функции преобразования типов данных в VBA Excel. Наименования функций, синтаксис, типы возвращаемых данных, диапазоны допустимых значений выражения-аргумента.

Преобразование чисел в строки

Функцию можно использовать Format для преобразования числа в отформатированную строку, которая может включать не только соответствующие цифры, но и символы форматирования, такие как знак валюты (например $ ,), разделители тысяч или символы группирования цифр (например,), , и десятичный разделитель (например,) . . Formatавтоматически использует соответствующие символы в соответствии с региональными параметрами, заданными на панели управления Windows.

Обратите внимание, что оператор конкатенации ( & ) может преобразовать число в строку неявным образом, как показано в следующем примере.

‘ The following statement converts count to a String value. Str = “The total count is ” & count

Если на нажатие кнопки сравнения «Сравнить»(CommandButton1) использовать код:

  1. Private Sub CommandButton1_Click()
  2. Dim i, b As String
  3. i = TextBox1.Value
  4. b = TextBox2.Value
  5. If i < b = True Then MsgBox («Второе число больше «)
  6. If i > b = True Then MsgBox («Первое число больше «)
  7. End Sub

А на нажатие кнопки суммы «Сумма» (CommandButton2) применить код:

  1. Private Sub CommandButton2_Click()
  2. Dim i, b, d As String
  3. i = UserForm1.TextBox1.Value
  4. b = UserForm1.TextBox2.Value
  5. d = i + b
  6. TextBox3.Value = d End Sub

Сравнение значений будет выполняться верно, но расчеты суммы будут неверными:сравнение чисел макрос VBAСумма чисел макрос VBA

Преобразование текста в число в vba

​Смотрите также​​ Проверил – работает.​
​ Sub​: Исправить формат экспортированных​, то это​ в диапазоне.​
​ Chr(160), “”, 1,​ ‘чтобы код быстрее​
​ команду Специальная вставка.​ правда не в​ по умолчанию 9​
​ в ячейке в​ 1 To R.Columns.Count​Sub m() Dim​ можно распространить на​
​ все править ручками.​ за компьютером, отвечаете​countervector​Silenser1588​KuklP​
​ как текст чисел​ хоть и меняет​
​undefined7​

​ , vbBinaryCompare) temp​​ сработал, т.к. работать​
​ В группе Операция​ курсе…​ как я посмотрел​
​ текст)​ R.Cells(i, j).Value =​

​ i&, x As​​ еще 12 столбцов​
​dzug​
​ на вопросы, а​: Здраствуйте.​: не могли бы​

​: Да Саш, невнимателен​​Erdni​
​ формат ячейки на​:​
​ = Replace(temp, “,”,​ с VBA-массивами быстрее​

​ выбираю параметр умножить​​Если сохранять в​Hugo121​Попробовал записать макрос​
​ Val(R.Cells(i, j).Value) Next​ Double i =​
​ справа?​: Попробуйте вот так​ когда вы отдыхаете?Работаете​Спасибо за ответы​ Вы написать пример,​Мне на планете​: Спасибо! Проблема решена​ числовой, но выглядит​
​undefined7​ “.”, 1, ,​ ‘в некоторых случаях,​ и нажимаю кнопку​ dbf как есть​: cstr() преобразовывает в​

planetaexcel.ru>

5 ответов

используйте функцию ниже (изменение [E:E] соответствующий диапазон для ваших нужд), чтобы обойти эту проблему:

[E:E].SelectWith Selection .NumberFormat = “General” .Value = .ValueEnd With

P.S. По моему опыту, это решение VBA работает значительно быстрее на больших наборах данных и с меньшей вероятностью приведет к сбою Excel, чем с помощью метода “окно предупреждения”.

Это можно использовать для поиска всех числовых значений (даже отформатированных как текст) в листе и преобразования их в single (функция CSng).

For Each r In Sheets(“Sheet1”).UsedRange.SpecialCells(xlCellTypeConstants) If IsNumeric(r) Then r.Value = CSng(r.Value) r.NumberFormat = “0.00” End IfNext

У меня была эта проблема раньше, и это было мое решение.

With Worksheets(“Sheet1”).Columns(5) .NumberFormat = “0” .Value = .ValueEnd With

это преобразует весь текст в Столбцах книги Excel в Numbers.

Sub ConvertTextToNumbers()Dim wBook As WorkbookDim LastRow As Long, LastCol As LongDim Rangetemp As Range’Enter here the path of your workbookSet wBook = Workbooks.Open(“yourWorkbook”)LastRow = Cells.Find(What:=”*”, After:=Range(“A1″), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).RowLastCol = Cells.Find(What:=”*”, After:=Range(“A1”), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).ColumnFor c = 1 To LastColSet Rangetemp = Cells(c).EntireColumnRangetemp.TextToColumns DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _ :=Array(1, 1), TrailingMinusNumbers:=TrueNext cEnd Sub

решение, которое для меня работает:

For Each xCell In Selection xCell.Value = CDec(xCell.Value)Next xCell

Как преобразовать строку в число?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.

Правила форума

Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут

закрыты

.

Читайте

требования к создаваемым темам

.

Snussi Продвинутый пользователь
Продвинутый пользователь Аватара пользователя
  Сообщения: 151Зарегистрирован: 21.07.2004 (Ср) 18:08Откуда: Москва, Россия
  • Сайт
  • ICQ

Сообщение Snussi » 27.07.2005 (Ср) 9:34

А вот и не факт!

Val воспримет только точку как дес. разделитель.

Имхо, лучше CDbl, CINT,Clng и тд. Правда, они воспринимают как дес. разделитель символ, установленный в региональных настройками.

Так что, смотря что нужно делать

:)

Andrey Fedorov Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets   Сообщения: 3287Зарегистрирован: 21.05.2004 (Пт) 9:28Откуда: Москва

Сообщение Andrey Fedorov » 27.07.2005 (Ср) 9:43

Snussi писал(а):

А вот и не факт!

Val воспримет только точку как дес. разделитель.

Имхо, лучше CDbl, CINT,Clng и тд. Правда, они воспринимают как дес. разделитель символ, установленный в региональных настройками.

Так что, смотря что нужно делать :)

Заменить точку на региональный разделитель и преобразовать в число:

Код: Выделить всёCDbl(Replace(MyString,”.”,Format(0,”.”)))

Это сработает во всех случаях…

Фиг Вам! – Сказал Чебурашка, обгладывая Крокодила Гену…

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 27.07.2005 (Ср) 11:16

а с еще большей гарантией сработает

Код: Выделить всёVal(Replace(MyString,”,”,”.”)

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 11:18

Да ну? Даже когда десятичный разделитель – точка с запятой?

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets   Сообщения: 3287Зарегистрирован: 21.05.2004 (Пт) 9:28Откуда: Москва

Сообщение Andrey Fedorov » 27.07.2005 (Ср) 11:19

!Viper! писал(а):

а с еще большей гарантией сработает

Код: Выделить всёVal(Replace(MyString,”,”,”.”)

Ну большей-то гарантии тут нет совершенно.

Кроме того, если юзер применяет в качестве разделителя нечто отличное от точки и запятой? Ведь теоретически это возможно…

:lol:

Фиг Вам! – Сказал Чебурашка, обгладывая Крокодила Гену…

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 27.07.2005 (Ср) 11:42

соответственно неплохо бы узнать какой разделитель применяет пользователь.

в реестре это лежит здесь :

HKEY_CURRENT_USERControl PanelInternational

строковый параметр sDecimal

Возможно есть и API функция, которая позволяет получить этот разделитель не заходя в реестр

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 11:58

Так вот как раз format$(0, “.”) и получит этот разделитель.
Внимательно фтыкаем написанное выше.

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 27.07.2005 (Ср) 12:13

GSerg писал(а):Так вот как раз format$(0, “.”) и получит этот разделитель.

как это????

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 12:18

Выполни: msgbox format$(0, “.”)

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 28.07.2005 (Чт) 11:06

GSerg писал(а):Выполни: msgbox format$(0, “.”)

Ну и получил я приглашение в виде точки. И что?

Если вместо “.” поставить “,”, получим запятую и так далее…

в чем фишка то?

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 28.07.2005 (Чт) 11:08

Сходи в свои национальные виндовские настройки. И посмотри, что там стоит десятичным разделителем.

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 28.07.2005 (Чт) 11:19

!Viper! писал(а):

в реестре это лежит здесь :

HKEY_CURRENT_USERControl PanelInternational

строковый параметр sDecimal

тут они и есть. настройки то, национальные

Весь мир матрица, а мы в нем потоки байтов!

uhm Продвинутый гуру
Продвинутый гуру Аватара пользователя
  Сообщения: 1597Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 28.07.2005 (Чт) 11:55

Hint: поменяй ручками десятичный разделитель на что-нибудь непотребное, а потом еще раз выполни msgbox format$(0, “.”)

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 29.07.2005 (Пт) 11:16

uhm писал(а):Hint: поменяй ручками десятичный разделитель на что-нибудь непотребное, а потом еще раз выполни msgbox format$(0, “.”)

Ура! заработало! Но только в VB6. На VB.NET надо делать

Код: Выделить всёFormat(0,”.0″)

– выведет “$0”, если в качестве разделителя взять $.

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 29.07.2005 (Пт) 11:21

А зачем этот финальный ноль выводить?

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 29.07.2005 (Пт) 11:30

Казалось бы что действительно незачем, но команда

Format(0, “.”)

выводит к сожалению пустую строку.

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 29.07.2005 (Пт) 11:37

Ага.

Слишком умно – не лучше, чем слишком глупо

:)

Впрочем, в .NET есть CultureInfo.NumberFormat.NumberDecimalSeparator

:)

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 09.08.2005 (Вт) 10:56

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

Код: Выделить всёDim dbl As Double
Dim str As String
str = “123,45”
dbl = CDbl(str) ‘здесь произойдет ошибка
dbl = Val(str)   ‘ошибки не будет, но dbl будет равна нулю

Весь мир матрица, а мы в нем потоки байтов!

alibek Большой Человек
Большой Человек   Сообщения: 14189Зарегистрирован: 19.04.2002 (Пт) 11:40Откуда: Russia

Сообщение alibek » 09.08.2005 (Вт) 10:58

Ерунда, dbl будет равен 123

Lasciate ogni speranza, voi ch’entrate.

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 09.08.2005 (Вт) 11:03

alibek писал(а):Ерунда, dbl будет равен 123

Вот уж нет. будет ошибка 13 “Type mismatch”, то бишь несовпадение типов

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 11:27

Да ну?

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper Артефакт VBStreets
Артефакт VBStreets Аватара пользователя
  Сообщения: 4392Зарегистрирован: 12.04.2005 (Вт) 17:50Откуда: Н.Новгород
  • ICQ

Сообщение Viper » 09.08.2005 (Вт) 11:35

Сорри!!!

для

Код: Выделить всёdbl = CDbl(“123,45”)

будет ошибка несовпадения типов, но для

Код: Выделить всёdbl = Val(“123,45”)

действительно получим, что dbl равен 123.

Но разница между Val и СDbl тем не менее остается, что собственно я и хотел сказать.

Весь мир матрица, а мы в нем потоки байтов!

GSerg Шаман
Шаман   Сообщения: 14286Зарегистрирован: 14.12.2002 (Сб) 5:25Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 11:39

А.

Собственно, это было сказано так много раз до этого

:)

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 2

Функция VAL в VBA Excel или как преобразовать TextBox в число (цифру).

Иногда при написании макросов необходимо производить вычисления или сравнения числовых значений, которые вносятся в поля «TextBox». Существует небольшая проблемка при работе с этими данными – информация из поля «TextBox» воспринимается программой как текстовая и, соответственно, в расчетах не может использоваться.

Для решения денной проблемы в VBA можно использовать функцию VAL(), которая переводит в численный формат данных. VAL — это функция конвертирующая текстовые значения аргумента в целые числовые или числовые значения с плавающей запятой. Следует отметить что функция Val при преобразовании десятичных дробей в число может распознать только точку, то есть, если вы напишете десятичную дробь через запятую, то функция распознает только первую (целую)часть дроби, остальной текст после запятой функция не воспримет. Например: VAL(«10,8»)= 10

Примеры запросов

Выберите Салеприце, Финалприце, CBool (Салеприце>Финалприце) как Выражение1 из Продуктсалес;

Возвращает значение “Салеприце”, “Финалприце” и определяет, является ли Салеприце больше конечной цены. Возвращает “-1”, если истина и “0”, если ложь.

ВЫБЕРИТЕ ProductID, CByte (количество) как Выражение1 из Продуктсалес;

Возвращает значение “ProductID”, преобразует значения в поле “количество” в байтовый формат, а в столбце Выражение1 — на “ProductID” — преобразует значения из поля “количество” в денежный формат и выводится в столбце “выражение1”.

ВЫБЕРИТЕ ProductID, CDate (Датеофсале) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения в поле “Датеофсале” в формат даты и выводит в столбец Выражение1.

ВЫБЕРИТЕ ProductID, CDbl (скидка) как Выражение1 из Продуктсалес;

Возвращает слово “ProductID”, преобразует значения из поля “скидка” в двойной формат и выводит его в столбце Выражение1.

ВЫБЕРИТЕ ProductID, CInt (скидка) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения из поля “скидка” в целочисленный формат и отображает в столбце “выражение1”.

ВЫБЕРИТЕ ProductID, CLng (скидка) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения в поле “скидка” в длинный формат и выводит его в столбце “выражение1”.

ВЫБЕРИТЕ ProductID, CSng (скидка) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения из поля “скидка” в один формат и выводится в столбце “выражение1”.

ВЫБЕРИТЕ ProductID, CStr (скидка) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения в поле “скидка” в строковый формат и выводит его в столбце Выражение1.

ВЫБЕРИТЕ ProductID, CVar (скидка) как Выражение1 из Продуктсалес;

Возвращает “ProductID”, преобразует значения в поле “скидка” в Double для числовых значений и строк для нечисловых значений.

sitesaid.ru

Создание сайта

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...