"Ответник" на вопросник:
Цитата: Мне не нравится это If Rows(i).Text = "" Then
Неявное приведение интерепретирует Null как False в то же время, как при наличии данных в яейках проверка всей строки все равно выдет Null...
Великий Уокенбах для проверки строки на пустоту советует использовать Application.CountA(). Но она (эта функция), опять же, работает медленнее. Что касается If Rows(i).Text="", то мне такая конструкция нравится. Не совсем верно то, что она Null интерпретирует как False. Точнее, она Null интерпретирует как "". Более того, сравнивать можно только на равенство с пустотой (""). Если же нужно проверить, что строка не пуста, то только так: If Rows(i).Text="" Then Else... Т.е. запись If Rows(i).Text<>"" Then..., также, как и If Not Rows(i).Text="" Then... не приведет к ошибке, но выдаст ошибочный результат.
Цитата: Как-то подозрительно гладко и просто
Есть существенное ограничение на применение данного способа, т.к. кроме апострофов исчезнут все формулы и связи (если таковые присутствовали). Все будет преобразовано в значения. Кстати говоря, иногда требуется выполнить именно такую задачу.
Цитата: Сугубо частный случай. Нужно общее решение. И для 10-ти и 20-ти...
Кто не дает использовать цикл For i=1 To 20 ? Явного перебора ячеек в макросе нет (что есть хорошо). А цикл Replace-ов много времени не займет.
Цитата: А вот как быть в общем случае, когда этот невидимый апостроф является значащим?
Могут ведь и последовательности пробелов тоже оказаться значащими
Благодаря опции xlWhole, примененной в методе Replace, очищены будут только те ячейки, которые кроме пробела(ов) больше не содержат ни одного символа. Логично предположить, что такие пробелы вряд ли могут быть значащими. Аналогично и с апострофом: если ячейка, помимо лидирующего апострофа содержит хотя бы один значащий символ (пусть даже еще один апостроф), то, во-первых, ее содержимое будет видно на рабочем листе. Во-вторых, она считается непустой и, соответственно, очищена не будет.
Вообще, я преследовал цель, убрать все символы, которые не видно в ячейках рабочего листа, т.е. сделать их пустыми. Вторая цель - это избежать явный перебор ячеек.
Цитата: Впрочем, когда доходит уже до таких узких задач обработки текстовых данных...
Абсолютно с Вами согласен. Если есть полный и точный список того, что нужно очищать, то все выполнимо. А если нет... К каждой задаче требуется индивидуальный подход. Но в данном конкретном случае, автор вопроса просил удалить все пустые, а также те, которые "кажутся" пустыми (т.е. содержат символы невидимые на рабочем листе) строки и столбцы.
Цитата: Я уже второй раз обращаю внимание ВСЕХ на необходимость отбойного
Application.ScreenUpdating = True
По большому счету, Вы правы. Но, если в проекте не предусматривается вызов процедуры из процедуры, то True восстанавливается поле окончания работы макроса. Попробуйте, например, выполнить процедуру, после выхода из которой, значение Application.ScreenUpdating не устанавливается в True. Затем попробуйте выполнить другую процедуру, которая никак не затрагивает Application.ScreenUpdating. Очевидно, что обновление экрана осуществляется.
Повторяюсь, что во избежании возможных неприятностей, для более сложных проектов и для проектов, использующих события, лучше это значение восстанавливать. А если речь идет об отдельно взятом макросе, то можно этого и не делать. Каюсь. Грешен. Я часто "не закрываю скобки", применяя ScreenUpdating, DisplayAlerts, On Error Resume Next и т.п. Во-первых, просто лень. Во-вторых, в таком случае, нужно следить за ходом выполнения всех процедур проекта в целом.