#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