Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1708to1712
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mehrere Spalten mit gleichem Namen filtern

Mehrere Spalten mit gleichem Namen filtern
29.08.2019 16:12:45
Alper
Hallo Zusammen,
ich bin ganz neu im Forum und kann leider keine Screenshots einfügen :-(
Ich habe folgendes Problem und hoffe, dass ihr mir trotzdem helfen könnt.
Und zwar geht es um eine sehr große Excel Datei mit vielen Spalten. Die Spalten enthalten Vertragsdaten. Hat ein Kunde mehrere Verträge so werden sie ganz rechts angehängt. Die relevante Zeile ist Zeile 4 (darüber stehen unnötige Informationen, bspw. wie die interne Abfrage ausgesehen hat)
Jede Zeile ist ein Kunde.
Alle Spalte vor dem ersten Vertrag sind "fixe Stammdaten" zum Kunden. Die Spalte AQ (und alle Spalten davor) beinhalten also immer die gleichen Informationen.
Und danach kommen die Vertragsdaten.
Bspw. steht in Spalte
AR "Verträge AAA"
AS "Vertrag im mM"
AT "Verträge BBB"
AU "Vertrag im mM"
AV "Verträge CCC"
AW "Vertrag im mM"
In diesem Fall hat der Kunde also drei Verträge für drei unterschiedliche Produkte (AAA, BBB, CCC). Hätte er nur zwei Verträge, dann wäre die Spalte AU die letzte. Hätte er vier Verträge wären zwei weitere Spalten drangehängt, usw.
Mich interessiert aber immer die Spalte danach - die heißt immer "Vertrag im mM" - in diesen Spalten steht immer "J" oder "N"
Jeder Kunde hat immer mindestens einen Vertrag, d.h. einen "Vertrag im mM" gibt es immer sicher.
Aktuell löse ich das so
Set rVertragImMm = Worksheets("XXX").Rows("4:4").Find("Vertrag im mM")
Worksheets("XXX").Range("4:4").AutoFilter _
Field:=rVertragImMm.Column, _
Criteria1:="=J"
Das klappt aber nicht mehr, wenn eine Kunde mehrere Verträge hat.
Ich brauche jetzt also ein Makro, dass sicherstellt, dass der Kunde mind. 1 J bei einem von mehreren Verträgen hat (also bei einem der drei Verträge mind. ein "J" in der gleichnamigen Spalte "Vertrag im mM" hat).
Da ich noch viele andere Dinge filtern muss, würde ich gerne eine Nettosumme "ganz rechts" in der ersten freien Spalte bilden.
Es wäre es toll, wenn das Makro
1. Erkennt wo die erste freie Spalte ganz rechts ist (in meinem Beispiel also "AX")
Dafür würde ich das Makro von rechts auf die erste gefüllte Zelle springen lassen
In etwa so
'Ich werde vermutlich nie mehr als 10 Verträge haben. Ich gehe also von der Spalte XX4 nach  _
links (und addiere 1, weil ich ja die freie Spalte will und nicht die gefüllte)
iLastColumn = Range("XX4").End(xlToLeft).Column + 1
2. Erkennt, wie viele Verträge zu berücksichtigen sind
Dafür ziehe ich von der aktuellen Spaltennummer immer 42 (Spaltennummer der "fixen Spalte" AQ MINUS 1) abziehen und diesen Wert durch 2 teilen ((48-42)/2=3)
iAnzahlEinträge = (iLastColumn - 42) / 2
Soweit sieht das ganze so aus

Sub mM_MBV_netto()
Dim iLastColumn As Integer
Dim iAnzahlEinträge As Integer
iLastColumn = Range("XX4").End(xlToLeft).Column + 1
iAnzahlEinträge = (iLastColumn - 42) / 2
End Sub
Das liefert den Wert 3 (für drei Verträge)
3. Und jetzt würde gerne unter der Spaltenüberschrift, z.B. "Nettosumme", in der oben ermittelten "ersten freien Spalte" (AX, Spalte 48) eine Formel einfügen, die sagt "Wenn mindestens eine dieser drei Spalten "J" ist, dann setze den Wert auf 1, sonst auf 0."
4. Und danach soll die Formel "nach unten gezogen" werden, d.h. auf alle Kunden (=gefüllte Zeilen) angewandt werden.
Ich hoffe, dass das so verständlich gewesen ist. Ich habe mir Mühe gegeben, auch wenn ich glaube, dass ein Bild geholfen hätte :-)

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrere Spalten mit gleichem Namen filtern
29.08.2019 16:44:35
{Boris}
Hi,
warum verkettest Du nicht in einer separaten Spalte alle "J" aus den Vertragsspalten:
=AR5&AS5&AT5 usw.
Und dann kannst Du diese Spalte filtern nach z.b. Nichtleere oder "enthält: J" oder so. Und die Anzahl der Verträge erhältst Du auch ganz einfach mit =LÄNGE(Zelle_mit_den_verketteten_J).
VG, Boris
AW: Mehrere Spalten mit gleichem Namen filtern
29.08.2019 17:34:08
Alper
Danke, das klingt sehr gut! Allerdings habe ich "J"s und "N"s. Die Verkettung liefert also bspw.
JNJ
JJJ
NNJ
NNN
JJJ
Oder bei vier Verträgen
JJJJ
NNJJ
JNJJ
NJJN
usw.
Oder bei vielen Verträgen
JJJJJJJJJJJ
NJNNNNNNJNN
usw.
Interessant sind für mich ja nur Zeilen (=Kunden) wo es mind. ein J gibt.
Anzeige
Ich versteh die "Frage" grad nicht...
29.08.2019 17:40:22
{Boris}
Hi,
...bzw: Wo genau besteht nun das Problem?
Willst Du filtern? Dann nach "enthält J".
Oder was genau soll dann passieren?
VG, Boris
AW: Ich versteh die "Frage" grad nicht...
29.08.2019 17:58:31
Alper
Sorry :-)
Ich versuche es noch mal.
Zum Hintergrund: Diese Datei stammt aus einer internen Datenbank-Abfrage aus unserer Kundendatenbank. Die ersten Spalten sind immer identisch im Aufbau. Die ersten Spalten bis einschl. AQ sind immer gleich. Danach werden die Vertragsdaten "angehängt." Das heißt, dass diese Excel Datei nicht immer identisch aussieht. Die Excel Datei hat - in Abhängigkeit von der Datenbank-Abfrage - mal mehr, mal weniger Spalten.
Wenn ich also nur einen Vertrag abfrage, dann endet die Datei in Spalte AS.
Wenn ich aber zwei Verträge abfrage, dann endet die Datei in Spalte AU.
Wenn ich aber 22 Verträge abfrage, dann endet die Datei viel weiter rechts (B-irgendwas)
Problem 1: Die Anzahl der zu verkettenden Spalten ist unterschiedlich (1 bis X)
Angenommen, ich habe die Abfrage mit genau einem Vertrag gemacht, dann ist das Makro GANZ einfach.
Set rVertragImMm = Worksheets("XXX").Rows("4:4").Find("Vertrag im mM")
Worksheets("XXX").Range("4:4").AutoFilter _
Field:=rVertragImMm.Column, _
Criteria1:="=J"
Soweit ok, oder?
Manchmal habe ich aber zwei Verträge abgefragt.
Dann führt mich
Set rVertragImMm = Worksheets("XXX").Rows("4:4").Find("Vertrag im mM")
Nur zum ersten Treffer in Spalte AS. Es gibt die Spalte "Vertrag im mM" aber zwei Mal (auch in AU).
Hier scheitert das Makro.
Ich muss beide Spalten prüfen, ob eine von beiden ein "J" enthält. Daher wollte ich die Nettosumme bilden.
Soweit verstanden?
Auch mit zwei würde ich es, mit Hängen und Würgen, noch ohne Euch hinbekommen. Glaube ich zumindest ;-)
Das Problem 2 ist jetzt: Die Anzahl der Verträge ist unklar. Wenn ich zwei Verträge abfrage, dann müssen zwei Zellen verkettet werden. Wenn ich 22 Verträge abfrage, dann müssen 22 Zellen verkettet werden.
Ich will also ein "intelligentes" Makro, das erkennt wie viele Verträge in der Excel-Datei enthalten sind und die Formel dann so baut, dass alle Verträge auf mindestens ein "J" geprüft werden.
Und Problem 3 ist: Dadurch, dass die Datei "J" und "N" enthält funktioniert das Filtern auf "Nichtleere" nicht.
Es kann ja so aussehen:
JJJN
oder JJJJJJJ
oder NJNNNNNN
oder NN
oder J
Mir reicht es, wenn ein "J" vorkommt.
Puh - wie soll man da helfen, wenn das erklären schon so schwierig ist =)
Anzeige
AW: Mehrere Spalten mit gleichem Namen filtern
29.08.2019 16:50:33
Piet
Hallo Alper
du hast dir sehr viel Mühe gegeben deine Aufgabe mit vielen Worten zu beschreiben. Trotzdem ist mir einiges unklar. Am besten laedst du eine Beispieldatei mit anonymen Namen hoch. Die Kunden interessieren uns nicht, sondern der Aufbau der Datei. Vor allem wie die Lösung aussehen soll? Erwarte bitte nicht das wir so eine umfangreiche Datei nach deinem Text nachbauen. Zuviel Arbeit.
Noch eine Verstaendnisfrage: - Die relevante Zeile ist Zeile 4 - meinst du damit die Zeile oder die Spalte 4?
Mein Problem: 1000 Kunden oder mehr können nicht alle in Zeile 4 stehen. das klingt unlogisch. Im Augenblick begreife ich noch nicht wie deine Datei wlrklich konkret aussieht? In welchen Spalten/ Zeilen soll zum Schluss das Ergebnis stehen?
mfg Piet
Anzeige
AW: Mehrere Spalten mit gleichem Namen filtern
29.08.2019 17:18:15
Alper
Hi,
Danke schon mal für eure lieben Antworten!
Ich habe mal diese Datei hochgeladen: https://www.herber.de/bbs/user/131721.xlsx
Hoffe, dass es dadurch klarer wird.
Die Spalten B bis AQ habe ich ausgeblendet. Dort steht quasi immer das gleiche.
Jeder neue Vertrag fügt ganz rechts neue Spalten hinzu.
Was ich möchte:
In der Zelle AX5 soll z.B. "Nettosumme" stehen
In AX6 soll eine Formel stehen
In AX7 soll die gleiche Formel stehen
In AX8 auch
usw.
Je mehr Kunden, desto weiter nach unten muss die Formel gezogen werden. (Jede Zeile ist ein Kunde, es können auch tausende von Kunden sein)
Das würde ich vermutlich sogar noch ohne Euch schaffen. Wo ich aber nicht mehr durchsteige ist die "Variabilität" der Anzahl der Verträge.
Theoretisch kann es auch sein, dass ich vier, acht oder X Verträge habe (also mehr Spalten nach rechts). Dann darf das natürlich nicht mehr in Spalte AX stehen, sondern muss eben auch nach rechts "wandern." Und die Formel wird ja dann immer komplexer. Je mehr Verträge, desto mehr muss die Formel ja verkettet werden.
Oder gibt es dafür einen einfacheren Trick?
Anzeige
"...einfacher Trick"...
29.08.2019 17:22:15
{Boris}
Hi,
Oder gibt es dafür einen einfacheren Trick?
Deine Verkettungsspalte setzt Du VOR die Vertragsspalten - dann kannst Du auf Teufel komm raus im Voraus verketten - und es bleibt immer die selbe Spalte.
VG, Boris
AW: "...einfacher Trick"...
29.08.2019 20:07:43
Firmus
Hi Alper,
und wenn Du neben die "Verketten-Spalte" eine zweite Hilfsspalte setzt, genannt "existiert",
dann kannst Du in der Spalte "existiert" die Formel
=FINDEN("J";GROSS(Verketten-Spalte+Zeile5);1)
einsetzen und nach unten ziehen.
In jeder Zeile in "existiert", die einen numerischen Wert enthält, hat mindestens ein "j" oder "J".
Gruss,
Firmus
Anzeige
AW: "...einfacher Trick"...
30.08.2019 16:58:44
Alper
Vielen lieben Dank! Das hat es für mich gelöst! Großartig!
Sub mM_MBV_netto()
Dim iLastRow As Long
'Letzte Zeile finden, damit das Makro flexibel ist
iLastRow = Range("A4").End(xlDown).Row
'Aktuell (20.08.2019) letzten Eintrag vor erstem Vertrag finden
Set rVertragImMm = Worksheets("XXX").Rows("4:4").Find("YYY")
'Dort zwei Leerspalten einfügen
Columns(rVertragImMm.Column + 1).Select
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight
'Zellenüberschriften setzen
Cells(4, rVertragImMm.Column + 1).Value = "Verkettung"
Cells(4, rVertragImMm.Column + 2).Value = "mind. 1 mM oder MBV"
'Formeln einfügen
Cells(5, rVertragImMm.Column + 1).Activate
ActiveCell.NumberFormat = "General"
ActiveCell.FormulaR1C1 = _
"=RC[-12]&RC[3]&RC[5]&RC[7]&RC[9]&RC[11]&RC[13]&RC[15]&RC[17]&RC[19]&RC[21]"
Cells(5, rVertragImMm.Column + 2).Activate
ActiveCell.NumberFormat = "General"
ActiveCell.FormulaR1C1 = "=IFERROR(IF(FIND(""J"",UPPER(RC[-1]),1)>0,1,0),0)"
'Nach unten ziehen
Cells(5, rVertragImMm.Column + 1).AutoFill Destination:=Range(Cells(5, rVertragImMm.Column + 1), _
Cells(iLastRow, rVertragImMm.Column + 1))
Cells(5, rVertragImMm.Column + 2).AutoFill Destination:=Range(Cells(5, rVertragImMm.Column + 2), _
Cells(iLastRow, rVertragImMm.Column + 2))
End Sub
Und in einem zweiten Makro - das fürs Filtern zuständig ist, mache ich jetzt
Set rVertragImMm = Worksheets("XXX").Rows("4:4").Find("mind. 1 mM oder MBV")
Worksheets("XXX").Range("4:4").AutoFilter _
Field:=rVertragImMm.Column, _
Criteria1:="=1"
Ich teste das nächste Woche mal mit verschiedenen Output-Dateien und bin sehr gespannt, ob es alle Testfälle abdeckt :-)
Vielleicht seht ihr auf die Schnelle ja noch Verbesserungspotentiale am Code!
Danke und schönes Wochenende!
Alper
Anzeige

200 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige