4 spalten in excel vergleichen
4 spalten in excel vergleichen
hallo zusammen
ich habe 4 spalten mit je ca. 200-300 nummern drin...
wie schaffe ich das am besten, jede nummer, welche in allen 4 spalten vorkommt in eine 5. spalte zu schreiben??
kann mir da bitte bitte jemand weiterhelfen??
danke
labi
hallo zusammen
ich habe 4 spalten mit je ca. 200-300 nummern drin...
wie schaffe ich das am besten, jede nummer, welche in allen 4 spalten vorkommt in eine 5. spalte zu schreiben??
kann mir da bitte bitte jemand weiterhelfen??
danke
labi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 45011
Url: https://administrator.de/contentid/45011
Ausgedruckt am: 26.11.2024 um 07:11 Uhr
30 Kommentare
Neuester Kommentar
Hallo Labi!
Ausgehend von Deiner Beschreibung habe ich die Anzahl der Nummern je Spalte variabel gelassen - Voraussetzung ist nur, dass die Spalten zusammenhängend befüllt sind (keine leeren Zellen zwischendurch) und alle 4 Spalten direkt nebeneinander stehen. Die Ergebnisse stehen dann unmittelbar neben der 4. Nummernspalte. Unter der Annahme, dass die erste Zahlenspalte in B ist und alle (auch die Ergebnisspalte) den ersten Eintrag in Zeile 3 bekommen sollen, müsste folgendes Script funktionieren:
Vorgangsweise:
Tabelle mit den Nummern öffnen, "Visual Basic-Editor" (Alt-F11) aufrufen, Doppelklick auf "Diese Arbeitsmappe" links oben, im jetzt geöffneten Fenster das Script einfügen, bei Bedarf die "Const"-Zeilen anpassen, den Cursor auf eine der "Const"-Zeilen stellen und mit dem "Play"-Button der Symbolleiste starten.
HTH
bastla
[Edit] 2 konstante Werte durch Variable "VonSpalte" ersetzt. [/Edit]
Ausgehend von Deiner Beschreibung habe ich die Anzahl der Nummern je Spalte variabel gelassen - Voraussetzung ist nur, dass die Spalten zusammenhängend befüllt sind (keine leeren Zellen zwischendurch) und alle 4 Spalten direkt nebeneinander stehen. Die Ergebnisse stehen dann unmittelbar neben der 4. Nummernspalte. Unter der Annahme, dass die erste Zahlenspalte in B ist und alle (auch die Ergebnisspalte) den ersten Eintrag in Zeile 3 bekommen sollen, müsste folgendes Script funktionieren:
Option Explicit
Sub Sammle()
Const VonZeile = 3
Const VonSpalte As Integer = 2 'Spalte B
Const SpaltenAnzahl As Integer = 4
Dim VonVergleich As Integer, BisVergleich As Integer
VonVergleich = VonSpalte + 1
BisVergleich = VonSpalte + SpaltenAnzahl - 1
Dim ZielSpalte As Integer
ZielSpalte = VonSpalte + SpaltenAnzahl
Dim i As Integer, j As Integer, k As Integer, z As Integer
Dim Nummer As Variant, ok As Boolean
i = VonZeile
z = VonZeile
Do While Cells(i, VonSpalte).Value <> ""
Nummer = Cells(i, VonSpalte).Value
ok = True
For j = VonVergleich To BisVergleich
k = VonZeile
Do While Cells(k, j).Value <> "" And Cells(k, j).Value <> Nummer
k = k + 1
Loop
If Cells(k, j).Value <> Nummer Then
ok = False
Exit For
End If
Next
If ok Then
Cells(z, ZielSpalte).Value = Nummer
z = z + 1
End If
i = i + 1
Loop
MsgBox "Fertig."
End Sub
Tabelle mit den Nummern öffnen, "Visual Basic-Editor" (Alt-F11) aufrufen, Doppelklick auf "Diese Arbeitsmappe" links oben, im jetzt geöffneten Fenster das Script einfügen, bei Bedarf die "Const"-Zeilen anpassen, den Cursor auf eine der "Const"-Zeilen stellen und mit dem "Play"-Button der Symbolleiste starten.
HTH
bastla
[Edit] 2 konstante Werte durch Variable "VonSpalte" ersetzt. [/Edit]
Hallo Labi!
Für aneinander grenzende Spalten ja - einfach die "Const"-Einträge anpassen, zB
Dann aber auch dafür sorgen, dass die Ausgabe der übereinstimmenden Nummern keine Daten überschreibt (da sie immer an die letzte Vergleichsspalte anschließt): Ersetze
zB durch
Für den Vergleich der Spalten 1 und 3, 1 und 4 oder 2 und 4 müsste man das Script etwas umbauen.
Grüße
bastla
Für aneinander grenzende Spalten ja - einfach die "Const"-Einträge anpassen, zB
Const VonSpalte As Integer = 4 'Spalte D
Const SpaltenAnzahl As Integer = 2
ZielSpalte = VonSpalte + SpaltenAnzahl
ZielSpalte = 10 'Spalte J
Grüße
bastla
Nur als Fussnote (ich wäre das Problem auch über ein Skript angegangen):
Zum Vergleich auf gleiche Werte in 2 Spalten gibt es hier eine schöne Excel-Formel www.excelformeln.de Formel 83
Ist eine meiner neuen Lieblingsseiten, seit Psycho Dad neulich auf die verwiesen hat.
Gruß
Biber
Zum Vergleich auf gleiche Werte in 2 Spalten gibt es hier eine schöne Excel-Formel www.excelformeln.de Formel 83
Ist eine meiner neuen Lieblingsseiten, seit Psycho Dad neulich auf die verwiesen hat.
Gruß
Biber
Schon bookgemarked
Heute mag ich mich nicht mehr reindenken, aber für 4 Spalten könnte das per Formel ganz amüsant sein ...
Grüße
bastla
Heute mag ich mich nicht mehr reindenken, aber für 4 Spalten könnte das per Formel ganz amüsant sein ...
Grüße
bastla
Hallo Labi!
Um auch nicht angrenzende Spalten zusammenfassen zu können, habe ich folgende Erweiterung vorgenommen:
Wenn in einer (anzugebenden - siehe neue erste "Const"-Anweisung) Markierungszeile für eine Spalte eine Markierung gesetzt wird (konkret, wenn die Zelle nicht leer ist), wird diese Spalte in den Vergleich mit einbezogen. Das folgende Beispiel würde also die Inhalte der Spalten C und E vergleichen:
Außerdem werden in der neuen Version die gesamten Inhalte der Ergebnisspalte gelöscht (falls aus irgendeinem Grund nicht gewünscht, vor die Zeile "Cells(1, ZielSpalte).EntireColumn.ClearContents" ein Apostroph setzen oder die Zeile löschen).
Die Festlegung der Ergebnisspalte (ZielSpalte) kann, abweichend von der berechneten Position unmittelbar rechts neben der letzten Nummernspalte, auch fix eingetragen werden (siehe Kommentar und Beispielzeile im Script).
Noch eine Anmerkung: Wenn verschiedene Varianten "durchgespielt" werden sollen, bietet es sich an, in der Tabelle eine Startmöglichkeit für das Script vorzusehen. Dazu kann zB ein ClipArt oder eine AutoForm eingesetzt werden: Die Grafik im Tabellenblatt platzieren, aus dem Kontextmenü "Makro zuweisen..." wählen und das Script "Sammle" angeben. Danach genügt ein Klick auf die Grafik, um das Script zu starten.
Grüße
bastla
Um auch nicht angrenzende Spalten zusammenfassen zu können, habe ich folgende Erweiterung vorgenommen:
Wenn in einer (anzugebenden - siehe neue erste "Const"-Anweisung) Markierungszeile für eine Spalte eine Markierung gesetzt wird (konkret, wenn die Zelle nicht leer ist), wird diese Spalte in den Vergleich mit einbezogen. Das folgende Beispiel würde also die Inhalte der Spalten C und E vergleichen:
A | B | C | D | E | |
1 | |||||
2 | x | x | |||
3 | 15 | 7 | 9 | 3 | |
4 | 17 | 9 | 15 | 7 | |
5 | ... | ... | ... | ... |
Die Festlegung der Ergebnisspalte (ZielSpalte) kann, abweichend von der berechneten Position unmittelbar rechts neben der letzten Nummernspalte, auch fix eingetragen werden (siehe Kommentar und Beispielzeile im Script).
Option Explicit
Sub Sammle()
Const MarkierungsZeile As Integer = 2
Const VonZeile As Integer = 3
Const VonSpalte As Integer = 2 'Spalte B
Const SpaltenAnzahl As Integer = 4
Dim ZielSpalte As Integer
ZielSpalte = VonSpalte + SpaltenAnzahl
'oder fixe Angabe einer Spaltennummer
'ZielSpalte = 10 'Spalte J
Dim ErsteSpalte As Integer
Dim VonVergleich As Integer, BisVergleich As Integer
Dim i As Integer, j As Integer, k As Integer, z As Integer
Dim Nummer As Variant, ok As Boolean
ErsteSpalte = 0
For i = VonSpalte To VonSpalte + SpaltenAnzahl - 1
If Cells(MarkierungsZeile, i).Value <> "" Then
ErsteSpalte = i
Exit For
End If
Next
If ErsteSpalte = 0 Then
MsgBox "Keine Spalte markiert."
End
End If
'Zielspalte löschen (Achtung, ganze Spalte wird gelöscht)
Cells(1, ZielSpalte).EntireColumn.ClearContents
VonVergleich = ErsteSpalte + 1
BisVergleich = VonSpalte + SpaltenAnzahl - 1
i = VonZeile
z = VonZeile
Do While Cells(i, ErsteSpalte).Value <> ""
Nummer = Cells(i, ErsteSpalte).Value
ok = True
For j = VonVergleich To BisVergleich
If Cells(MarkierungsZeile, j).Value <> "" Then
k = VonZeile
Do While Cells(k, j).Value <> "" And Cells(k, j).Value <> Nummer
k = k + 1
Loop
If Cells(k, j).Value <> Nummer Then
ok = False
Exit For
End If
End If
Next
If ok Then
Cells(z, ZielSpalte).Value = Nummer
z = z + 1
End If
i = i + 1
Loop
MsgBox "Fertig."
End Sub
Grüße
bastla
Zusammenfassung:
In den Spalten A bis D steht (ab welcher Zeile?) eine unbestimmte Anzahl von Zahlen, von denen all jene, die in mindestens zweien dieser Spalten vorkommen, in eine gemeinsame Ergebnisspalte geschrieben werden sollen, wobei im Ergebnis jede Zahl nur einmal aufscheinen soll (übrigens: Sortieren hätte ich heute im Sonderangebot ).
Zur Sicherheit: Die Spalten ab E enthalten keine Daten, auf die Rücksicht zu nehmen wäre (können also vor allem gelöscht werden)?
So ganz nebenbei: Worum geht es bei der ganzen Sache überhaupt?
In den Spalten A bis D steht (ab welcher Zeile?) eine unbestimmte Anzahl von Zahlen, von denen all jene, die in mindestens zweien dieser Spalten vorkommen, in eine gemeinsame Ergebnisspalte geschrieben werden sollen, wobei im Ergebnis jede Zahl nur einmal aufscheinen soll (übrigens: Sortieren hätte ich heute im Sonderangebot ).
Zur Sicherheit: Die Spalten ab E enthalten keine Daten, auf die Rücksicht zu nehmen wäre (können also vor allem gelöscht werden)?
So ganz nebenbei: Worum geht es bei der ganzen Sache überhaupt?
Hallo Labi!
Gebrauchsanweisung: wie oben
Grüße
bastla
Option Explicit
Sub Sammle()
Const VonZeile = 2
Const VonSpalte As Integer = 1 'Spalte A
Const SpaltenAnzahl As Integer = 4
Dim ZielSpalte As Integer, TempSpalte As Integer, LetzteErgebnisZeile As Integer
ZielSpalte = VonSpalte + SpaltenAnzahl
TempSpalte = ZielSpalte + 1
Dim i As Integer, j As Integer, k As Integer, v As Integer, z As Integer
Dim Nummer As Variant, ok As Boolean
Dim Bis As Integer
Bis = VonSpalte + SpaltenAnzahl - 1
Cells(1, ZielSpalte).EntireColumn.ClearContents
Cells(1, TempSpalte).EntireColumn.ClearContents
z = VonZeile - 1
For v = VonSpalte To Bis - 1
i = VonZeile
Do While Cells(i, v).Value <> ""
Nummer = Cells(i, v).Value
For j = v + 1 To Bis
ok = True
k = VonZeile
Do While Cells(k, j).Value <> "" And Cells(k, j).Value <> Nummer
k = k + 1
Loop
If Cells(k, j).Value <> Nummer Then
ok = False
End If
If ok Then
z = z + 1
Cells(z, TempSpalte).Value = Nummer
End If
Next
i = i + 1
Loop
Next
LetzteErgebnisZeile = z
If LetzteErgebnisZeile > VonZeile Then
Range(Cells(VonZeile, TempSpalte), Cells(LetzteErgebnisZeile, TempSpalte)).Sort (Cells(VonZeile, TempSpalte))
z = VonZeile
Cells(z, ZielSpalte).Value = Cells(z, TempSpalte).Value
For i = VonZeile + 1 To LetzteErgebnisZeile
If Cells(i, TempSpalte).Value <> Cells(i - 1, TempSpalte).Value Then
z = z + 1
Cells(z, ZielSpalte).Value = Cells(i, TempSpalte).Value
End If
Next
ElseIf LetzteErgebnisZeile = VonZeile Then
Cells(VonZeile, ZielSpalte).Value = Cells(VonZeile, TempSpalte).Value
End If
Cells(1, TempSpalte).EntireColumn.ClearContents
MsgBox "Fertig."
End Sub
Grüße
bastla
Hallo Labi!
Grüße
bastla
brauch ich dann nur die variable "spaltenanzahl" ändern
Abgesehen davon, dass "SpaltenAnzahl" eine Konstante ist, wäre das der Plan. Der Rest baut auf den Festlegungen am Anfang auf (zB auch die ZielSpalte).oder gehört sonst noch was umgestellt??
Ich habe nichts dagegen, wenn Du es noch verbesserst; aber sofern es jetzt tut, was es soll, kannst Du es einfach so lassen.Grüße
bastla
Einen schönen guten Morgen an alle Mitglieder,
habe in diesem Forum endlich das gefunden was ich suchte und zwar den Beitrag "4 Spalten in Excel vergleichen, geschrieben von Labi am 21.11.2006 18;11:18 Uhr". Geantwortet bzw. den Code hat "bastla" geschrieben. Meine Exceltabelle hat aber anstatt 4 Spalten 18 Spalten und mehr und ca. 100 Zeilen. Da ich aber totale Anfängerin in VBA bin, ist er mir nicht gelungen auf 18 Spalten oder mehr den Code zu verändern. Kann mir jemand bitte weiterhelfen. Im voraus möchte ich mich für jede Antwort bedanken.
Gruss
conni0815
habe in diesem Forum endlich das gefunden was ich suchte und zwar den Beitrag "4 Spalten in Excel vergleichen, geschrieben von Labi am 21.11.2006 18;11:18 Uhr". Geantwortet bzw. den Code hat "bastla" geschrieben. Meine Exceltabelle hat aber anstatt 4 Spalten 18 Spalten und mehr und ca. 100 Zeilen. Da ich aber totale Anfängerin in VBA bin, ist er mir nicht gelungen auf 18 Spalten oder mehr den Code zu verändern. Kann mir jemand bitte weiterhelfen. Im voraus möchte ich mich für jede Antwort bedanken.
Gruss
conni0815
Hallo conni0815!
Grüße
bastla
ist er mir nicht gelungen auf 18 Spalten oder mehr den Code zu verändern.
Die Spaltenanzahl wird in Zeile 6 (der zweiten/vorläufig letzten Version) festgelegt - soferne die Anzahl der Spalten in Deiner Tabelle dynamisch ist und daher nicht als Konstante eingetragen werden soll/kann, solltest Du den Aufbau der Tabelle noch etwas genauer beschreiben (vor allem: aus welcher Zeile - etwa mit Überschriften - lässt sich diese Anzahl sicher ermitteln) ...Grüße
bastla
Hallo bastla,
vielen Dank für deine schnelle Antwort. Vorab zur Info: Ich komme aus der Bekleidungsindustrie und wir haben Kleiderständer (Spalte A = Kleiderstange 1, Spalte B = Kleiderstange 2 usw.). und dort hängen minimum 90 Teile pro Stange drauf (Zeile 1-90). In Excel habe ich nun eine Arbeitsmappe z. B. Tabelle1 und dort streichen wir das, was wir von der Kleiderstange nehmen. Nun möchte ich eine Auswertung machen wo jede Nummer, welche in allen 18 Spalten oder mehr vorkommt und diese in die 19 Spalte oder mehr schreiben. Alles weitere ist sehr schwer zu beschreiben. Das Prinzip ist eigentlich wie bei Labi, nur das ich mehr Spalten habe, wenn ich es richtig sehe. Wenn ich das hätte, wäre ich schon sehr dankbar. Sollten sich dann noch Fragen ergeben, würde ich mich vertrauensvoll an dich wenden. Besten Dank.
Gruss
conni0815
vielen Dank für deine schnelle Antwort. Vorab zur Info: Ich komme aus der Bekleidungsindustrie und wir haben Kleiderständer (Spalte A = Kleiderstange 1, Spalte B = Kleiderstange 2 usw.). und dort hängen minimum 90 Teile pro Stange drauf (Zeile 1-90). In Excel habe ich nun eine Arbeitsmappe z. B. Tabelle1 und dort streichen wir das, was wir von der Kleiderstange nehmen. Nun möchte ich eine Auswertung machen wo jede Nummer, welche in allen 18 Spalten oder mehr vorkommt und diese in die 19 Spalte oder mehr schreiben. Alles weitere ist sehr schwer zu beschreiben. Das Prinzip ist eigentlich wie bei Labi, nur das ich mehr Spalten habe, wenn ich es richtig sehe. Wenn ich das hätte, wäre ich schon sehr dankbar. Sollten sich dann noch Fragen ergeben, würde ich mich vertrauensvoll an dich wenden. Besten Dank.
Gruss
conni0815