2016-04-15 7 views
1

Ich habe den folgenden Code geschrieben, um Werte aus einem externen Blatt in meine Arbeitsmappe mithilfe einer Indexübereinstimmungsschleife zu bringen. Wenn der Fehler auftritt, sollte die Index/Match-Formel einen anderen Wert aus einem Arbeitsblatt in meiner aktuellen Arbeitsmappe abrufen.IFERROR mit INDEX/MATCH in VBA

Die Schleife funktioniert, bis es den ersten Wert erreicht, der aus dem Arbeitsblatt in meiner aktuellen Arbeitsmappe importiert werden soll.

Und Ideen, wie ich die IF ISERROR-Schleife beheben kann, um die Werte zu bringen?

Sub UpdateFile() 

    Dim wbMVRVFile As Workbook 
    Dim wbNewMV As Workbook 
    Dim wsRevFile As Worksheet 
    Dim wsMvFile As Worksheet 
    Dim wsMvOld As Worksheet 
    Dim wsRevOld As Worksheet 
    Dim wsNewMV As Worksheet 
    Dim wsTempFile As Worksheet 
    Dim FrRngCount As Range 
    Dim i As Integer 
    Dim b As Integer 
    Dim y As Integer 


    Set wbMVRVFile = Workbooks("Databook_2016.xlsm") 

    Set wsMvOld = wbMVRVFile.Worksheets(2) 
    Set wsRevOld = wbMVRVFile.Worksheets(1) 
    Set wsTempFile = wbMVRVFile.Worksheets("TempFile") 

    wbMVRVFile.Worksheets.Add().Name = "MV " & Format(DateSerial(Year(Date), Month(Date), 0), "dd-mm-yy") 

    Set wsMvFile = wbMVRVFile.ActiveSheet 

    Set FrRngCount = wsMvOld.Range("A:A") 
    i = Application.WorksheetFunction.CountA(FrRngCount) 

    wsTempFile.Range("A1:A" & i).Value = wsMvOld.Range("A1:A" & i).Value 

    Set wbNewMV = Workbooks.Open("F:\Reports\Data\NReport" &   Format(DateSerial(Year(Date), Month(Date), 0), "yyyymmdd") & ".xls") 
    Set wsNewMV = wbNewMV.Worksheets(1) 

    Set FrRngCount = wsNewMV.Range("B:B") 
    y = Application.WorksheetFunction.CountA(FrRngCount) 

    b = i + y - 2 

    wsTempFile.Range("A" & i & ":A" & b).Value = wsNewMV.Range("B2:B" & y).Value 
    wsTempFile.Range("A1:A" & b).AdvancedFilter Action:=xlFilterCopy,  CopyToRange:=wsMvFile.Range("A1"), Unique:=True 


    Set FrRngCount = wsMvFile.Range("A:A") 
    y = Application.WorksheetFunction.CountA(FrRngCount) 

    'i = 2 

    For i = 2 To y 

    If Not IsError(wsMvFile.Range("B" & i) = Application.WorksheetFunction.Index(wsNewMV.Range("C1:C" & Cells(Rows.Count, "C").End(xlUp).Row), Application.WorksheetFunction.Match(wsMvFile.Range("A" & i), wsNewMV.Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row), 0), 1)) Then 

    wsMvFile.Range("B" & i) = Application.WorksheetFunction.Index(wsMvOld.Range("B1:B" & Cells(Rows.Count, "C").End(xlUp).Row), Application.WorksheetFunction.Match(wsMvFile.Range("A" & i), wsMvOld.Range("A1:A" & Cells(Rows.Count, "B").End(xlUp).Row), 0), 1) 

    End If 

    Next i 

End Sub 
+0

'wsMvOld.Range (" B1: B "& Zellen (Rows.Count," C "). Ende (xlUp) .Row" ist einfach falsch. Qualifizieren Sie das ".Cells" übergeordnete Arbeitsblatt. Siehe [this] (http://stackoverflow.com/questions/27763089/count-the-number-of-rows-in-another-sheet/27763394#27763394). – Jeeped

Antwort

1

Sie müssen die Range.Parent property des Range.Cells property qualifizieren, dass Sie die Range object zu definieren, verwenden, wenn Sie mit dieser Methode zur Referenzierung einer Reihe fortzusetzen.

Allerdings können Sie diese Methode zugunsten der prägnanter Range.Columns Eigenschaft aufgeben.

A WorksheetFunction object ist etwas anders als ein streng Excel Application object. Die reagiert besser auf Letzteres, da der Fehler in eine Variantentypvariable übernommen und untersucht werden kann, anstatt einen Laufzeitfehler zu werfen.

Dim vrw As Variant 

For i = 2 To y 
    vrw = Application.Match(wsMvFile.Range("A" & i), wsNewMV.Columns(2), 0) 
    If IsError(vrw) Then 
     vrw = Application.Match(wsMvFile.Range("A" & i), wsMvOld.Columns(1), 0) 
     If Not IsError(vrw) Then _ 
      wsMvFile.Range("B" & i) = Application.Index(wsMvOld.Columns(2), vrw) 
    Else 
     wsMvFile.Range("B" & i) = Application.Index(wsNewMV.Columns(3), vrw, 1) 
    End If 
Next i 

Dies könnte davon profitieren, in einem With ... End With statement außerhalb der Schleife eines der Arbeitsblätter verweisen, vor allem so, wie Sie die Referenzen innerhalb einer Schleife wiederholen, aber ich habe alles redundant jetzt verwiesen links.

Natürlich könnten Sie die Formeln immer einfach in alle Zellen auf einmal schreiben und sie dann auf ihre zurückgegebenen Werte zurücksetzen.

+0

Danke für Ihre Hilfe Jeeped.Wenn ich Ihren Code ausführen, bekomme ich eine Kompilierung Fehler "Argument nicht optional". Es sieht so aus, als ob es etwas mit der Bereichsdefinition für diesen Teil wsMvOld.Range.Columns (1) zu tun hat. Irgendwelche Ideen? –

+0

Es war 'wsMvOld.Columns (1)' nicht 'wsMvOld.Range .Columns (1) '. – Jeeped

+0

Ja, das hat es behoben. Danke dafür. Aber wenn ich den Code ausführe, springt er immer noch aus der Schleife, sobald er den Wert aus der Backup-Quelle (dem Arbeitsblatt innerhalb meiner aktuelle Arbeitsmappe) Warum würde das passieren? –