2017-05-25 6 views
0

Die Idee dahinter ist, VBA vlookup in Spalte G: AI von Blatt 11-13 zu Blatt1 zu verwenden. Header endet in Zeile 3 über alle Arbeitsblätter.Vlookup über mehrere Blätter hinweg

Ich habe die Codes wie folgt geschrieben. Der Code hält an der ws1.Cells(r, c).Value = Application.WorksheetFunction.VLookup(ws1.Cells(r, 1).Value, ws2.Range("A1:AI500"), colnum, False) zeigt Teilmenge außerhalb des zulässigen Bereichs und manchmal sogar

Laufzeitfehler ‚1004‘: Kann die VLookup Eigenschaft der Work Klasse erhalten.

Bitte beraten Sie auf dem Weg nach vorn.

Ich möchte Dateien für eine bessere Erklärung senden, aber ich kann nicht scheinen, die Funktion zum Anhängen zu finden. Vielen Dank !

Sub green_update() 


Dim wb As Workbook, ws1 As Worksheet, ws2 As Worksheet 

Set wb = ThisWorkbook 
Set ws1 = wb.Sheets("Sheet1") 
Set ws2 = wb.Sheets("Sheet13") 

Dim bil As String 
Dim lastrow As Long 
Dim for_col As Long, i As Long, r As Long, c As Long, colnum As Long 
r = 4: c = 7: colnum = 7 

'mysheets = "sheet11:sheet12:sheet13" 
'i would like to allow vlookup to search through all sheet 11-13 

For for_col = 1 To ws2.Cells("4", Columns.Count).End(xlToLeft).column 
lastrow = ws2.Cells(Rows.Count, "A").End(xlUp).row 

    For i = 1 To lastrow - 3 

    ws1.Cells(r, c).Value = Application.WorksheetFunction.VLookup(ws1.Cells(r, 1).Value, ws2.Range("A1:AI500"), colnum, False) 
    r = r + 1 
    Next 

r = 4 
colnum = colnum + 1 
c = c + 1 

Next 

End Sub 
+1

Sie sagten, das ist Ihr Code und wenn Sie nicht wissen, ob es funktioniert oder nicht, woher wissen wir das? – sktneer

+1

Ich denke, er hat versucht, etwas Humor in seine Frage zu bringen @sktneer :). Ich kenne sein Arbeitsbuch nicht, aber wahrscheinlich fehlte er wegen seiner Variablen. – Mertinc

+1

Einfaches Beispiel https://Stackoverflow.com/a/42800024/4539709 – 0m3r

Antwort

1

Da Sie völlig geändert haben, was Sie gefragt haben .. Ich posten eine andere Antwort, um es klar zu machen. Noch ist Ihre Anfrage nicht vollständig klar, so dass einige Eingaben auf falsche Ziele verweisen können, aber Sie können diese leicht ändern. Wenn Sie kein Teil verstehen, zögern Sie nicht, es erneut zu fragen.

Option Explicit 
Sub green_update() 

Application.ScreenUpdating = False 

Dim zaman As Double 
zaman = Timer 
Dim wb As Workbook, ws1 As Worksheet, wsNames as Worksheet 

Set wb = ThisWorkbook 
Set ws1 = wb.Sheets("Sheet1") 

Dim colNo As Long, OthARowNo As Long, sh1ARowNo As Long 
Dim for_col As Long, i As Long, r As Long, c As Long, colnum As Long 

r = 4: c = 7: colnum = 7 

For Each wsNames In Sheets(Array("sheet11", "sheet12", "sheet13")) 
    colNo = wsNames.Cells("4", Columns.Count).End(xlToLeft).column 
    'Column numbers are 35 but you are working between G:AI which is 29 columns! 

    OthARowNo = wsNames.Cells(Rows.Count, "A").End(xlUp).row 
    sh1ARowNo = ws1.Cells(Rows.Count, "A").End(xlUp).row 

    For for_col = 7 To colNo 'colNo Is 35 Green columns start at 7th column, totally 29 loop, till 35th one. 
     For i = 1 To sh1ARowNo 'This should run until sh1's row number 
      ws1.Cells(r, c).Value = Application.VLookup(ws1.Cells(r, 1).Value, wsNames.Range("A1:AI" & OthARowNo), colnum, False) 
      If IsError(ws1.Cells(r, c).Value) Then 
       ws1.Cells(r, c).Value = "" 
      End If 
      r = r + 1 
     Next i 
     r = 4 
     colnum = colnum + 1 
     c = c + 1 
    Next for_col 
    colnum = 7 
    c = c + 6 'There are 6 columns between AI:AP and BR:BY 
Next wsNames 

