Makro zum Zusammenfassen von Spalten

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.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
Iamiam  11.04.2012, 19:30

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!

0
IzmirWurscht 
Fragesteller
 12.04.2012, 10:26

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

For Spalte = 4 To 256 Step 2
For Zeile = 1 To 100


Set zelle1 = Cells(Zeile, Spalte)
Set zelle2 = Cells(Zeile, Spalte + 1)

 If IsEmpty(zelle1) Or IsEmpty(zelle2) Then
'Range(zelle1, zelle2).Merge 'Lösung von Suboptimierer
Cells(Zeile, Spalte).Value = Cells(Zeile, Spalte).Value & "" & Cells(Zeile, Spalte  + 1).Value

Cells(Zeile, Spalte + 1).ClearContents

End If

Next Zeile Next Spalte

End Sub

Da wills aber auch nicht so wie ich will

0
Iamiam  12.04.2012, 13:32
@IzmirWurscht

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

0
Oubyi, UserMod Light  12.04.2012, 16:46
@IzmirWurscht

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.

0

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
IzmirWurscht 
Fragesteller
 11.04.2012, 15:08

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

0
Suboptimierer  11.04.2012, 15:53
@IzmirWurscht

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
0
IzmirWurscht 
Fragesteller
 11.04.2012, 16:26
@Suboptimierer

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.

0
Suboptimierer  11.04.2012, 16:44
@IzmirWurscht

Dafür reicht die alleinige Abfrage

if IsEmpty(Cells(Spalte + 1, Zeile)) Then

Ich glaube, wir haben inzwischen alle Möglichkeiten durchgekaspert ^^

0
IzmirWurscht 
Fragesteller
 11.04.2012, 16:03

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

0
Suboptimierer  11.04.2012, 16:29
@IzmirWurscht

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
0
IzmirWurscht 
Fragesteller
 11.04.2012, 16:40
@Suboptimierer

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

0