Страницы: 1
RSS
функция Range.Replace, задать условие поиска
 
Добрый день!
Есть ли возможность задать в качестве условия поиска любое числовое значение в ячейке?
Есть диапазон, в нем часть ячеек заполнена буквами, знаками, часть цифрами. Надо в ячейках с цифрами заменить цифры(у) на букву.
Мне приходит в голову только вариант с перечислением условий типа 0, 1, 2, и т.д., но как-то криво смотрится
 
Код
    For Each icell In Selection
        If IsNumeric(icell.Value) Then icell.Value = "'" & icell.Value
    Next


Так не подойдет?
Учимся сами и помогаем другим...
 
ber$erk, я предполагал что-то типа вот такого

Код
Range(Cells(4, 5), Cells(LastRow, LastClm)).Replace What:="*", Replacement:="x", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=True, SearchFormat:=False, _
        ReplaceFormat:=False 
только вместо * что-либо указывающее на число, а не на любое значение.
ЗЫ А можно как-то перечислить все цифры в What:= ? либо указать переменную в которой определен набор значений для поиска?
Изменено: jfd - 11.03.2013 16:41:51
 
А если так попробовать

Range(Cells(4, 5), Cells(LastRow, LastClm)).SpecialCells(xlCellTypeConstants, xlNumbers).Replace
и далее по тексту
 
Kuzmich, спасибо, работает
Мы выбрали диапазон с заданными границами, но включающий только ячейки с цифрами и уже внутри него ищем любую заполненную ячейку?
 
Цитата
jfd пишет:
любую заполненную ячейку?
Не любую, а только с цифрами
 
Kuzmich, не сочтите за занудство, если можно поподробнее?
Range(Cells(4, 5), Cells(LastRow, LastClm)) - это диапазон ячеек
SpecialCells(xlCellTypeConstants, xlNumbers) это нам говорит о том, в заданном диапазоне только ячейки с цифрами
Replace What:="*"  это говорит нам осуществлять поиск в любых заполненных ячейках диапазона, но поскольку мы ранее ограничили диапазон только ячейками с цифрами, то в ячейках с чем-то другим даже и не ищем.
Правильно?
Еще параллельный вопрос, цифры сохраненные как текст можно с помощью  SpecialCells задать или только преобразовывать?
 
Замените Replace на Select, и подглядите, что выделится.
 
RAN, ну да, как я и думал
 
Вопросы к jfd:
1. Требуется обрабатывать только текстовые ячейки, в которых могут быть цифры?
2. Каждую цифру в ячейке заменять на какой-то символ или группу подряд идущих цифр менять на этот символ?
3. Как учитывать символ десятичной точки, например, если в ячейке значение: ХАХА123.45 или ОГО99,88 ?

Приведите несколько примеров того, что было и что должно получиться с заменой на символ подчеркивания.
Изменено: ZVI - 12.03.2013 11:18:42
 
Цитата
jfd пишет: цифры сохраненные как текст можно с помощью SpecialCells задать
Range(Cells(4, 5), Cells(LastRow, LastClm)).SpecialCells(xlCellTypeConstants, xlTextValues).Replace
 
ZVI,
Цитата
1. Требуется обрабатывать только текстовые ячейки, в которых могут быть цифры?
Чтобы было проще. Есть файл выгруженный из 1С, в нем диапазон ячеек часть из которых содержит "х", а часть цифры. 1С выгружает цифры как текст. Мне надо заменить цифры на "х", можно тупо заменить все значения на "х", но не интересно.
Цитата
2. Каждую цифру в ячейке заменять на какой-то символ или группу подряд идущих цифр менять на этот символ?
Любое число в ячейке надо заменить на "х". Если заменять каждую цифру в ячейке надо использовать символ подстановки "?"
Цитата
3. Как учитывать символ десятичной точки, например, если в ячейке значение: ХАХА123.45 или ОГО99,88 ?
Поскольку перед заменой преобразовываю в числовой формат и меняю "," на ".", с числами проблем нет. А как заменить цифры на "х" в случае ХАХА123.45 используя только Replace не нашел.
Цитата
Приведите несколько примеров того, что было и что должно получиться с заменой на символ подчеркивания.
Первый приложенный файл то что было, второй что стало.
UPD Код в последнем файле

