
Ich habe 2 Listen auf zwei separaten Blättern und versuche, sie in einem dritten Blatt zu kombinieren. Diese Listen werden automatisch basierend auf Benutzereingaben ausgefüllt, sodass die Anzahl der Zeilen in der Liste variieren kann. Sobald in der ersten Spalte von Blatt 1 nichts erkannt wird, beginnt es, die Liste auf Blatt 3 mit den Spalten von Blatt 2 zu füllen, wie folgt
Blatt1
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
Blatt 2
Make Model License Plate
Dodge Charger 34TRLS2
VW Passat V70YTR
Blatt 3
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
Dodge Charger 34TRLS2
VW Passat V70YTR
Aktualisieren:
Das Problem, das bei mir auftritt, wenn ich VBA zum Kopieren und Einfügen verwende, besteht darin, dass die Formeln, die zum automatischen Ausfüllen der ursprünglichen Liste auf Blatt 1 verwendet werden, eingefügt und identifiziert werden. Da die Formeln eingefügt werden, wird nicht richtig identifiziert, wo sich die letzte Zelle auf Blatt 3 befindet.
Sub Copy_Alternatives()
Worksheets("CNA eTool Alternatives").Range("A:A").Copy
Worksheets("Repair Replacement Recom").Range("A:A").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("B:B").Copy
Worksheets("Repair Replacement Recom").Range("B:B").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("C:C").Copy
Worksheets("Repair Replacement Recom").Range("C:C").PasteSpecial xlPasteValues
End Sub
Sub Copy_Paste_Range()
Dim lNewRow As Long
Dim lDataRow As Long
ThisWorkbook.Activate
lNewRow = Worksheets("CNA eTool Addit. Alternatives").Cells(Worksheets("CNA eTool Addit. Alternatives").Rows.Count, "H").End(xlUp).Row
lDataRow = Worksheets("Repair Replacement Recom").Cells(Worksheets("Repair Replacement Recom").Rows.Count, 1).End(xlUp).Row
lDataRow = lDataRow + 1
Worksheets("CNA eTool Addit. Alternatives").Range("H2:J" & lNewRow).Copy
Worksheets("Repair Replacement Recom").Range("A" & lDataRow).PasteSpecial
End Sub
Antwort1
Sie können dies mit Arbeitsblattfunktionen erstellen.
Nehmen wir an, Ihr erstes Blatt ist Sheet1
und das zweite istExtra1
Fügen Sie die folgende Formel in Ihr zusammengeführtes Blatt auf A2 ein und kopieren Sie sie anschließend in die anderen Zellen:
=IF(ROW()>COUNTA(Sheet1!A:A)+COUNTA(Extra1!A:A)-1,"",INDIRECT(IF(ROW()<=COUNTA(Sheet1!A:A),"Sheet1!","Extra1!")&SUBSTITUTE(ADDRESS(1,COLUMN(),4),1,"")&ROW()-IF(ROW()<=COUNTA(Sheet1!A:A),0,COUNTA(Sheet1!A:A)-1)))
Und so funktioniert es:
- Überprüft, ob die aktuelle Zeile höher ist als die Zeilenanzahl auf dem ersten Blatt + dem zweiten Blatt minus eins (weil beide Kopfzeilen haben).
- Wenn die aktuelle Zeile größer ist, wird sie leer angezeigt. Andernfalls wird mit dem nächsten Schritt fortgefahren.
- Bereitet eine vor
INDIRECT
. Wenn die aktuelle Zeile tiefer liegt als die Zeilen auf dem ersten Blatt, wird der Name des ersten Blatts abgerufen. Andernfalls wird der Name des zweiten Blatts abgerufen. - Es verwendet den
SUBSTITUTE + ADDRESS
Trick, um den aktuellen Buchstaben der Spalte zurückzugeben. Das ist gut, weil es dann für alle Felder die gleiche Formel verwendet und akzeptiert, selbst wenn die Spalte AA wird - Schließlich ruft es die aktuelle Zeile ab, wenn die aktuelle Zeile kleiner ist als die Anzahl der Elemente auf dem ersten Blatt. Andernfalls ruft es die aktuelle Zeile MINUS der Zeilenanzahl des ersten Blatts minus eins ab, um die Startzeile des zweiten Blatts zurückzugeben.
Ich weiß, es ist etwas überwältigend und schwieriger zu lesen, aber Formeln sind manchmal besser als VBA.
Bearbeiten: Tja, ich hatte eine Erleuchtung und eine funktionierende VBA-Version
Sub merge()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Set ws1 = Sheets("Sheet1") 'First sheet to get merged
Set ws2 = Sheets("Extra1") 'Second sheet to get merged
Set ws3 = Sheets("Merged") 'Name of the sheet you want results
Dim lr As Long 'To return the number of the last row
Dim arrayone As Variant
lr = ws1.Cells(Rows.Count, 1).End(xlUp).Row
arrayone = Range(ws1.Cells(2, 1), ws1.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr2 As Variant
lr = ws2.Cells(Rows.Count, 1).End(xlUp).Row
arr2 = Range(ws2.Cells(2, 1), ws2.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr3 As Variant
ReDim arr3(1 To UBound(arrayone, 1) + UBound(arr2, 1), 1 To 3)
For i = 1 To UBound(arr3, 1)
For j = 1 To 3
If i <= UBound(arrayone, 1) Then
arr3(i, j) = arrayone(i, j)
Else
arr3(i, j) = arr2(i - UBound(arrayone, 1), j)
End If
Next j
Next i
Range(ws3.Cells(2, 1), ws3.Cells(UBound(arr3) + 1, 3)).Value = arr3
End Sub