Страницы: 1
RSS
Удалить с помощью макроса точки из файла.
 
Добрый день!
Задача - удалить точки из столбцов, с помощью макроса, в стоблцах присутствуют числа, где разделители тысяч точки, десятичных - запятые, пример числа (56.763,34), стандартная функция экселя найти и замнеить делает все корректно, но при запуске через макрос и Replace, ломает форматы, что как я понял связано с ошибками/особенностиями локолизаций  excel/VBA.
Вопрос: удалось как нибудь обойти эту проблему и научить макросы корретно заменять точки на ""?
Благодарю заранее за ответ!
 
Цитата
Vseslav написал:
обойти эту проблему и научить макросы
Скорее это Вас нужно научить, а не макросы :)
Попробуйте так
Код
Sub Zamena_tochki()
    Dim Val2 As Range
    For Each Val2 In Selection
        Val2.Value = Replace(Replace(Val2.Value, ".", ""), ",", ".")
    Next
End Sub
Изменено: Msi2102 - 22.02.2022 20:52:50
 
Да, с макросами я знаком только пару недель)
Я как понял, вашем варианте идет замена "поячеечно", а ранее к сожалению я не уточнил, этот макрос нужен для для замены точек на выгрузках из SAP, и там бывает до 300к строчек. Вообще нужно что то что бы работало со столбцами, т.к. столбцы в которых идет замена  - всегда одни и те же, а количество строк всегда разное. При "поячеечной замене", в том варианте который вы предоложили, комп умрает очень быстро от таких физ. Нагрузок.
 
Vseslav, вы имеете ввиду столбцы М и Z ?
Изменено: New - 25.02.2022 21:24:35
 
Код
Columns(13).Replace ".", "", xlPart
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
, столбцы могут быть любые, это же просто пример.
Это могут быть как и M,Z, как и B:D.
 
у любых столбцов есть свои названия (адреса)
для удаления точек из любых столбцов можно использовать любые макросы
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
,Columns(13).Replace ".", "", xlPart
в данном варианте, если число вида 23.364,78 - то после работы макроса, число в ячейке отформатровано так текст, и сводная таблица уже не будет брать такие данные в обработку.
А если число вида 34,38 - то макрос просто удаляет запятые, хотя не должен их трогать.
Изменено: Vseslav - 25.02.2022 22:27:29
 
что должен делать макрос, что не должен - эта информация есть пока только у вас в голове
где ваш пример с обьяснениями:
вот это было на старте, вот так должно получиться на финише
обьяснять старайтесь точно и коротко на примере приложенного файла и данных в нем
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вот, во вложении.
спасибо что помогаете разобратся)
 
Выделите нужные столбцы и запустите макрос. Файл с макросом нужно будет сохранить в формат *.xlsm
Код
Sub Zamena_tochki()
    Selection.Replace ".", "", xlPart
    Selection.Replace ",", ".", xlPart
End Sub
Изменено: New - 25.02.2022 23:02:23
 
, New в вашем примере сбиваются числа вида 34,56 и макрос преобразует их в 3456
 
отмечаете столбец, выполняете этот
Код
Sub PeplacePoint()
  Dim a, r&, re
  a = Intersect(ActiveSheet.UsedRange, Selection)
  Set re = CreateObject("VBScript.RegExp")
  re.Pattern = "\.(\d{3})": re.Global = True
  For r = 1 To UBound(a)
    If re.test(a(r, 1)) Then a(r, 1) = re.Replace(a(r, 1), "$1")
  Next
  Selection = a
End Sub

макрос
и так, столько раз сколько столбцов нужно обработать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вот ещё вариант
Код
Sub Zamena_tochki_2()
    Dim a, r&, c&
    a = Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row)
    For r = 1 To UBound(a)
        For c = 1 To UBound(a, 2)
              a(r, c) = Replace(Replace(a(r, c), ".", ""), ",", ".")
        Next
    Next
    Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row) = a
End Sub

Не понимаю, чем Вас не устраивает стандартная замена EXCEL
Цитата
Vseslav написал:
комп умрает очень быстро
С чего он должен умереть, максимум подвиснет немного. Просто перед тем как создавать тему, нужно сразу писать, что и как, а ещё пример нужно прикладывать сразу.
Изменено: Msi2102 - 26.02.2022 10:21:28
 
Добрый день! Проблема в том, что метод Range.Replace не локализован и при замене точки меняется, в том числе, разделитель дробной части числа.
С помощью макроса можно так:

Код
Option Explicit
' Преобразовывает в прямоугольном диапазоне тесты вида "1.234,56" в числа.
' Предполагается, что диапазон не содержит формул.
Sub TextToNumber(ByVal rg As Range)
  Dim arr(), i As Long, j As Long
  Set rg = Intersect(rg, rg.Parent.UsedRange)
  arr = rg.Value
  On Error Resume Next
  For i = 1 To UBound(arr, 1)
    For j = 1 To UBound(arr, 2)
      If VarType(arr(i, j)) = vbString Then
        arr(i, j) = CDbl(Replace(Replace(arr(i, j), ".", ""), ",", Mid(1.2, 2, 1)))
      End If
    Next j
  Next i
  On Error GoTo 0
  rg.Value = arr
End Sub

Sub Test()
  TextToNumber Selection
End Sub


Должно работать быстро.
Изменено: sokol92 - 26.02.2022 15:35:52
Владимир
 
Sokol92, спасибо большое!
все работает, огонь!
Страницы: 1
Читают тему
Наверх