Запускать код VBA VLOOKUP только для отфильтрованных / видимых ячеек - PullRequest
0 голосов
/ 19 июня 2020
Sub ActivityMatching()

Worksheets("AuroraData").Activate
Set lookRange = Sheets("AuroraData").Range("A2:D1000")

Worksheets("PO List").Activate
ActiveSheet.Range("CD1").AutoFilter Field:=82, Criteria1:="Yes"     //set the filter to "Yes" in Col CD
LastRow = Sheets("PO List").Cells(Rows.Count, "AK").End(xlUp).Row

With Application

    For i = 3 To LastRow
            Worksheets("PO List").Cells(i, 52) = .VLookup((Worksheets("PO List").Cells(i, 37).Value & Worksheets("PO List").Cells(1, 52).Value), lookRange, 4, False)
    Next i

End With

Worksheets("PO List").Activate

End Sub

Я пытаюсь использовать код VBA для VLOOKUP на двух листах. Если я запущу приведенный выше код, я получу результат (в столбце AZ).

enter image description here

Часть ВПР работает. Проблема в том, что я хочу запускать код VBA только для строк со значением «Да» в столбце CD. Если строка имеет «Нет» в столбце CD, я хочу, чтобы код VBA пропустил ее и ничего не делал (эти строки должны заполняться вручную, поэтому я не хочу, чтобы мой код VBA стирал существующие данные. в этих строках).

Я не могу понять, как это сделать ... ниже я пытался использовать xlCellTypeVisible, но это не сработало. У меня все еще есть значения # Н / Д в этих строках «Нет».

With Application
    For Each rw In filter_rng.SpecialCells(xlCellTypeVisible)
         For i = 3 To LastRow
            Worksheets("PO List").Cells(i, 52) = .VLookup((Worksheets("PO List").Cells(i, 37).Value & Worksheets("PO List").Cells(1, 52).Value), lookRange, 4, False)
        Next i
     Next rw

Как мне отредактировать свой код, чтобы он мог пропустить эти строки с «Нет» в столбце CD? Заранее спасибо!

1 Ответ

1 голос
/ 19 июня 2020

Проверить правильность смещения столбцов и индексов

Option Explicit

Sub ActivityMatching()

Dim wsToLook As Worksheet
Set wsToLook = ThisWorkbook.Sheets("AurorData")
Dim rngToLook As Range
Set rngToLook = wsToLook.Range("A2:D1000")

Dim wsMain As Worksheet
Set wsMain = ThisWorkbook.Sheets("PO List")

Dim iCell As Range
Dim rngToInsert As Range
Dim lastRow As Long
Dim whatToFind As Variant

    With wsMain

        .Range("A1:CD1").AutoFilter Field:=82, Criteria1:="Yes"    
        lastRow = .Cells(.Rows.Count, "AK").End(xlUp).Row

        Set rngToInsert = .Range("AZ3:AZ" & lastRow).SpecialCells(xlCellTypeVisible)

        For Each iCell In rngToInsert
            whatToFind = iCell.Offset(, -15).Value & .Cells(1, 52).Value
            iCell.Value = Application.VLookup(whatToFind, rngToLook, 4, False)
        Next iCell

    End With

End Sub

Проблема в вашем коде

For Each rw In filter_rng.SpecialCells(xlCellTypeVisible)
     For i = 3 To LastRow
          ' here you was iterating through every "i" row
          ' and you was doing that many times 
          ' equal to amount of "yes" in a range
          ' what makes no sense ;)
          ' filter_rng.SpecialCells(xlCellTypeVisible).Cells.Count * (lastRow - 2)

          Worksheets("PO List").Cells(i, 52) = something

     Next i
Next rw
...