Страницы: 1 2 След.
RSS
При извлечении числа из текста съедается запятая в дробной части
 
День добрый!
Нужно извлечь макросом числа из текста и дальше с ними производить вычисления.
Но у числа с 4 знаками после запятой при извлечении числа из текста функцией Mid съедается запятая в дробной части числа и число увеличивается на порядки. Хотя этого не происходит, если предварительно результирующей ячейке задать формат Текстовой. Но как потом с этим псевдочислом работать? Дальнейшие конвертации в CDbl или СSng результат округляют, что недопустимо. Да и преобразование в Текстовый для каждой ячейки нежелательно.
Прикладываю файл примера с макросом.
 
ixet, ну наверное потому что функция мид изначально для текста предназначена. преобразовывать в число и работать..А  у вас вообще что-то странное значение..
покажите что есть изначально  рядом что нужно получить (в файле)
Изменено: Mershik - 05.11.2021 20:54:24
Не бойтесь совершенства. Вам его не достичь.
 
Почему бы не пойти прямым путем (если у Вас десятичный разделитель запятая):
Код
Cells(i, 10) = CDbl(Trim(Left(Cells(i, 1), 15)))
Владимир
 
Так я об этом и говорю: текст извлечь и сделать числом.
Добавил в файл нужный результат
Txt_to_Digital 1.xlsm (11.34 КБ)

Цитата
sokol92 написал: Почему бы не пойти прямым путем
Делал так. Регулярно выскакивала какая-то ошибка. Поэтому перешел на две строки.
--
попробовал, с кодом:
Код
Cells(i, 10) = CDbl(Trim(Mid(Cells(i, 1), 4, 10)))

ошибка Type mismatch
 
Цитата
извлечь макросом числа из текста
Код
Sub GetiDigits()
Dim mo As Object
Dim n As Integer
Dim i As Long
Dim iLastRow As Long
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
With CreateObject("VBScript.RegExp")
  .Global = True
  .Pattern = "\d+(,\d+)?"
  For i = 1 To iLastRow
    If .Test(Cells(i, 1)) Then
      Set mo = .Execute(Cells(i, 1))
      For n = 0 To mo.Count - 1
        Cells(i, n + 3) = CDbl(mo(n))
      Next
    End If
  Next
End With
End Sub
 
Круто конечно, но вы какую-то другую задачу решали :) Мне не нужно все числа извлекать и раскидывать по соседним столбцам.
RegExp - по-моему, это из пушек по воробьям
 
Вы написали
Цитата
извлечь макросом числа из текста
У вас в ячейке три числа, вот я их и извлек
 
вроде работает (если нужно достать первое число)
Код
Public Sub Txt_to_Digital()
    Dim i As Long
    
    For i = 1 To 7 'c 1 по 7 строку
        Cells(i, 10) = CDbl(Trim(Left(Cells(i, 1), 15))) 'результат в 10-й столбец
    Next i
End Sub
Изменено: New - 05.11.2021 21:36:28
 
Цитата
ixet написал:
Мне не нужно все числа извлекать и раскидывать по соседним столбцам.
интересно а в айле примере вы показали это?
Не бойтесь совершенства. Вам его не достичь.
 
В первом сообщении "Но у числа с 4 знаками после запятой при извлечении числа "
В коде
Код
Trim(Mid(Cells(i, 1), 4, 10)

Что тут еще неясного?
 
Цитата
New написал:
вроде работает (если нужно достать первое число)
а у меня ошибка
Excel 2010
 
1. не нужно переменной, отвечающей за номера строк давать тип Single. Single - это дробное число с одинарной точностью. Номера строк в Excel это всегда целое число (1, 2, 3 и т.д.), т.е. это Long.
2. Скачайте мой файл из сообщения #8 и нажмите на большую синюю кнопку - у вас появляется ошибка?
3. Скорее всего что-то не так с вашим текстом в какой-то из ячеек, но вы нам её не показываете. То есть у вас есть какое-то число в какой-то из пяти строк, где макрос не срабатывает, но вы нам это число (длинную строку) не показываете, чтобы мы скорректировали код макроса так, чтобы он обрабатывал эту ошибку. На вашем примере - макрос работает, но никто не знает, что у вас в рабочем файле. Если у вас в рабочем файле в пятой строке написано "Мама, я пошла гулять", то макрос точно выдаст ошибку, но мы-то не знает, что у вас в файле написан такой текст в пятой строке. Вот сидим и гадаем тут
Изменено: New - 05.11.2021 22:00:01
 
В VBA числа обрабатываются в английском формате: разделитель целой и дробной части - точка, разделитель разрядов - запятая.
Код
Sub Txt_to_Digital()
    Dim sText As String
    Dim i As Long
    
    For i = 1 To 5
        sText = Replace(Cells(i, 1).Value, ",", ".")
        sText = Application.Trim$(sText)
        Cells(i, 10).Value = Split(sText, " ")(0)
    Next i
End Sub
 
Цитата
vikttur написал: разделитель целой и дробной части - точка, разделитель разрядов - запятая.
спасибо, не знал

Цитата
New написал:
Скорее всего что-то не так с вашим текстом в какой-то из ячеек, но вы нам её не показываете. Т
Разобрался. Потребовалось сделать дополнительные проверки. Спасибо за подсказки!
Код
If Cells(i, 1) <> "" And IsNumeric(Cells(i, 1)) = True Then Cells(i, 10) = CDbl(Trim(Left(Cells(i, 1), 15)))   'результат в 3-й столбец
 
Цитата
ixet написал:
Cells(i, 1) <> ""
ну, вот это тоже правильно. Если ячейка пустая, то точно будет ошибка )
мы и не предполагали, что у вас есть пустые ячейки в столбце
 
