Удалить точку в строке, выпуск с номерами <1000 - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть столбец с данными, взятыми из файла CSV, данные содержат точку, которую мне нужно удалить. Когда я хочу заменить «.» (Точка) на «» (ничего) на VBA, у меня неправильный результат. Все числа меньше 1000 заменяют запятую, например, у меня 122,49, а результат - 12249, что неверно. Я пробовал несколько кодов VBA, ни один из них не работал. Если бы вы могли мне помочь, было бы здорово. Я перепробовал все варианты с форматами ..

Спасибо.

  • 2.078,00 -> 2078,00 нормально
  • 122,49 -> 12249 КО
  • 328,28 -> 32828 ко
  • 11,192,34 -> 11192,34 нормально
Sub TEST() 
    Dim i As String
    Dim k As String
    i = "."
    k = ""
    Columns("P:P").Replace what:=i, replacement:=k, lookat:=xlPart, MatchCase:=False
End Sub

wrong result

Ответы [ 4 ]

2 голосов
/ 15 апреля 2020

На самом деле это ошибка в Excel! Это происходит только в VBA. Если вы делаете то же самое замените из пользовательского интерфейса, это работает. То же самое из записанного макроса не удается. Так что, очевидно, ошибка.

Я рекомендую прочитать все значения в массив, затем заменить и затем записать их обратно. Таким образом, ошибка не возникает, и использование массивов даже быстрее, чем использование диапазонов.

Option Explicit

Sub TEST()
    Dim i As String
    Dim k As String
    i = "."
    k = ""

    Dim LastRow As Long 'find last used row (to reduce processed cells)
    LastRow = Cells(Rows.Count, "P").End(xlUp).Row

    Dim ReplaceValues() As Variant 'read all values into array
    ReplaceValues = Range("P1:P" & LastRow).Value

    Dim iRow As Long 'replace
    For iRow = LBound(ReplaceValues) To UBound(ReplaceValues)
        ReplaceValues(iRow, 1) = Replace(ReplaceValues(iRow, 1), i, k)
    Next iRow

    'write all values from array back into cells
    Range("P1:P" & LastRow).Value = ReplaceValues
End Sub

Или используйте Application.Substitute:

Sub Test()

    Dim lr As Long
    Dim arr As Variant

    lr = Cells(Rows.Count, "P").End(xlUp).Row
    arr = Range("P1:P" & lr).Value
    Range("P1:P" & lr).Value = Application.Substitute(arr, ".", "")

End Sub
1 голос
/ 15 апреля 2020

Попробуйте:

Sub dotKiller()
    For Each cell In Intersect(Range("P:P"), ActiveSheet.UsedRange)
        v = cell.Text
        If InStr(v, ".") > 0 Then
            cell.Clear
            cell.NumberFormat = "@"
            cell.Value = Replace(v, ".", "")
        End If
    Next cell
End Sub

Если ячейка не содержит точку , она не будет изменена.

До:

enter image description here

и после:

enter image description here

1 голос
/ 15 апреля 2020

Я не уверен, точно ли я понимаю ваши требования, но посмотрите, делает ли это то, что вы хотите.

Function RemovePeriods(ByVal number As String) As String
    RemovePeriods= Replace(number, ".", ",")
    RemovePeriods= Replace(Left$(RemovePeriods, Len(number) - 3), ",", "") & Right$(RemovePeriods, 3)
End Function

'run from here
Sub Example()
    Debug.Print RemovePeriods("2.078,00")
    Debug.Print RemovePeriods("122,49")
    Debug.Print RemovePeriods("328,28")
    Debug.Print RemovePeriods("11.192,34")
End Sub

Вывод

2078,00
122,49
328,28
11192,34
0 голосов
/ 15 апреля 2020

Попробуйте это

Sub Test()
Columns("P:P").Replace What:=Application.DecimalSeparator, Replacement:="", LookAt:=xlPart, MatchCase:=False
End Sub

Или вручную Файл >> Параметры >> Дополнительно >> Снимите флажок (Использовать системные разделители)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...