2016-11-07 7 views
-1

Ich muss Vlookups für Daten in 2 Arbeitsmappen ausführen. Ich werde beide meine Arbeitsmappen öffnen, wenn die VBA-Codes ausgeführt werden, und ich speicherte beide Arbeitsmappen als XLSM, so dass beide Makro aktiviert sind.Vlookup in 2 Arbeitsmappen

Ich habe kein Problem mit der Vlookup Excel-Funktion, aber ich möchte es automatisch mit VBA-Code ausführen. Hier

ist die Information,

Ich habe 2 Arbeitsmappen, Book3.xlsm und Book32.xlsm. Book3 ist, wo ich mein Ergebnis haben möchte, wie im zweiten Bild gezeigt. Der Datenbereich variiert jeden Monat, also muss ich das Ende der letzten Zeile durchlaufen.

Ich habe 3 Spalten in Book3 ID und Typ und Ergebnis und 2 Spalten in Book32, ID und Ergebnis, und ich möchte Vlookup mit der ID-Spalte in Book3 und erhalten Sie die Werte in Ergebnisspalten in Book32. Die Daten befinden sich beide in Sheet1.

Jetzt wird mein Code ausgeführt, aber bitte suchen Sie nach dem ersten Bild, wo es nicht das gewünschte Ergebnis zeigt. Ich kann den Wert als # N/A belassen, wenn er nicht gefunden wird, aber in diesem Fall sollten alle Werte mit Vlookup gefunden werden.

Hier ist mein Code,

Sub test() 
    On Error Resume Next 
    Dim Res_Row As Integer 
    Dim Res_Clm As Integer 
    Dim Table1 As Range 
    Dim Table2 As Range 
    Dim cl As Range 
    Set Table1 = Workbooks("Book3.xlsm").Sheets("Sheet1").Columns("A:C") 
    Set Table2 = Workbooks("Book32.xlsm").Sheets("Sheet1").Columns("A:B") 
    Res_Row = Sheet1.Range("C2").Row 
    Res_Clm = Sheet1.Range("C2").Column 
    For Each cl In Table1 
     Sheet1.Cells(Res_Row, Res_Clm) = Application.WorksheetFunction.VLookup(cl, Table2, 2, False) 
     Res_Row = Res_Row + 1 
    Next cl 

    MsgBox "Done" 

End Sub 

enter image description here enter image description here

+1

Ich habe festgestellt, dass vlookup fehlerhaft ist, wenn Werte nicht [sortiert von AZ] (http://blog.contextures.com/archives/2016/03/03/excel-vlookup-sorting-problem/) noch [kleinste zum größten] (https://www.ablabits.com/office-addins-blog/2014/08/27/excel-vlookup-not-working/) und [einige andere erwartete Sachen] (https: //www.ablebits .com/office-addins-blog/2014/04/09/warum-excel-vlookup-not-working /), tendiere ich dazu, es möglichst zu vermeiden, weil es mir in der Vergangenheit Probleme bereitet hat und ich persönlich empfehle, ein zu machen UDF stattdessen. – Sgdva

Antwort

3

Wie über diesen Code, der die Schleife vermeidet und einfacher \ halten zu lesen.

With Workbooks("Book3.xlsm").Sheets("Sheet1") 

    Dim lRow as Long 
    lRow = .Range("A" & .Rows.Count).End(xlup).Row 

    With .Range("C2:C" & lRow) 
     .FormulaR1C1 = "=Vlookup(RC[-2],[Book32.xlsm]Sheet1!C1:C2,2,0)" 
     .Value = .Value 
    End With 

End With 
+0

Vielen Dank für die schnelle Antwort, wenn ich die Codes ausführen, habe ich einen Laufzeitfehler 9 von Index außerhalb des Bereichs und der Fehler zeigt auf diese Zeile mit Arbeitsmappen ("Book3"). Sheets ("Sheet1") – sc1324

+1

@ Johndi - Sehen Sie meine Änderungen und versuchen Sie es erneut. Sorry getestet nachdem ich als Antwort gepostet habe. –

+0

Nochmals vielen Dank, wenn ich den Code ausführen, gibt es jetzt einen Laufzeitfehler 1004, mit Application-Defined oder objektdefinierten Fehler und der Fehler zeigt auf diese Zeile, .FormulaR1C1 = "= Vlookup (RC [-2 ], [Book32.xlsm]! Blatt1! C1: C2,2,0) " – sc1324

1

Hier ist sie:

Sub test() 
    On Error Resume Next 
    Dim Res_Row As Integer 
    Dim Res_Clm As Integer 
    Dim Table1 As Range 
    Dim Table2 As Range 
    Set Table1 = Workbooks("Book3.xlsm").Sheets("Sheet1").Columns("A:C") 
    Set Table2 = Workbooks("Book32.xlsm").Sheets("Sheet1").Columns("A:B") 
    Res_Clm = 3 

Die Schleife auf jeder Zeile der Tabelle 1 sein wird.

For Each i In Table1.Rows 
     If Sheet1.Cells(i.row, 1) = "" Then Exit For 

Wenn keine Daten ("") in der Zelle ist, das Programm zu beenden die Schleife

 Sheet1.Cells(i.row, Res_Clm) = Application.WorksheetFunction.VLookup(Sheet1.Cells(i.row, 1), Table2, 2, False) 
    Next i 

Next i die i der für jede Schleife erhöhen .. Es ist wie i = i +1

MsgBox "Done" 

End Sub 

Sie verwenden das falsche Argument für das erste Argument des vlookup. Auch Ihre Schleife auf "cl" würde nur in drei Zeilen arbeiten, also verwende ich Zeilenargument.

Im Allgemeinen würde ich advise Code Ihre Vlookup-Funktion statt Application.WorksheetFunction.VLookup verwenden. Ich bin mir ziemlich sicher, dass es länger ist.

+0

danke kannst du diese Zeilen erklären und was sie tun? Wenn Sheet1.Cells (i.row, 1) = "" Dann Exit für Sheet1.Cells (i.row, Res_Clm) = Anwendung.WorksheetFunction.VLookup (Sheet1.Cells (i.row, 1), Tabelle2, 2, Falsch) Als nächstes habe ich – sc1324

+1

@Johndi Ich habe den Beitrag bearbeitet, um die Zeile zu erklären, aber ich denke, Sie sollten ein grundlegendes VBA-Tutorial lesen, anstatt den Makro-Recorder zu verwenden. – timat