VBA проверка, содержит ли строка листа несколько переменных

У меня проблема с циклическим переходом через лист, чтобы найти строку, соответствующую некоторым переменным.

У меня есть 8 столбцов на строку, и я хочу найти строку, которая содержит 6 переменных, одну пустую ячейку и одну ячейку со значением 0. Вроде этого:

- | A / B | C | D | E | F | G |H / 
i / x1 / / x2 / 0 | x3 / x4 | x5 | x6 |

Где iномер строки иx1,x2,.. x6переменные, полученные из CSV-файла. Я хочу проверить, является ли мой «список» переменных {x1, ,x2,0,x3,x4,x5,x6}существующей строкой в листе. Поэтому я хочу, чтобы программа делала что-то If (Ai = x1 And Bi = "" And Ci = x2 And Di = "0" And Ei = x3 And Fi = x4 And Gi = x5 And Hi = x6)и ничего не делала, когда Else.

Поэтому мне нужно пройти через все строки и проверить, все ли переменные находятся в 1 строке.

На данный момент я пытался это, но это, кажется, не работает.

LastCol = 8
LastRow = ThisWorkbook.Sheets("Boekingen AMS-IAD").Range("A" & Rows.Count).End(xlUp).Row

For i = 1 To LastRow
    For j = 1 To LastCol
        'Tried with only 1 criteria, still didn't work
        If (ThisWorkbook.Sheets("Boekingen AMS-IAD").Cells(i, j).Value = x1) Then
            Accept = "nvt"
        End If
    Next j
Next i

3 ответа

  1. Вы можете попробовать что-то вроде этого. Я оставил все так, как было у тебя, за несколькими исключениями.

    lastcol = 8
    
    Dim vars
    
    ReDim vars(1 To lastcol)
    
    'Set vars() to the values you're looking for in the columns.
    
        LastRow = ThisWorkbook.Sheets("Boekingen AMS-IAD").Range("A" & Rows.Count).End(xlUp).Row
    
        For i = 1 To LastRow
            accept = ""
            met = 0
            For j = 1 To lastcol
                With ThisWorkbook.Sheets("Boekingen AMS-IAD").Cells(i, j)
                If .Value = vars(j) Then
                    met = met + 1
                End If
                End With
            Next j
            If met = lastcol Then accept = "nvt"
            'At this point you have to do something with the row you just
            ' found--maybe leave the loop and do something, or do something
            ' before going to the next row.
        Next i
    
  2. Я сделал этот быстрый маленький тестовый sub в новой папке excel, переименованной Sheet1в имя вашего листа, и он отлично работает:

    Sub testing()
        Dim ws As Worksheet
        Dim rng As Range
    
        Set ws = ThisWorkbook.Sheets("Boekingen AMS-IAD")
        LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
        For i = 1 To LastRow
            If ws.Cells(i, 1).Value = x1 And _
            ws.Cells(i, 2).Value = "" And _
            ws.Cells(i, 3).Value = x2 And _
            ws.Cells(i, 4).Value = "0" And _
            ws.Cells(i, 5).Value = x3 And _
            ws.Cells(i, 6).Value = x4 And _
            ws.Cells(i, 7).Value = x5 And _
            ws.Cells(i, 8).Value = x6 Then
                'MsgBox "nvt at row " & i
                Accept = "nvt"
            End If
        Next i
    
    
    End Sub
    

    Это должно выплюнуть «nvt», когда строка следует за вашими переменными 🙂

    PS-любой, кто хочет проверить этот код, вам просто нужно добавить следующее под Dim rng as Range:

        Dim x1 As Integer
        Dim x2 As Integer
        Dim x3 As Integer
        Dim x4 As Integer
        Dim x5 As Integer
        Dim x6 As Integer
    
        x1 = 1
        x2 = 1
        x3 = 1
        x4 = 1
        x5 = 1
        x6 = 1