Подскажите пожалуйста - как правильно выставить настройки для .Replace, что бы он работал также, будто это пользователь выполняет "найти/заменить". Дело в том, что при выставлении числового определенного формата .Replace не будет работать с числами, у которых присутствуют знаки, которые по формату не вошли в ячейку. А при выставлении текстового формата(+когда число сохранено как текст) .Replace заменяет число, но пропускает запятую о_0), превращая 2,354 в 2354. Настройки хотелось бы выставить что бы макрос одинаково работал с ячейками с числом, датой и текстом. Если это конечно возможно. Пример прилогаю.
Или направьте на мысль, а то сам зашел в тупик( Ps извиняюсь за Range через Cells, просто использую переменные для его определения в основном коде.
Найти = Range("B6").Text
ЗаменитьНа = Range("B7").Text
Данные = Cells(1, 2).Text
If Len(Данные) = Len(Найти) Then
Cells(1, 2) = Replace(Данные, Найти, ЗаменитьНа)
End If
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Спасибо, пока не разобрался с .Replace, примерно так и пытался решить проблему (без .Text это не работало) Можно еще вопрос - после замены не хочется оставлять "зеленый треугольничек", а преобразовать текст в число по средствам умножения на единицу в коде почему то также ведет к исчезновению запятой, превращая 2,354 в 2354. Умножаю так:
Неправда ваша Это не работает при использовании Range.Replace Method (почему, самому до кончика хвоста любопытно), и работает при использовании Replace Function
RAN написал: (почему, самому до кончика хвоста любопытно),
Да всё те же заморочки с региональными настройками. Поменяйте в региональных настройках разделитель целой и дробной части с (",") на ("."), и всё будет прекрасно работать. Тема с похожей проблемой, только там с разделителем элементов списка траблы, хотя в этой решение другое )
Давно планирую создать тему, посвященную "тайнам" метода 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 имеет текстовый формат.
Владимир, добрый день. Пришел к тем-же выводам. Кстати, функция ведет себя аналогично. Когда я вставил преобразование типа не в то место, получил совершенно ту же козу.
Код
[b1] = Replace(Данные, Найти, CDbl(ЗаменитьНа)
Разница лишь в том, что функция не проявляет излишней самостоятельности. И если ей скормили текст, то она и вернет текст.
Если в условиях сообщения #1 вместо Range.Replace выполнить Ваш оператор из #9:
Код
[b1] = Replace(Данные, Найти, CDbl(ЗаменитьНа))
то значением ячейки B1 будет текст "2,354", так как формат ячейки текстовый (и только Range.Replace это игнорирует).
Если же формат ячейки B1 в исходном файле поменять на "Общий", то, действительно, после выполнения макроса в ячейке будет число 2354 (а формат ячейки изменится на числовой с разделителями). Но это уже "тайны" присвоения свойства Value ячейки (попытка интерпретировать тексты как числа и даты в "американском" формате). О свойстве Value я тоже года три собираюсь создать тему (наверное, пора).
Спасибо за внимание к теме. Разделитель пробовал менять на точку - сильно уж не привычно это смотрится, боюсь сам запутаюсь в данных. RAN, спасибо за решение, Владимир, спасибо за подробный комментарий. От варианта с .Text пришлось отказаться, т.к. он не корректно работает со специально сокращенными(числовым форматом) значениями. В качестве рабочей версии пока оставил вот такой вариант, что бы избежать лишних ошибок Replace, добавив пару условий для работы с датами и текстом одновременно.