Makro zum Zusammenfassen von Spalten
Hallo alle zusammen,
ich hab ein kleines Problem mit einem Makro, welches ich mir mit Hilfe diverser Quellen versucht habe auf meinen Fall zusammenzuschustern. Folgendermaßen kann man sich die Grundsituation vorstellen:
Ich habe in den Spalten D Und E ca 70 Zeilen mit Einträgen. Bis auf die Zellen 11 - 14 Ist die Spalte E leer. Also wollte ich ein Makro benutzen, welches die Spalte D wenn D und/oder E leer sind mit E zusammenfasst und sonst nicht.
Das soll dann auch für die Spalten F,G und H,I und immer soweiter klappen. Wer könnte mir Helfen und zeigen wo mein Fehler liegt denn bisher funktioniert das Makro nicht ganz so wie ich mir das vorgestellt habe.
Sub Formatierung()
Dim Zeile As Integer Dim Spalte As Integer
For Spalte = 4 To 256 Step 2
For Zeile = 1 To 100
If ((Not (IsEmpty(Cells(Spalte, Zeile)))) = True And IsEmpty(Cells(Spalte + 1, Zeile)) = True) Then
Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte + 1)).Merge
End If
If IsEmpty(Cells(Spalte, Zeile)) = True And IsEmpty(Cells(Spalte + 1, Zeile)) = True Then
Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte + 1)).Merge
End If
Next Zeile
Next Spalte
End Sub
So sieht das bisher aus. Für jede Hilfe vorab schonmal besten Dank
2 Antworten
Ok, dass in dem Code Spalte und Zeile durcheinander gewirbelt werden, habt ich schließlich auch gemerkt.
Nur noch eine allgemeine Bemerkung:
Jeder Profi sagt Dir:
"Lass die Finger von verbundenen Zellen, dass gibt nur Probleme".
Excel kann mit verbundenen Zellen nicht wirklich vernünftig umgehen, und gerade in VBA wird die Fehlersuche dabei SEHR erschwert.
Also überlege Dir, ob das wirklich sein muss, oder ob es vielleicht reicht, die Werte von Spalte E in Spalte D zu schreiben, wenn die leer ist.
Oder vielleicht macht es Sinn einfach Alles in Spalte D zu schreiben, sodass E leer bleibt (und evtl. sogar gelöscht werden kann). Macht allerdings nur bei Text wirklich Sinn.
Das könnte dann so gehen:
Sub Formatierung()
Dim Zeile As Integer
Dim Spalte As Integer
For Spalte = 4 To 256 Step 2
For Zeile = 1 To 100
Cells(Zeile, Spalte).Value = Cells(Zeile, Spalte).Value _
& "_" _
& Cells(Zeile, Spalte + 1).Value
Cells(Zeile, Spalte + 1).ClearContents
Next Zeile
Next Spalte
End Sub
Das
& "_" _
kannst Du auch weglassen, wenn Du kein Verbindungszeichen haben willst, oder durch
& " " _
für ein Leerzeichen oder durch ein anderes Zeichen ersetzen.
Es wäre immer schön, zu wissen, ob der Frager sowas als Übungsbeispiel fürs Makrolernen sieht oder als echtes Problem: im ersten Fall würde ich natürlich auf Vorschläge wie meinen o.g. verzichten.
Im zweiten bin ich der Meinung, dass der Aufwand alletr Beteiligten hier in keinem Verhältnis mehr zum Nutzen steht.
Eine Formellösung (neue Spalte F einfügen, da in F1 die Formel =D1&E1, runterziehen, Spalte kopieren, als Werte einfügen und dann beliebig D1 und/oder E1 löschen: das wäre einfacher gewesen!)
ggf auch verbunden mit der Abfrage wenn(istzahl(..)...) oder isttext etc
Wenn Du in den Zeilen 11 bis 14 Zahlen von - bis hast, dann nutze meinen Code und nimm halt :
& "-" _
als Trennzeichen.
Ich glaube aber, langsam verstehe ich endgültig nicht mehr, was Du erreichen willst.
Am Besten, Du zeigst hier (in einer neuen Antwort) Screenshots von Teilen Deiner Liste VORher und NACHher, dann kann Dir sicherlich geholfen werden.
anstatt Zellen verbinden kannst u die Formatierung 'über Auswahl zentrieren' wählen, für beide Zellen. Wenn dann in der zweiten Spalte was steht, wird das automatisch getrennt wiedergegeben, ganz ohne Makro! Makros sind nur was für Probleme, für die xl standardmäßig keine Lösung anzubieten hat oder für Abfolgen von Befehlen!
@lamiam: DAS ist auf jeden Fall auch eine gute Idee!!!
welches die Spalte D wenn D und/oder E leer sind mit E zusammenfasst und sonst nicht.
Bisher wird der Merge aber nur dann ausgeführt, wenn die erste Spalte ungleich leer ist, aber die zweite leer ist oder wenn beide Spalten leer sind.
Die zweite Abfrage würde ich so anpassen, dass gefragt wird, ob die erste Zelle leer ist, aber die andere nicht.
Du kannst aber auch beide Abfragen zusammenfassen; also wenigstens eine Zelle muss leer sein. Übrigens: "=True" kannst du dir schenken.
Ich versuche mal ungetestet ein Beispiel:
If IsEmpty(Cells(Spalte, Zeile)) or _
IsEmpty(Cells(Spalte + 1, Zeile)) Then
Besten Dank erstmal für die Hilfe, ich hab jetzt nur noch 2 kleine Probleme. Zuerst will das Makro auch Zellen zusammenfassen in den in Spalte D und E gleichzeitig Einträge vorhanden sind, gerade das soll ja nicht passieren. Und dann wills einfach nicht Spalte D und E in Zeile 2 und 3 zusammenfassen.
Sub Formatierung()
Dim Zeile As Integer Dim Spalte As Integer
For Spalte = 4 To 256 Step 2
For Zeile = 1 To 100
If Not (IsEmpty(Cells(Spalte, Zeile))) And IsEmpty(Cells(Spalte + 1, Zeile)) Then
Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte + 1)).Merge
End If
If IsEmpty(Cells(Spalte, Zeile)) Or IsEmpty(Cells(Spalte + 1, Zeile)) Then
Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte + 1)).Merge
'If IsEmpty(Cells(Spalte, Zeile)) And IsEmpty(Cells(Spalte + 1, Zeile)) Then
'Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte + 1)).Merge
End If
Next Zeile
Next Spalte
End Sub
So sieht das jetzt aus, Falls noch jemand ne Idee hat wo das Problem liegt, wäre ich sehr Dankbar
Das Problem ist, dass bei Zellen, die durch die erste Abfrage zusammengeführt wurden, die zweite Abfrage den zweiten Zellwert als empty interpretiert.
Außerdem vertauscht du Zeile und Spalte gleich zweimal, ist das Absicht?:
If Not (IsEmpty(Cells(*Spalte*, *Zeile*))) And IsEmpty(Cells(*Spalte + 1*, *Zeile*)) Then
Range(Cells(*Zeile*, *Spalte*), Cells(*Zeile*, *Spalte + 1*)).Merge
End If
Die erste Abfrage ist überflüssig.
Ich habe folgendes probiert und es funktionierte prima:
Set zelle1 = Cells(Zeile, Spalte)
Set zelle2 = Cells(Zeile, Spalte+1)
If IsEmpty(zelle1) Or _
IsEmpty(zelle2) Then
Range(zelle1, zelle2).Merge
End If
Ich hab das dumpfe Gefühl das war eher keine Absicht, ich hab halt eher rumprobiert. Und so hats dann im Ansatz schon das gemacht wie ichs mir vorgestellt habe. Aber mit dem, was hier zuletzt gepostet wurde funktionert das wunderprächtig. Tausend Dank an Dich Suboptimierer
Bisher wird der Merge aber nur dann ausgeführt, wenn die erste Spalte ungleich leer ist, aber die zweite leer ist oder wenn beide Spalten leer sind.
Also es soll so sein das wenn in der ersten Spalte was steht und in der Zweiten nicht, dann zusammenfassen, steht in beiden nichts auch zusammenfassen, steht in beiden was nicht zusammenfassen. Hab mich da wohl etwas unklar ausgedrückt.
Die Anderen Tipps versuch ich mal uzusetzen, Besten Dank
Also es soll so sein das wenn in der ersten Spalte was steht und in der Zweiten nicht, dann zusammenfassen, steht in beiden nichts auch zusammenfassen, steht in beiden was nicht zusammenfassen.
Es fehlt hier die Berücksichtigung des Falls, dass in der zweiten Spalte etwas steht, aber in der ersten nicht.
Nehmen wir an, dann sollte nicht zusammengefasst werden. Dann müsstest du doch nur dann zusammenfassen, wenn in der zweiten Spalte nichts steht. Habe ich das richtig verstanden?
If IsEmpty(Cells(Spalte + 1, Zeile)) Then
Es gibt insgesamt 4 Fälle:
Spalte 1 Spalte 2
leer voll
leer leer
voll voll
voll leer
Sorum an die Sache zu gehen kam mir bisher nicht in den Sinn, naja. Eigentlich immer zusammenfassen, außer Spalte2 ist voll, dann solls getrennt bleiben. Habs auch grad mal probiert, gibt aber leider die gleichen Probleme, wie bei meinem Schriebs von vor einigen Minuten. Ich verstehe nicht warum das Makro auch jetzt offensichtlich volle Spalten zusammenfasen will.
Dafür reicht die alleinige Abfrage
if IsEmpty(Cells(Spalte + 1, Zeile)) Then
Ich glaube, wir haben inzwischen alle Möglichkeiten durchgekaspert ^^
Vielen Dank erstmal für deinen Vorschlag. Das Funktioniert so ja eigentlich schon ganz gut, nur hab ich in den Zeilen 11 - 14 leider Zahlen stehen. Diese sind in der Form von ... bis... und daher absichtlich in 2 Spalten. Der Versuch For Zeile 1 To 10
For Zeile1 15 To 100 funktioniert leider nicht.
Und dann hab ich probiert die Lösung von Suboptimierer mit deinem Vorschlag zu kombinieren, aber da wills auch nicht klappen. Ich hab gedacht das müßte dann so aussehen: Sub Formatierung()
Dim Zeile As Integer Dim Spalte As Integer
End If
Next Zeile Next Spalte
End Sub
Da wills aber auch nicht so wie ich will