Application.ScreenUpdating = True 

MsgBox Format(Timer - zaman, "00.00") & "secs" 
End Sub 
+0

Ich habe die Codes verwendet und es läuft. Die Spalten sind jedoch nicht vollständig gefüllt, da sie in der Spalte X stehen geblieben sind. Die Funktion vlookup erfasst die Daten aus den Blättern 11-13 nicht. Alles, was ich bekam, war ein standardisiertes Datum "0/1/1990". Und danke für den letzten Code, ich möchte tatsächlich die Daten aus Spalte 7 von jedem Blatt erfassen. – Carmen

+0

Wenn es nicht alles erfasst, ist dies, weil die nicht leere Zeilennummer von Blatt 1 in der Spalte D weniger als die Zeilennummer anderer Blätter ist. Sie können dieses Teil ändern, damit es für Ihr Blatt geeignet ist. Solange wir nicht jedes Detail Ihrer Arbeitsmappe vorhersagen und verwalten können, müssen Sie versuchen, einige der Details herauszufinden, die Sie ändern möchten. – Mertinc

+0

kann ich hier einen lastrow Code eingeben? lastrow = Zellen (Rows.Count, 1) .End (xlUp) .rowSo dass es bis zur letzten Zeile der Spalte D läuft und dann in die Spalte E und so weiter? – Carmen

1

Ich erklärte meine Antwort im Code, aber Ihre Probleme zusammenfassen:

1- Sie Ihre Variablen nicht definieren, vor allem Arbeitsblätter. Nehmen Sie nie Ihr Arbeitsblatt und immer definieren und Verweise auf Arbeitsbücher und Arbeitsblätter

2- Sie begrenzen Ihre For loops mit der Zeilennummer einer Spalte und Spaltennummer der 3. Reihe, aber was ist, wenn sie leer sind oder nicht kompatibel mit deinen Nachschlag-Runden? Dann können Sie Fehler oder falsche Ergebnisse erhalten. Definieren Sie sie sorgfältig.

Option Explicit 

Sub green_update() 
Dim wb As Workbook, ws1 As Worksheet, ws2 As Worksheet 

Set wb = ThisWorkbook 
Set ws1 = wb.Sheets("Sheet1") 'Change this Sheet1 name with your current Worksheet name 
Set ws2 = wb.Sheets("mysheets") 

Dim bil As String 'I don't know where do you use that variable. 
Dim lastrow As Long 'Prefer to work with Long instead of Integer 
Dim for_col As Long, i As Long, r As Long, c As Long, colnum As Long 
r = 4: c = 7: colnum = 7 


    For for_col = 1 To ws2.Cells("4", Columns.Count).End(xlToLeft).Column 
'This is important! Here in this case are you sure you, _ 
'you would like to define how many times your For loop will run based on 3rd row?  

lastrow = ws2.Cells(Rows.Count, "A").End(xlUp).Row 

'This is also important! Are you sure you would like to run your For loop_ 
'based on the row number of A column? I think you should define it -3 _ 
'because you start your lookup from D4 (so first 3 one Is not necessary) 

     For i = 1 To lastrow - 3 
      ws1.Cells(r, c).Value = WorksheetFunction.VLookup(ws1.Cells(r, 4).Value, ws2.Range("A1:AI500"), colnum, False) 
      r = r + 1 
     Next 
r = 4 
colnum = colnum + 1 
c = c + 1 

    Next 
End Sub 
+0

wäre es besser, wenn ich es so definiert hätte? Ich bin ziemlich neu und würde gerne die Führung bekommen. Das Hauptziel besteht also darin, Informationen von Spalte G bis AI von 3 separaten Blättern zu 1 Hauptblatt zu bekommen. Ich möchte die gesamte vlookup Formel von oben nach unten, dann von links nach rechts von Spalte G bis Spalte AI Schleife. Mein Header endet in Zeile 3 und daher die nächste verfügbare Zeile ist Zeile 4. Ich habe Ihre Lösung, aber in Zeile für for_col = 1 bis ws.Cells ("3", Columns.Count) .End (xlToLeft) aufgenommen. Spalte zeigt, dass "Objekt erforderlich" ist, wenn ich es ausführe. – Carmen

+0

@Carmen sollten Sie sich die ** VBA Best Practices ** ansehen, die mir/mir immer noch sehr geholfen haben. [Https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices#t = 201705250528371943986] – Mertinc

+0

danke für den Vorschlag! Werde mich definitiv darum kümmern. Aber in der Zwischenzeit, irgendeinen anderen Ratschlag, um die aktuelle Saite zu lösen? Wirklich brauchen eine schnelle Lösung dafür. :) – Carmen

Verwandte Themen