2012-02-10 3 views
0

Я пытаюсь выяснить способ запуска Vlookup на ячейке в «Системном файле», проверив таблицу в файле «Новые данные». ОДНАКО, если есть ошибка # N/A, я хочу, чтобы значения ячеек не изменялись. Я придумал следующее, однако, я продолжаю получать ошибку «Следующий без». Возможно ли избежать вложенного цикла For Next?Next Without Для ошибки в вложенном цикле в Excel VBA

ТЛ; др семантическая версия:

For i 1 to 10 
     For j 1 to 3 
      Something with .Cells(i,j) 
      Set range X = .Find(thing 
      If X = Nothing Then 
      Next j *** <THIS IS WHERE MY ERROR IS THROWN 
      Else 
      -Do Something with X- 
      End if 
     Next j 
    Next i 

Мой более или менее реальный код выглядит следующим образом:

Sub Thing() 
    Dim SysWS As Worksheet 
    Dim NewDataWS As Worksheet 
     Dim NDSKUs As Range ' This is set to the first column of the NewDataWS 
     Dim NDMonthsRow As Range ' This is set to the first row of the NewDataWS  
    Dim SKU2look4 As String, Month2look4 As String   
     Dim ifoundtheSKU As Range 'the result of finding SKU2look4 inside of NDSKUs range 
     Dim ifoundtheDate As Range 'the result of finding Month2look4 inside of NDMonthsRow range 
    Dim i As Integer, j As Integer 
    Dim workzone As Range 'The Cell being evaluated 
For i = 2 To SysWS.UsedRange.Columns.Count 
    For j = 2 To SysWS.UsedRange.Rows.Count 
    Set workzone = SysWS.Cells(j, i) 
     SKU2look4 = SysWS.Cells(j, 1) 'SKUs are along the left column 
     Month2look4 = SysWS.Cells(1, i) 'Dates are along the top row 

'1-Find the right Date Column for extraction 
    Set ifoundtheDate = NDMonthsRow.Find(What:=Month2look4, LookIn:=xlValues, _ 
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
        MatchCase:=False, SearchFormat:=False) 
     If ifoundtheDate Is Nothing Then 
        Debug.Print (Month2look4 & " -Date NOT Found in New Date File") 
        ******Next j****** 
     Else 
        Debug.Print ("ifoundtheDate:" & ifoundtheDate.Address) 
     End If 
'2-Find the row 
    Set ifoundtheSKU = NDSKUs.Find(What:=SKU2look4, LookIn:=xlValues, _ 
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
        MatchCase:=False, SearchFormat:=False) 
     If ifoundtheSKU Is Nothing Then 
        Debug.Print (SKU2look4 & " Not Found in the New Data File") 
        *********Next j****** 
      Else 
        Debug.Print ("ifoundtheSKU:" & ifoundtheSKU.Address) 
     End If 

'Set the "workzone" cell's value to that of the found row offset by the found column 
       workzone = ifoundtheSKU.Offset(, (ifoundtheDate.Column - 1)) 
    Next j 
Next i 

Конечно, *** s не на самом деле там. Любые мысли о том, как я могу это сделать? Заранее спасибо

ответ

7
For i = 1 to 10   
    For j = 1 to 3 

    Something with .Cells(i,j) 

    Set rngX = .Find(thing)   
    If Not rngX Is Nothing Then 

     Set rngY = .Find(thingelse) 
     If Not rngY Is Nothing Then 
      'something with rngX and rngY 
     End If 

    End if 

    Next j  
Next i 
+1

+1. Это правильный подход при использовании .FIND –

+0

+1 лучший подход – brettdj

+0

Этот подход определенно сработал, поэтому большое вам спасибо! Наверное, я просто чувствую, что логический поток тестирования для NOT Nothing = True неэлегантен. –

1

Использование

 For i=1 to 10 
      For j=1 to 3 
       Something with .Cells(i,j) 
       Set range X = .Find(thing 
       If X = Nothing Then 
       Goto Nextj *** <THIS IS WHERE MY ERROR IS THROWN 
       Else 
       -Do Something with X- 
       End if 
NextJ: 
      Next j 
     Next i 
+0

Я думал, что это считается плохой практикой для использования заявлений «Перейти»? В то же время это другой подход, который позволяет логический поток, о котором я думал. –

+1

Хорошая практика для меня - это тот, который работает :) и в этом случае будет работать хорошо. –

1

Выход Для завершает текущий цикл ранней (внутренний один в вашем случае).

+0

Он не хочет прерывать цикл for, он хочет перейти к следующей итерации. – mischab1