2017-01-12 2 views
0

У меня есть проблема, проходящая через лист, чтобы найти строку, соответствующую некоторым переменным.Проверка 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 
+0

Должны ли они быть в таком порядке или вы хотите проверить, содержит ли строка их все в любом порядке? – GSerg

+0

Как это работает? Вы получили сообщение об ошибке? FYI вы должны * всегда * определять диапазоны, поэтому измените свою строку на: 'LastRow = ThisWorkbook.Sheets (« Boekingen AMS-IAD »). Диапазон (« A »и« ThisWorkbook.Sheets »(« Boekingen AMS-IAD »). Строки. Count) .End (xlUp) .Row' – BruceWayne

+0

GSerg yes, они должны быть в указанном порядке. У меня нет ошибки, она просто не дает выход «nvt» для Accept, пока он должен это делать. Особенно сейчас у меня есть только один из 8 критериев, где я уверен, что существует более одной строки, которая содержит значение переменной x1. – Stan

ответ

0

Я исправил проблему, проблема не в том, чтобы перебирать лист, а в значение переменной. Дата была изменена с D-M-Y на M-D-Y, когда я прочитал ее с листа Excel. Но я решил, что для тех, кто интересуется ответом: VBA changes date format from D-M-Y to M-D-Y

0

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

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 
+0

Как установить vars() в нужные значения? Значения: (x1, "", x2, "0", x3, x4, x5, x6), второе значение должно быть пустой ячейкой. – Stan

+0

Если x1 и т. Д. Являются фактическими переменными VBA, вы можете просто назначить их, как в 'vars (1) = x1' и т. Д. 'vars (2) =" "' и 'vars (4) = 0' Код ниже ниже - он будет обрабатывать любое количество проверок, которые вы хотите, но в какой-то момент вам нужно инициализировать значения вручную или внешний источник значений. – vknowles

+0

Теперь он дает мне пустые значения ("") для Accept. Поэтому, пока «accept =» «он работает, но цикл все еще не работает. Я еще ничего не поставил после «Если met = lastcol Then accept =« nvt »».Считаете ли вы, что это проблема? Если да, то что я должен попробовать там поставить? – Stan

0

Я сделал это быстрый маленький тест суб в новую папку первенствовать, переименованный 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 
+0

Это дает мне ошибку в «Для каждого rng ​​в ws.Range (« A1: A »и lastRow)». Ошибка 1004 при выполнении: Метод Диапазон объекта object_Worksheet не удался. Ошибка может быть сформулирована несколько иначе, потому что мой Excel не на английском языке. – Stan

+0

@Stan Спасибо за головы! Я обновил свой ответ на использование '.Cells', как и вы, надеюсь, это поможет :) – hammythepig

+0

В настоящее время ошибок нет, но результата нет с nvt. Я чувствую, что цикл работает, но что-то не так со значениями может быть? Когда я устанавливаю LastCol равным 1 и устанавливаю «Если ws.Cells (i, 1) .Value = x1», он все равно ничего не найдет, в то время как в первом столбце содержится более 1 строки, содержащих значение x1. Если я изменил «Если ws.Cells (i, 1) .Value = x1» to «Если ws.Cells (i, 1) .Value =« 4-sep-16 »« он все равно ничего не найдет. («4-sep-16» - это значение x1) – Stan

Смежные вопросы