AW: Datenzuweisung
16.08.2006 06:32:39
ingUR
Hallo, Werner,
ich bin nicht sicher, ob ich die Aufgabe richtig verstehe, wenn ich meine, dass Du in der Spalte A der Tabelle 1 und der Tabelle 2 zwei Datenreihen vorliegen hast und dann jede dieser Zahlen miteinander vergleichen willst, um dann, wenn eine Übereinstimmung gefunden wird, diesen Wert an das Ende der Spalte A auf dem Tabellenblat 2 anfügen willst.
Doch Du schreibst auch, dass die Spalte A auf der Tabelle 2 bis zur Zeie 12362 durchlaufen werden soll, andererseits denkst Du aber auch an die möglichkeit, dass Zelle A3 und folgende auf dem Tabellenbaltt erst beschrieben werden könnten («Wenn A1/Tabelle1 = A1/Tabelle2 dann kopiere A2/Tabelle1 in A3/Tabelle2 (wenn A3/Tabelle2 schon beschrieben ist dann prüfe A4, etc ... » ).
Das birgt doch die Gefahr, das die Spaltenlänge ins Endlose wächst, oder? Und was soll beim Vergleich mit dem Letzten Werte der Tabelle 1 geschehen? Hat dieser einen nachfolge Wert ( r1=18017: Sht2!A[Anfügen] = Sht1!A[r1+1])? Es wäre vielleicht hilfreich die Ausgangsdatenreihe als Beispiel zu sehen.
SUB Vergleich()
r1 = 1
+<------------------------------
r2 = 1 |
+<-------------------------- |
IF Sht1!A[r1] = Sht2!A[r2] ---> nein | |
ja | | |
Sht2!A[Anfügen] = Sht1!A[r1+1] | | |
+<--------------------- | |
r2 = r2 + 1 | |
r2 > 12365 ----------------- nein |
ja : dann Schritt 3 |
r1=r1+1 |
r1 > 18017 ---------------------nein
END SUB
Wenn ich also so Deine Aufgbe richtig verstanden habe - Einschränkung siehe oben -, dann ist eine doppelte For-Schleife zu erledigen, wobei bei gefundener Gleichheit, immer der Wert, für den die Gleichheit festgestellt wurde, an das Ende der Tabelle 2 angefügt wird.
Dazu ist es m.E. sinnvoll, dass Ende der Tabelle 2 einmal vor Beginn der Schleifen festzustellen und dann in der Schleife den Zähler für diese nächste freie Zeile hochzusetzen, um dann in diese Zelle den Gleicheitswert zu schreiben.
NextFreeRinA_ws2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1
Hier also die Befehlszeilen zum Flußdiagramm:
Option Explicit
Sub DreiSchritt()
Dim ws1 As Worksheet, r1 As Long, maxr1 As Long
Dim ws2 As Worksheet, r2 As Long, maxr2 As Long
Dim NextFreeRinA_ws2 As Long
Set ws1 = Worksheets("Tabelle1")
Set ws2 = Worksheets("Tabelle2")
NextFreeRinA_ws2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row + 1
maxr1 = 18017
maxr2 = 12363
For r1 = 1 To maxr1
For r2 = r1 + 1 To maxr2
If ws1.Cells(r1, 1) = ws2.Cells(r2, 1) Then
ws2.Cells(NextFreeRinA_ws2, 1) = ws1.Cells(r1, 1)
NextFreeRinA_ws2 = NextFreeRinA_ws2 + 1
If NextFreeRinA_ws2 = 65536 Then
MsgBox "Letzte Zeile in Spalte A in Tabelle 2 erreicht!"
Exit Sub
End If
End If
Next r2
Next r1
End Sub
Natürlich könnten auch die Felder der Spalte A auf der Tabelle 1 und die Felder der Spalte A auf der Tabelle 2 jeweils in Datenfelder Daten1(1:18017) und Data2(1:12362) geschrieben werden, so dass dann statt Zelleninhalte Daten der Datenfelder miteinader verglichen werden und bei gleichheit in ein drittes Datenfeld, Daten3(18017+?) - siehe hierzu auch meine Frage oben -, geschrieben werden. Am Ende wird dann dieses Datenfeld ausgegeben.
Vielleicht bietet diese Darstellung ein paar Anregungen zur Lösung, auch wenn ich vielleicht Deine Aufgabenstellung nicht richtig erkannt haben sollte.
Gruß,
Uwe