Доброго дня, уважаемые!Не могу осознать принцип работы следующего макроса и прошу разъяснить на пальцах:
Цитата |
---|
16 Май 2013 10:05:26 Казанский написал:
Код |
---|
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
.Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With |
|
По отдельности прочитал\посмотрел значения, но логика всего этого в одну строку не уловил. А также прошу подсказать, как указать текущую ячейку. Как я понял, из-за оператора "Evaluate" ссылка на ячейку происходит с помощью фразы " & .Address & ".
Конкретно мне требуется перебрать все ячейки (их значение - текст) удалив "лишние" пробелы, включая невидимые.
Нашёл несколько вариаций, включая цитируемый способ, и решил его доработать, другим вариантом:
Код |
---|
TRIM(CLEAN(SUBSTITUTE(("A1",CHAR(160),"" "")))
|
который, мне кажется, более предпочтительным, но может я ошибаюсь в правильности выбора, так как не очень понял их описание, трактовка порой разная. Одни пишут, что удаляют всё, но зачем-то отдельно 160-ый символ обрабатывают, а другие перечисляют 120-ые вручную помимо операторов... В примере применяется 2 оператора TRIM(сжпробелы) и Clean(печсимв), но я не уверен, что они так же стирают эти 120-ые символы; и для 160 символа отдельно используется 3-ий оператор SUBSTITUTE(подставить).
В любом случае, я не понимаю, как мне указать текущую ячейку, которую требуется обработать, т. е. в другом коде:
Код |
---|
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
.Value =TRIM(CLEAN(SUBSTITUTE((XXX,CHAR(160),"" "")))
End With
|
Вместо XXX должно быть что-то вроде того же ".Value" или " & .Address & ", который мне и нужно обработать каждым шагом перебора или "Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value" - но это всё не работает.
Циклом For это выглядело бы нагляднее (пример)
Код |
---|
For i=1 to 10
If Range("A" & i).Value = " " Then Range("A" & i).Value = ""
End If: End For |
Т. е. тут в ячейку i-тую присваиваем результат работы с нею же, И-той ячейкой - я явно указал с какой ячейкой работал, а в коде выше я не знаю, как указать ссылку на И-тую ячейку, потому что не вижу упоминания "И-тости".
В первом коде, в качестве ссылки используется " & Address & " - тоже не понятная мне конструкция, и ничего умнее этого не придумал:
Код |
---|
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
.Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
.Value = TRIM(CLEAN(SUBSTITUTE((" & .Address & ",CHAR(160),"" "")))
'или
'.Value = TRIM(CLEAN(SUBSTITUTE((.Value,CHAR(160),"" "")))
End With |
где вместо XXX указал "Аддресс", но так не сработало =(
Да, в пользу найденного мною варианта с 3 операторами:
Цитата |
---|
Функция СЖПРОБЕЛЫ (TRIM) предназначена для удаления из текста знаков пробела 7-разрядного кода ASCII (значение 32). В наборе знаков Юникода существует дополнительный знак пробела, который называется знаком неразрывного пробела и имеет десятичное значение 160. Этот знак обычно используется на веб-страницах как сущность HTML . Сама по себе функция СЖПРОБЕЛЫ не удаляет этот знак неразрывного пробела. Пример синтаксиса, позволяющего удалить из текста оба знака пробела, см. в разделе Удаление пробелов и непечатаемых знаков из текста. ПЕЧСИМВ (CLEAN) Удаляет из текста первые 32 непечатаемых знака в 7-битном коде ASCII (значения с 0 по 31). СЖПРОБЕЛЫ (TRIM) Удаляет из текста знак пробела в 7-битной кодировке ASCII (значение 32). ПОДСТАВИТЬ (SUBSTITUTE) Можно использовать для замены символов Юникода с более высокими значениями (127, 129, 141, 143, 144, 157 и 160) знаками 7-битной кодировки ASCII, для которых предназначены функции СЖПРОБЕЛЫ и ПЕЧСИМВ. |
*Если я пойму принцип работы такого "цикла", то я многое смогу переделать с цикла for на этот.
*Косвенный вопрос: какой цикл\способ перебора быстрее работает? В итоге требуется перебирать много ячеек и либо редактировать их, например, удалять пробелы, а затем почищенные диапазоны сравнивать между собой (~80+ тысяч строк сравнить с ~60+ тысячами строк). Писать всё по детски\не профессионально циклом For мне, конечно, проще, нагляднее, но есть "пинок" сделать это лучше\быстрее, удобнее и короче в разы.
Благодарю за внимание и терпение!