Первого нет. Удален. Общий размер более 100 кБ [МОДЕРАТОР]
Изменено: jfd - 13.03.2013 22:30:58
 
Для было/стало
Код
Sub Макрос1()
    Range("C1").Copy
    Range("E4:FW54").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
        False, Transpose:=False
    Range("E4:FW54").SpecialCells(xlCellTypeConstants, xlNumbers).Replace What:="*", Replacement:="_", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=True, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub
 
Вот такой макрос обработает лист выгрузки, заменив все текстовые фрагменты типа 12.34 или 56,78 или 9 на символ замены "X":

Код
' Заменить все фрагменты типа #.# или #,# или # на символ ReplaceBy
Sub ReplaceNums()
  Const ReplaceBy = "X" ' <-- символ замены каждой серии цифр
  Dim a, c&, r&, Rng As Range
  Set Rng = ActiveSheet.UsedRange
  ' Считать диапазон в VBA-массив
  a = Rng.Value
  ' Произвести замены в массиве
  With CreateObject("vbscript.regexp")
    .Global = True
    ' Задать шаблон: Цифра(ы) ЗапятаяИлиТочка Цифра(ы) ИЛИ Цифра(ы)
    .Pattern = "(\d+[,.]\d+)|(\d+)"
    ' Заменить по шаблону
    For r = 1 To UBound(a, 1)
      For c = 1 To UBound(a, 2)
        Select Case VarType(a(r, c))
          Case 2 To 6: a(r, c) = ReplaceBy  ' Числовые ячейки, на всякий случай
          Case 8:      a(r, c) = .Replace(a(r, c), ReplaceBy)
        End Select
      Next
    Next
  End With
  ' Переписать исправленный массив в диапазон
  Rng.Value = a
End Sub
Изменено: ZVI - 13.03.2013 09:11:22
 
ZVI,  Спасибо за пример.Я так и думал что без регулярных выражений не обойтись.
Не могли бы Вы, в качестве гуманитарной помощи, эту конструкцию разобрать?
Код
For r = 1 To UBound(a, 1)
      For c = 1 To UBound(a, 2)
        Select Case VarType(a(r, c))
          Case 2 To 6: a(r, c) = ReplaceBy  ' Числовые ячейки, на всякий случай
          Case 8:      a(r, c) = .Replace(a(r, c), ReplaceBy)
        End Select
      Next
    Next
 
Цитата
jfd: ... эту конструкцию разобрать?
Для Вашего файла выгрузки указанный фрагмент кода можно заменить на упрощенный:
Код
    ' Заменить по шаблону
    For r = 1 To UBound(a, 1)   ' В каждой строке
      For c = 1 To UBound(a, 2) ' И каждом столбце
        ' Если тип значения - текстовый, то выполнить замену
        If VarType(a(r, c)) = vbString Then a(r, c) = .Replace(a(r, c), ReplaceBy)
      Next
    Next


Ну, а в том фрагменте такая же строка замены выглядит так:
Case 8: a(r, c) = .Replace(a(r, c), ReplaceBy)
Где 8 это числовое значение константы vbString – см. VBA-справку по функции VarType.

Кроме того, я на всякий случай там обработал и ситуацию, когда в выгрузке или в результате каких-то дополнительных манипуляций появятся ячейки с числовыми типами данных. Case 2 To 6 означает с 2 по 6 и равносильно Case vbInteger To vbCurrency , это охватывает все типы числовых данных (см. справку по VarType). При этом даты, которые, по сути, тоже числовые, пропускаются, так как vbDate = 7 , что не попадает в интервал с 2 по 6.
Изменено: ZVI - 13.03.2013 16:12:36
 
ZVI, Спасибо за пояснения
Страницы: 1
Читают тему
Наверх