Выбор диапазона для L oop и изменение значений N / A на последнее значение Numeri c - PullRequest
1 голос
/ 22 апреля 2020

Я использую этот код в попытке очистить потенциальные значения N / A в одном из столбцов.

Sub FixData()
Dim r As Range

Range("AL7").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select

For Each r In Selection
    If r.Text = "#N/A" Then
        r.Value = r.Offset(-1, 0).Value
    End If
Next

End Sub

Данные, которые я хочу очистить, находятся в области AL7: AS191. Область отмечена, но не похоже, что l oop работает. Значения N / A все еще там.

Я попытался сделать так, чтобы ответ от Gary's Student предложил здесь: Изменение значений # N / A в Excel на последнее значение без ошибок в электронной таблице

Нужны ли незначительные корректировки?

Всего наилучшего, Кристофер

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Это может помочь. Он использует встроенную функцию ISNA() для проверки значения #N/A.

Sub FixData()
    Dim cl As Range, rng As Range

    Set rng = Range("AL7:AS191")

    For Each cl In rng
        If Application.WorksheetFunction.IsNA(cl) Then
            cl = cl.Offset(-1, 0).Value
        End If
    Next
End Sub

Это предполагает фиксированный диапазон, то есть Range("AL7:AS191").

Вы можете динамически изменять размер этого диапазона, используя исходный код (с xlDown et c).

Конечная точка: вы можете использовать Range("AL7").CurrentRegion, чтобы выбрать весь блок клетки (пока они не являются непрерывным блоком).

0 голосов
/ 22 апреля 2020

Вместо того, чтобы использовать Select (см. Как не использовать select в Excel VBA ), объявите, с каким диапазоном или ячейкой вы работаете.

Что-то вроде ...

Dim myRange As Range
Dim LastRow as Long
Dim LastColumn As Long


With ThisWorkbook.Sheets("Sheet1")
    LastRow = .Cells(.Rows.Count, 38).End(xlUp).Row
    LastColumn = .Cells(7, .Columns.Count).End(xlToLeft).Column
    Set myRange = .Range("AL7", .Cells(LastRow,LastColumn))
End with

Dim myCell as Variant

For Each myCell In myRange
    If myCell.Text = "#N/A" Then
        myCell.Value = myCell.Offset(-1, 0).Value
    End If
Next

End Sub

Конечно, myRange этого набора довольно динамично, если проверяемые столбцы всегда одинаковы, вы можете установить диапазон следующим образом:

With ThisWorkbook.Sheets("Sheet1")
    LastRow = .Cells(.Rows.Count, 38).End(xlUp).Row
    Set myRange = .Range("AL7:AS" & LastRow)
End With
...