Проблема с обработкой ошибок VBA с пустыми ячейками

#vba #excel

#vba #excel

Вопрос:

Это образец части таблицы, с которой я работаю:введите описание изображения здесь

Эта таблица сгенерирована из какого-то другого кода VBA. Я написал простой скрипт для удаления терминов #VALUE из таблицы после ее создания.

 'Clean any value errors before charting

    With Worksheets("CG Raw Data")

    On Error Resume Next

    Range("A2:W2").End(xlDown).SpecialCells(xlCellTypeFormulas, xlErrors).ClearContents

    On Error GoTo 0

    End With

End Sub
  

Теперь таблица выглядит следующим образом:

введите описание изображения здесь

По какой-то причине этот код очищает весь столбец, если в нем есть какие-либо пробелы, а не только ошибки #VALUE. Я хочу, чтобы он просто удалил ошибки #VALUE и сохранил все остальные ячейки. Насколько я могу судить, код должен это делать. В чем ошибка?

Комментарии:

1. Не было бы проще просто обернуть формулы с помощью =IFERROR() ?

2. да, это сработало бы — в основном мне было просто любопытно, почему код очищал все столбцы от пробелов и как избежать этого для дальнейшего использования

3. Вместо этого вы могли бы использовать функцию VBA IsError . Вы бы перебрали все ячейки (с помощью For each cell in Range("A2:W2").End(xlDown) --- Next cell ) и проверили If IsError(cell) Then --- End If . Это ничего не должно делать для пустых ячеек.

4. Мне любопытно, что находится в этих пустых ячейках? Они действительно пустые? Я протестировал этот код в своем собственном диапазоне, и он отлично сработал.

5. Это не было устранено [Bear] полностью. Формулы в других столбцах каким-то образом зависят от формул, которые удаляются?

Ответ №1:

Моей первой рекомендацией было бы обернуть формулы с =IFERROR(,"").

В качестве альтернативы, должно сработать что-то вроде этого:

 DIM rngCell as Range

For Each rngCell In Worksheets(1).Range("A1:W" amp; Range("A1").End(xlDown).Row)
    If IsError(rngCell) Then
        rngCell.Clear
    End If
Next rngCell
  

Я бы предположил, что очищается весь набор данных, потому что вы проверяете весь диапазон и последовательно очищаете его, если какое-либо значение содержит ошибку.

У меня нет представителя, чтобы оставить комментарий.

Ответ №2:

Проблема № 1 — вы Withing являетесь конкретным рабочим листом, но не соответствуете Range()
Проблема # 2 — Вы очистите ошибки, отличные от #VALUE

Как насчет:

 Sub NoValue()
    Dim r As Range, N As Long

    With Worksheets("CG Raw Data")
        N = .Cells(Rows.Count, "W").End(xlUp).Row
        For Each r In .Range("A2:W" amp; N)
            If r.Text = "#VALUE!" Then r.ClearContents
        Next r
    End With
End Sub