Если условие внутри оператора С - PullRequest
0 голосов
/ 30 марта 2020

В приведенном ниже коде я фильтрую «PENDING: сначала, а затем фильтрую столбцы 10 и 2 в« USA »соответственно. Все отфильтрованные данные копируются. Но теперь я хочу фильтровать по« CANADA »и« USA », но хочу копировать только если ячейка в столбце 10 = "США" и ячейка в столбце 2 = "США" ИЛИ ячейка в столбце 10 = "КАНАДА" и ячейка в столбце 2 = "КАНАДА" Я знаю, как отфильтровать оба " США "и" КАНАДА ". Я хочу знать, где добавить условие If в код.

ub SS()

    Dim sourceWorkbook As Workbook
    Dim targetWorkbook As Workbook
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet

    Dim sourceWorkbookPath As String
    Dim targetWorkbookPath As String
    Dim lastRow As Long
    Dim lRow As Long, lCol As Long
    Dim LastCol As String




    ' Define workbooks paths
    sourceWorkbookPath = "Path 1"
    targetWorkbookPath = "Path 2"

    ' Set a reference to the target Workbook and sheets
    Set sourceWorkbook = Workbooks.Open(sourceWorkbookPath)
    Set targetWorkbook = Workbooks.Open(targetWorkbookPath)

    ' definr worksheet's names for each workbook
    Set sourceSheet = sourceWorkbook.Worksheets("WEXOS")
    Set targetSheet = targetWorkbook.Worksheets("Sheet1")



    With sourceSheet


        Row = .Range("J" & .Rows.Count).End(xlUp).Row

        '~~> Find the empty column after the last column
        lCol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1

        '~~> Get the column Name
        LastCol = Split(Cells(, lCol).Address, "$")(1)

        '~~> Insert the formula
        .Range(LastCol & "2:" & LastCol & lRow).Formula = "=IF(N2=""PENDING"",IF(OR(B2&J2=""USAUSA"",B2&J2=""CANADACANADA""),TRUE,FALSE),FALSE)"

        '~~> Remove existing filter
        .AutoFilterMode = False


        ' Get last row
         lastRow = .Range("J" & .Rows.Count).End(xlUp).Row

    With .Range("A1:" & LastCol & lRow)

          .AutoFilter Field:=lCol, Criteria1:="=TRUE"

        '.Range("A1:Q1").AutoFilter Field:=14, Criteria1:="PENDING"
        '.Range("A1:Q1").AutoFilter Field:=10, Criteria1:="USA", Operator:=xlOr, Criteria2:="CANADA"
        '.Range("A1:Q1").AutoFilter Field:=2, Criteria1:="USA", Operator:=xlOr, Criteria2:="CANADA"

    End With

        .Range("K2:K" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
                                     Destination:=targetSheet.Range("G2")
        .Range("C2:C" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
                                     Destination:=targetSheet.Range("A2")
        .Range("E2:E" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
                                     Destination:=targetSheet.Range("B2")
        .Range("G2:G" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
                                     Destination:=targetSheet.Range("C2")
        .Range("I2:I" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
                                     Destination:=targetSheet.Range("F2")
        .Columns(lCol).Delete


    End With

    'Rest of the Code


    On Error Resume Next
    sourceSheet.ShowAllData
    On Error GoTo 0

End Sub

1 Ответ

1 голос
/ 30 марта 2020

Это то, что вы пытаетесь?

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long, lCol As Long
    Dim LastCol As String

    '~~> Change this to the relevant sheet
    Set ws = Sheet1

    With ws
        '~~> Find the last row in col J
        lRow = .Range("J" & .Rows.Count).End(xlUp).Row

        '~~> Find the empty column after the last column
        lCol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1

        '~~> Get the column Name
        LastCol = Split(Cells(, lCol).Address, "$")(1)

        '~~> Insert the formula
        .Range(LastCol & "2:" & LastCol & lRow).Formula = "=B2=J2"

        '~~> Remove existing filter
        .AutoFilterMode = False

        '~~> Work with the relevant range
        With .Range("A1:" & LastCol & lRow)
           .AutoFilter Field:=14, Criteria1:="=PENDING"
           .AutoFilter Field:=10, Criteria1:="=Canada", Operator:=xlOr, Criteria2:="=USA"
           .AutoFilter Field:=2, Criteria1:="=Canada", Operator:=xlOr, Criteria2:="=USA"
           .AutoFilter Field:=lCol, Criteria1:="=TRUE"
        End With

        '
        '~~> Rest of your copy code
        '

        '~~> In the end delete the column after you finished copying
        .Columns(lCol).Delete
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...