VBA Excel 2016 Проход по нескольким диапазонам возвращает значение смещения - PullRequest
0 голосов
/ 08 октября 2018

Проблема:

В столбце K & L есть значения, в зависимости от того, есть ли у ячейки значение (число). Я хочу вернуть значение смещения =RC[-4]

Хорошо работает следующее:

K4 имеет значение, L4 имеет значение, ничего не делает.
K5 имеет значение, L5 не имеет значения,value = =RC[-4]

У меня возникают проблемы, когда L переопределяется числом (что разрешено), но VBA все еще переопределяет это число при запуске макроса.Например:

Скажем =RC[-4] равно 20 Если K4 имеет значение и L4 равно 10, пропустите эту ячейку.В настоящее время VBA переопределит значение в L4 на 20

Глядя на него под другим углом:
If K4 <> "" And L4 = "" Then "= RC[-4] "Остальные пропущенные / следующие ячейки (K5 / L5, K6 / L6 и т. Д.)

Это мой требуемый результат, но мои исследования и знания отсутствуют ...

Sub AccrualValue3()   
    Dim rng As Range
    Dim Exrng As Range

    Last_Row = Range("H" & Rows.Count).End(xlUp).Row - 1

    Set rng = Range("K4:K" & Last_Row)
    Set Exrng = Range("L4:L" & Last_Row)

    For Each cell In rng
        If cell.Value <> "" Then
            For Each cell2 In Exrng
                If cell2.Value = "" Then
                    cell.Offset(0, 1).Value = "=RC[-4]"
                Else
                    cell.Offset(0, 1).Value = ""
                End If
            Next
        End If
    Next
End Sub

1 Ответ

0 голосов
/ 08 октября 2018

Проще использовать цикл For … To, просто считая номера строк.Также вам не нужен второй цикл для этого.

Option Explicit

Sub AccrualValue3()
    Dim LastRow As Long
    LastRow = Range("H" & Rows.Count).End(xlUp).Row - 1

    Dim iRow As Long
    For iRow = 4 To LastRow
        If Cells(iRow, "K").Value <> "" And Cells(iRow, "L").Value = "" Then
            Cells(iRow, "L").Value = Cells(iRow, "L").Offset(ColumnOffset:=-4).Value
        End If
    Next iRow
End Sub

В качестве альтернативы вы можете выбрать все пустые ячейки в столбце L с помощью .SpecialCells(xlCellTypeBlanks) и проверить столбец K только для этих ячеек.Это должно быть быстрее, если у вас много строк, потому что он проверяет только те строки, где столбец L пуст, но не каждая строка.

Sub AccrualValue3ALTERNATIVE()
    Dim LastRow As Long
    LastRow = Range("H" & Rows.Count).End(xlUp).Row - 1

    Dim EmptyCellsInColumnL As Range
    Set EmptyCellsInColumnL = Range("L4:L" & LastRow).SpecialCells(xlCellTypeBlanks)

    Dim Cell As Range
    For Each Cell In EmptyCellsInColumnL
        If Cell.Offset(ColumnOffset:=-1).Value <> "" Then
            Cell.Value = Cell.Offset(ColumnOffset:=-4).Value
        End If
    Next Cell
End Sub

Обратите внимание, что вычитая 1 из последнегоиспользованная строка

LastRow = Range("H" & Rows.Count).End(xlUp).Row - 1

оставляет последнюю использованную строку необработанной.

...