Решение Дамиана работает, но кто-нибудь знает, почему On Error Goto
не превосходит все типы ошибок на скриншоте, он проходит #DIV/0!
, но не любую другую ошибку.
Я пишу код для Чистая обрезка всех ячеек в книге. Если повезет, я могу сделать это с помощью приведенного ниже кода.
On Error GoTo c
For Each ws In wb.Worksheets
Set rng = ActiveSheet.UsedRange
For Each cl In rng
Debug.Print cl.Address
cl.Value = WorksheetFunction.Clean(Trim(cl.Value))
GoTo l
c:
counter = counter + 1
l:
Next
Next
Но проблема возникает, когда любая из ячеек содержит значения ошибок, как на снимке экрана ниже.
On Error Goto
VBA может превзойти ошибку #DIV/0!
и выделить значение для счетчика, но не для других ошибок. Он застревает в этих ячейках.
@Vegard ... Вот файл с кодом ... (drive.google.com/open?id=17H07sqzVIFOMj2psHTq6cduPq2kiUSqc) .. Если вы видите, обработчик ошибок должен пропустить все ошибки, но это только пропуск #DIV/0!
Это должно решить ваши проблемы:
On Error GoTo c
For Each ws In wb.Worksheets
Set Rng = ws.UsedRange 'activesheet will always be the sheet you are using clicking the macro button
For Each cl In Rng
Debug.Print cl.Address
If Not IsError(cl) Then cl = WorksheetFunction.Clean(Trim(cl)) 'check first if the value is an error, if it's not then trim
GoTo l
c:
counter = counter + 1
l:
Next
Next
Мысль, использующая UsedRange
, будет перебирать все ячейки, даже если они пусты, но когда-то использовались. Остерегайтесь этого.
Он хочет посчитать ошибки. Ваше решение не поможет с этим.
@Damian ..... Это решило мою проблему, но знаете ли вы, почему On Error Resume Next
не превосходит эти ошибки?
@Adirmola нигде в своем коде не считал ошибки.
@MohitBansal Я не могу вам этого сказать, потому что я не уверен, но я могу сказать вам, что это работает после того, как что-то происходит, но в этом случае, поскольку ячейка является ошибкой, она не может оценить ячейку, отсюда и ошибка. Использование IsError(Cell)
позволит вам обрабатывать ячейки с ошибками.
@ Дамиан ... Я считаю ошибки в переменной counter
, но все в порядке. Я изменил ваше решение в своем коде, и оно работает нормально. Тем не менее, я все еще задаюсь вопросом о следующем возобновлении при ошибке.
Да, я все еще хочу спать, вы могли бы избавиться от On Error GoTo c
и метки c:
с помощью моего кода, просто проверяя, была ли ошибка, а затем добавляя счетчик.
On Error
срабатывает для меня на#N/A
, поэтому не совсем уверен, в чем тут дело. Я предполагаю, что ячейки содержат фактическую ошибку, а не номер ошибки или дескриптор или, например, просто текст «#N/A»? "#Н/Д" - это строка, а не ошибка, так что если это так, то код ее не ловит. Проверьте это, введя=NA()
как формулу в какую-нибудь ячейку, это имитирует ошибку#N/A
. Ваш код должен срабатывать при этом.