При использовании метода Replace в VBA числа сохраняются в виде строк

Я работаю с книгой, в которой в качестве разделителя тысяч используется странное пространство. Числа, включающие этот разделитель, рассматриваются как текст в Excel. Когда я удаляю этот разделитель, используя Find & amp; Замените инструмент, числа будут правильно распознаны как числа. Когда я делаю то же самое, используя VBA, используя метод Cells.Replace, числа сохраняются в виде текста. Затем в ячейках, содержащих эти числа, появляется зеленый угол, что позволяет мне преобразовать их в числовой формат, но эта опция не представляется пригодной для использования в VBA, поскольку это действие не записывается устройством записи макросов.

Я могу скопировать ячейки моего листа в массив, затем перебрать значения, чтобы заменить разделитель тысяч, а затем вставить массив обратно в лист. У меня вопрос: есть ли более эффективный способ удалить эти тысячи разделителей, чтобы мои числа рассматривались как числа?

 Cutter09 апр. 2012 г., 19:16
@SiddharthRout:link
 Tony Dallimore09 апр. 2012 г., 19:00
Я предполагаю, что странным пространством является Chr (160), которое является неразрывным пространством, но что бы это ни было, вы должны знать, чтобы иметь возможность его заменить. Лучшее, что я могу придумать, это цикл с использованием Finding для установкиRng к каждой клетке, содержащей странное пространство. ЕслиRng не являетсяNothing, Rng.Value = Val(Replace(Rng.Value,StrangeSpace, " ")) убрать странное пространство и форсировать оценку результата.
 Cutter09 апр. 2012 г., 19:20
@TonyDallimore: пространство действительно неразрывное пространство. Но использование метода Find в цикле оказывается медленным. Копирование значений листа в массив и редактирование их в нем происходит намного быстрее. Единственная проблема заключается в том, что я получаю "Недостаточно памяти" ошибка с очень большими таблицами.
 Siddharth Rout09 апр. 2012 г., 18:57
Можете ли вы загрузить образец рабочей книги, заполнив всего 5 ячеек, чтобы мы могли увидеть, что это за странный персонаж? Вы можете загрузить образец файла на wikisend.com и поделиться ссылкой здесь.
 Tony Dallimore09 апр. 2012 г., 19:37
Вы можете попытаться загрузить 10 000 (или что-то еще) строк за один раз, чтобы избежать "недостаточно памяти" ошибка. Как вы заставляете пересмотреть отредактированные значения?

Ответы на вопрос(3)

Решение Вопроса

качестве десятичного разделителя были сохранены в виде текста. С использованиемCells.Replace метод в VBA для удаления пробела не преобразовывал значения в числовой формат, а оставлял их сохраненными в виде текста. Решение было с помощьюCells.Replace во второй раз заменить запятую на точки для VBA, чтобы обработать значения как числа и скопировать их на лист как таковой. Затем Excel форматирует числа в соответствии с региональными настройками (при необходимости заменяя точки на запятые).

то просто удаление пробела не решит проблему. Вам также необходимо удалить запятую, чтобы преобразовать ее в число, а затем отформатировать, используя правильный разделитель тысяч. Смотрите этот код и снимки

SNAPSHOT

enter image description here

CODE

Sub Sample()
    With Sheets("Feuil1").Columns(2)
        .Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        .Replace What:=",", Replacement:="", LookAt:=xlPart, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        .NumberFormat = "#,##0"
    End With
End Sub

НТН

 Cutter09 апр. 2012 г., 21:00
... Поскольку я не могу использовать метод .Replace, лучшим решением, похоже, является копирование значений Range в массив, удаление пробелов и замена запятых наApplication.DecimalSeparatorзатем копирование массива обратно в диапазон. Одна из проблем заключается в том, что при этом удаляются все ведущие апострофы, используемые для принудительного преобразования текста в моей таблице, поскольку они не включены в свойства .Value или .Formula.
 09 апр. 2012 г., 21:56
Да. Вам не хватает одной строки в коде. Что произойдет, если вы включите код для замены & quot;, & quot; с & quot; & quot; также? Не включать.NumberFormat = "#,##0" в данный момент
 Cutter09 апр. 2012 г., 20:54
Я понимаю, что решение должно работать с любыми региональными настройками. Десятичный разделитель моей системы - это кома (,), таким образом, удаляя пробел, используя Find & amp; Инструмент замены (без VBA) достаточен для Excel, чтобы рассматривать значение как число. Однако внутренний десятичный разделитель VBA представляется точкой (.), Поэтому, когда я использую метод .Replace, как вы это сделали, VBA думает, что он работает со строкой, и копирует отредактированное значение обратно в ячейку как строка. Вот почему я получаю зеленый угол, предлагающий преобразовать ячейку в числовой формат после использования метода .Replace.
 Cutter09 апр. 2012 г., 21:11
Я это сделал. Как я пытался объяснить, Find & amp; Метод замены работает, когда я делаю это вручную: содержимое ячейки преобразуется в числа. Но когда я воспроизводлю записанный макрос, содержимое ячейки остается в текстовом формате, и Excel предлагает преобразовать их в числа с помощью маленькой кнопки, которая появляется рядом с ячейкой.Imgur
 09 апр. 2012 г., 21:04
Другим способом будет запись макроса :) А затем вручную скопируйте данные между 9 и 5. Затем выполните замену. аналогично замените десятичный разделитель. Видишь, что макрос выплевывает?

Проблема исходит от региональных настроек Excel. (то есть: во Франции числа отформатированы в 1234,56, тогда как в английской версии Excel это будет 1234,56) Использование find & amp; заменить инструмент, не влияет на региональные настройки.

Однако при использовании VBA для замены точек на запятую, VBA, основанная на английском языке, устанавливает все числа в виде строки. Если вы замените разделители на точки, цифры будут отображаться в соответствии с региональными настройками (точки для английских настроек, комы для Франции).

Надеюсь это поможет

Ваш ответ на вопрос