Страницы: 1
RSS
.Replace с текстом и числами. Отказывается заменять, пропускает запятую.
 
Подскажите пожалуйста - как правильно выставить настройки для .Replace, что бы он работал также, будто это пользователь выполняет "найти/заменить".
Дело в том, что при выставлении числового определенного формата .Replace не будет работать с числами, у которых присутствуют знаки, которые по формату не вошли в ячейку. А при выставлении  текстового формата(+когда число сохранено как текст) .Replace заменяет число, но пропускает запятую о_0), превращая 2,354 в 2354.
Настройки хотелось бы выставить что бы макрос одинаково работал с ячейками с числом, датой и текстом. Если это конечно возможно.
Пример прилогаю.

Или направьте на мысль, а то сам зашел в тупик(
Ps извиняюсь за Range через Cells, просто использую переменные для его определения в основном коде.  
Изменено: Владимир Шаматонов - 16.10.2020 08:32:22
Не перестаю удивляться возможностям excel и VBA.
 
Код
Найти = Range("B6").Text
ЗаменитьНа = Range("B7").Text
Данные = Cells(1, 2).Text

If Len(Данные) = Len(Найти) Then
    Cells(1, 2) = Replace(Данные, Найти, ЗаменитьНа)
End If
Изменено: Alemox - 16.10.2020 09:18:45
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Спасибо, пока не разобрался с .Replace, примерно так и пытался решить проблему (без .Text это не работало)
Можно еще вопрос - после замены не хочется оставлять "зеленый треугольничек", а преобразовать текст в число по средствам умножения на единицу в коде почему то также ведет к исчезновению запятой, превращая 2,354 в 2354.
Умножаю так:
Код
Cells(1, 2).Formula = Application.Evaluate("=" & rДанные.Address & "*" & 1)
Не перестаю удивляться возможностям excel и VBA.
 
Владимир Шаматонов,
Код
Cells(1, 2).Formula = Application.Evaluate("=" & rДанные.Address) * 1
Не бойтесь совершенства. Вам его не достичь.
 
Спасибо, так работает.
Вот что значит бездумно копировать готовые строки(
Не перестаю удивляться возможностям excel и VBA.
 
Цитата
Владимир Шаматонов написал:
без .Text это не работало
Неправда ваша
Это не работает при использовании Range.Replace Method (почему, самому до кончика хвоста любопытно), и работает при использовании Replace Function
 
Цитата
RAN написал:
(почему, самому до кончика хвоста любопытно),
Да всё те же заморочки с региональными настройками. Поменяйте в региональных настройках разделитель целой и дробной части с (",") на ("."), и всё будет прекрасно работать.
Тема с похожей проблемой, только там с разделителем элементов списка траблы, хотя в этой решение другое )
Изменено: Александр П. - 16.10.2020 10:49:50
 
Цитата
Андрей написал:
до кончика хвоста любопытно
Давно планирую создать тему, посвященную "тайнам" метода Range.Replace.
Совет поменять региональные настройки считаю неправильным, завтра появится пример, который рассчитывает на запятую в качестве разделителя.
Пока несколько особенностей метода Range.Replace
1. Метод при замене значений ячеек игнорирует региональные настройки. Когда пользователь работает в диалоговом окне Найти/Заменить, региональные настройки учитываются
2. Метод игнорирует текстовый формат ячейки
3. После замены метод пытается интерпретировать новый текст как число или дату (в соответствии с "американскими" настройками)

Разбираем Ваш пример.
В ячейке B1 у Вас текст "1,234", то же в ячейке B6. В ячейке B7 - число 2,354.

Вызываем метод Replace. Аргументы метода What и Replacement  должны интерпретироваться как строки, поэтому число 2,354 преобразовывается (с учетом, естественно, региональных настроек) в текст "2,354". Далее метод производит замену текста ячейки и на промежуточном результате получается текст "2,354". Наконец, метод Replace интерпретирует текст "2,354" как число 2354, поскольку запятая в "американских" настройках является разделителем тысяч. Это число и заносится в B1, несмотря на то, что ячейка B1 имеет текстовый формат.
Изменено: sokol92 - 16.10.2020 15:52:19
Владимир
 
Владимир, добрый день.
Пришел к тем-же выводам. Кстати, функция ведет себя аналогично.
Когда я вставил преобразование типа не в то место, получил совершенно ту же козу.
Код
[b1] = Replace(Данные, Найти, CDbl(ЗаменитьНа)

Разница лишь в том, что функция не проявляет излишней самостоятельности. И если ей скормили текст, то она и вернет текст.

Владимир Шаматонов, измените строку , и бубен будет не нужен.
Код
Cells(1, 2) = CDbl(Replace(Данные, Найти, ЗаменитьНа))
Изменено: RAN - 16.10.2020 16:48:26
 
Андрей, приветствую! Козы всё-таки разные. :)

Если в условиях сообщения #1 вместо Range.Replace выполнить Ваш оператор из #9:

Код
[b1] = Replace(Данные, Найти, CDbl(ЗаменитьНа))

то значением ячейки B1 будет текст "2,354", так как формат ячейки текстовый (и только Range.Replace это игнорирует).

Если же формат ячейки B1 в исходном файле поменять на "Общий", то, действительно, после выполнения макроса в ячейке будет число 2354 (а формат ячейки изменится на числовой с разделителями). Но это уже "тайны" присвоения свойства Value ячейки (попытка интерпретировать тексты как числа и даты в "американском" формате). О свойстве Value я тоже года три собираюсь создать тему (наверное, пора).
Владимир
 
Спасибо за внимание к теме. Разделитель пробовал менять на точку - сильно уж не привычно это смотрится, боюсь сам запутаюсь в данных.
RAN, спасибо за решение, Владимир, спасибо за подробный комментарий.
От варианта с .Text пришлось отказаться, т.к. он не корректно работает со специально сокращенными(числовым форматом) значениями.
В качестве рабочей версии пока оставил вот такой вариант, что бы избежать лишних ошибок Replace, добавив пару условий для работы с датами и текстом одновременно.  
Не перестаю удивляться возможностям excel и VBA.
Страницы: 1
Наверх