Ну как же? Стояло i=1 to 5, вот на второй строке ошибка и начиналась
 
ixet, вы лучше скажите - вам код от vikttur подошёл? или дальше предлагаем варианты?
Изменено: New - 05.11.2021 22:32:42
 
Цитата
ixet написал:
Разобрался. Потребовалось сделать дополнительные проверки. Спасибо за подсказки!
Закрыто
Спасибо еще раз
 
на самом деле - у любого человека, который начинает программировать (не только макросы, а на любом языке) возникают вот такие непонятности, ошибки и тд. Но с годами это проходит. Вот таким образом у людей и появляется свой опыт
P.S. А просто вот такой код (без IsNumeric) у вас тоже выдаёт ошибку?
Код
Public Sub Txt_to_Digital()
    Dim i As Long
    For i = 1 To 100
        If Cells(i, 1) <> "" Then
            Cells(i, 10) = CDbl(Trim(Left(Cells(i, 1), 15)))
        End If
    Next i
End Sub
Изменено: New - 05.11.2021 22:38:19
 
Цитата
New написал:
P.S. А просто вот такой код (без IsNumeric) у вас тоже выдаёт ошибку?
На файле примера нет.
Это дополнительная проверка. В моих данных бывают чудесные числа вида ",67". Именно без указания целой части для чисел меньше 1. И если в такую запись затесался лишний пробел ", 67" или другой случайный символ, то будет ошибка.
 
Увы, возобновляю тему. На других данных выявились новые ошибки извлечения чисел из первого столбца.
У меня два варианта кода. Первый даёт такой результат:

второй такой:

Единственный вариант вижу - предварительно переводить результирующую ячейку в текстовой формат, потом включать макрос, потом возращать общий формат. Но хотелось бы обойтись без такого извращения.
Изменено: ixet - 21.11.2021 08:50:48
 
Как формулист могу порекомендовать
=--SUBSTITUTE(LEFT(TRIM(A1);FIND(" ";TRIM(A1))-1);".";MID(1/2;2;1)) правда если будут в строке числа с тысячными разделителями в виде пробелов. то нужно иначе. но тоже самое можно просто  в коде изобразить и взяв часть кода из 13 разделять не по одному, а по двум подряд пробелам.

Код
Sub Txt_to_DigitalBMV()
    Dim i As Long
    For i = 1 To 7
        Cells(i, 7).Value = Replace(Replace(Split(LTrim(Replace(Cells(i, 1).Value, ",", ".")), "  ")(0), " ", ""), Chr(160), "")
    Next i
End Sub
Изменено: БМВ - 21.11.2021 09:20:57
По вопросам из тем форума, личку не читаю.
 
Спасибо, но нет. Нужен именно код с извлечением по конкретным номерам символов, а не по числу пробелов.
Изменено: ixet - 21.11.2021 09:49:39
 
Вот такой код даёт правильный результат. Но он по-моему избыточный, неужели нельзя сократить?
Код
Public Sub Txt_to_Digital()

'установим разделитель целой и дробной части на "точку"
    Application.UseSystemSeparators = False
    Application.DecimalSeparator = "."
    
For i = 1 To 7
        
    Cells(i, 2).NumberFormat = "@"
    Cells(i, 2) = Trim(Mid(Cells(i, 1), 4, 12))
    If IsNumeric(Cells(i, 2)) = True Then Cells(i, 2) = CDbl(Cells(i, 2))
    Cells(i, 2).NumberFormat = "General"
    Cells(i, 2) = Cells(i, 2).Value
    
Next i

'возвращаем разделитель целой и дробной части на системный
    Application.UseSystemSeparators = True
    
End Sub
 
если знать что за задачу вы решаете - скорее всего можно будет
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Задача - извлечь числа, находящиеся между 4 и 17 символами.
Проверка IsNumeric нужна только для пропуска ошибочных значений вида "2а,34". Т.е. когда внутрь числа случайно попал текстовой символ.
 
4 и 17 символы включительно?
не нужно обьяснять какие нужны проверки, обьясните что нужно получить в итоге
на входе есть Х на выходе должен получиться У
опишите, что может быть в Х и что при этом должно получиться в У
не нужно описывать методы, как этого достичь, обьясните что нужно получить в итоге
Изменено: Ігор Гончаренко - 21.11.2021 10:42:41
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Поправка: 12 символов, с 4 по 16-й включительно.
В файле написал подробно.
Все варианты, которые могут быть в столбце A, в файле приведены.
Изменено: ixet - 21.11.2021 10:52:22
 
1. строка с 4 по 16 символ включительно содержит 13 символов
2. в файле НИКАК не описана задача
можете обьяснить что вам нужно в итоге?
Код
Function DgtFrom(s)
  DgtFrom = Val(Replace(Mid(s, 4, 13), ",", "."))
End Function
Изменено: Ігор Гончаренко - 21.11.2021 11:53:43
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, я не знаю уже как объяснять.
В столбце А находятся текстовые данные, в которых с 4 по 15 символ есть числа. Изредка внутрь числа может затесаться текстовой символ и такие псевдо числа надо всё-равно обработать, извлекая и числовые и текстовые символы.
Их нужно извлечь в столбец B макросом (не Function, а Sub).
Мой макрос делает, то что нужно. Но он очень громоздкий и корявый, я надеюсь его упростить.
Для наглядности результат выполнения моего макроса, который правильно обрабатывает данные, указал в столбце B.
Никаких округлений/модификаций чисел недопустимо; 4,1 не должен превращаться в 4,0999.
1f,24 не должен превращаться в 1 - пусть остается 1f,24, потом вручную эта ячейка будет исправлена на 1,24
Страницы: 1 2 След.
Наверх