Microsoft Excel

Herbers Excel/VBA-Archiv

Seitenzahlen automatisch zusammenfassen

Betrifft: Seitenzahlen automatisch zusammenfassen von: amfgimbte
Geschrieben am: 08.11.2014 10:49:44

Hallo zusammen,

ich habe ein kleines Problem mit meinem Makro-Code, den ich geschrieben habe.

Ich habe ein Inhaltsverzeichnis, für das je nach Index die Seitenzahlen aus den betreffenden Zeilen zu einem langen Text in einer Spalte zusammengefasst werden soll. Das sieht beispielsweise so aus:

1 2
3 6
7 9
15 18
19 35
38 41

Zusammenfassung in der Spalte: 1 bis 2, 3 bis 6, 7 bis 9, 15 bis 18, 19 bis 35, 38 bis 41

Nun möchte ich die Zusammenfassung in der Weise modifizieren, als dass Folgeseiten zu einer Ausgabe zusammengefasst werden. Ich stelle mir das Ergebnis so vor:

1 bis 9, 15 bis 35, 38 bis 41

Mein Code sieht bisher so aus:


Sub SeitenzahlenVerbinden()
Dim Ausgabe As Variant

For i = 1 To 39

    If Not Cells(i + 23, "BJ") = "" And Not Cells(i + 23, "BK") = "" Then
        
        Ausgabe = Ausgabe & Cells(i + 23, "BJ") & Cells(i + 23, "BC") & " bis " & Cells(i + 23,  _
 _
 _
 _
"BK") & Cells(i + 23, "BC") & ", "
    
    ElseIf Not Cells(i + 23, "BJ") = "" And Cells(i + 23, "BK") = "" Then
        
        Ausgabe = Ausgabe & Cells(i + 23, "BJ") & Cells(i + 23, "BC") & ", "
    Else
    
        Ausgabe = Ausgabe
        
    End If
    
Next i

Laenge = Len(Ausgabe)
Cells(3, "BM") = Left(Ausgabe, Laenge - 2)

End Sub

Da es auch Spalten geben kann, in denen keine Seitenzahlen vorkommen, überprüfe ich dies vorher, damit in der Ausgabe keine "leeren" Seitenzahlen mit dem Bindewort "bis" stehen.

Habt ihr eine Idee, wie ich das schaffen könnte? Ich denke, dass ich es mit einer weiteren Schleife (For, While?) machen müsste, aber ich schaffe es nicht.

Gruß,
amfgimbte

  

Betrifft: AW: Seitenzahlen automatisch zusammenfassen von: Michael
Geschrieben am: 12.11.2014 11:25:37

Hallo amfgimbte,

mir ist etwas schleierhaft, warum Du auf die Spalten BJ und BK prüfst, Dir dann aber Werte aus BC holst.

Beschreibe doch bitte mal, was nun wo steht, dann wirst Du geholfen.

Schöne Grüße,

Michael


  

Betrifft: AW: Seitenzahlen automatisch zusammenfassen von: amfgimbte
Geschrieben am: 12.11.2014 20:01:53

Hallo Michael,

du hast Recht. Es wirkt für Außenstehende in der Tat etwas verwirrend. Ich versuche das Problem etwas vereinfachend darzustellen.

Es gibt in den Spalten B und C (Zeile 2 bis 7) jeweils die 1. und letzte Seite eines Kapitels aus einem Inhaltsverzeichnis.

1 2
3 6
8 14
16 19
21 35
36 41

Beim Klick auf einen Button sollen alle Seitenzahlen aus den Spalten B und C zu einem Text zusammengefasst werden. Dieser wird später an Word für ein Anschreiben übergeben.

Bisher habe ich den VBA-Code nur so geschrieben, dass alle Seitenzahlen der Kapitel "stumpf" aneinander geschrieben und ausgegeben werden. Doch ich möchte den Code so "clever" machen, dass er Seitenzahlen, die aufeinander ohne "leere" Seiten folgen, zusammenfasst,
Im Beispiel der EXCEL-Datei soll die Ausgabe in E7 im Endeffekt so aussehen:

1 bis 6, 8 bis 14, 16 bis 19, 21 bis 41

Der Code dazu lautet:

Sub Generieren()
Dim Seiten(1 To 6, 1 To 2) As Variant, Ausgabe As Variant
Dim i As Integer

For i = 1 To 6

    Seiten(i, 1) = Cells(1 + i, 2)
    Seiten(i, 2) = Cells(1 + i, 3)
      
Next i

Columns("E:E").Select 'SpalteE vorher leeren
Selection.ClearContents

For i = LBound(Seiten) To UBound(Seiten)

    Ausgabe = Ausgabe & ", " & Seiten(i, 1) & " bis " & Seiten(i, 2)

Next i
   
Cells(7, 5) = Ausgabe

End Sub
Ich hoffe, dass ihr mein Problem nun besser verstanden habt. Eigentlich müsste es - so würde ich es mir vorstellen - mit einer zusätzlichen Schleife funktionieren. Doch ich schaffe es einfach nicht.


  

Betrifft: zwischendings von: Michael
Geschrieben am: 13.11.2014 14:16:33

Hallo amfgimbte,

so wie Du mit verschiedenen Datenstrukturen hantierst, hast Du sicher mehr als Basiskenntnisse. Gut so.

Ich muß allerdings aus dem Haus und antworte morgen - sofern nicht jemand anderes die Lösung skizziert.

Schöne Grüße,

Michael


  

Betrifft: AW: zwischendings von: amfgimbte
Geschrieben am: 13.11.2014 19:36:36

Du hast mich erwischt, Michael. ;-)

Ich hatte im Studium ein Semester VBA. Damals dachte ich: "Das brauchst du nie wieder." Vertan Vertan, sprach der Hahn . . .


  

Betrifft: non scolae, sed vitae dingsimus von: Michael
Geschrieben am: 14.11.2014 21:48:51

Hallo amfgimbte,

manchmal geht es doch zäher, als man meint - wenn man halt drauflos programmiert, anstatt sich mit Zettel und Bleistift hinzusetzen...

In der Tabelle
https://www.herber.de/bbs/user/93782.xls
findest Du die "doofe" Halblösung mit Hilfsspalten und die VBA-Lösung. Ich habe die Variablen in einen extra Bereich geschrieben, quasi zum Debuggen, das kannste ja wieder löschen.

Der nachfolgende Code tut das gleiche, nur ohne Debuggen, weil's fürs Forum netter ist:

Sub berechnenForum()
 Z_von = Range("A3") ' z.B. 2
 Zeile = Z_von
 Z_bis = Range("A5") ' z.B. 7
 ' nur zum Testen; im Betrieb übergibst Du
 ' eben Deine Variablen
 ' auf die Abfrage nach leeren Zellen hab ich
 ' für den Moment verzichtet
 ' 1. aus Faulheit und
 ' 2., weil ich nicht weiß, ob komplette Zeilen
 '    leer sein können, oder nur einer von beiden
 '    Werten vorhanden ist oder wie es halt genau ist.
 
 ausgabe = ""
 
 von1 = Range("B" & Z_von)
 bis1 = Range("C" & Z_von)
  
 While Zeile <= Z_bis
    von2 = Range("B" & Zeile + 1)
    bis2 = Range("C" & Zeile + 1)
    If von2 <> bis1 + 1 Then
       ausgabe = ausgabe & von1 & " bis " & bis1 & ", "
       von1 = von2
    End If
    bis1 = bis2
    Zeile = Zeile + 1
 Wend
 Range("D" & Zeile) = ausgabe
End Sub
Schöne Grüße,

Michael


  

Betrifft: AW: non scolae, sed vitae dingsimus von: amfgimbte
Geschrieben am: 16.11.2014 10:16:39

Hallo Michael,

vielen Dank für deine Hilfe! Das klappt soweit bestens und beantwortet meine Frage im Grunde genommen schon treffend.

Doch wie so vieles im Leben, gibt es auch immer wieder die Ausnahme von der Regel. ;-)

Ich hatte meinen Eingangs-Code seinerzeit extra mit Arrays geschrieben, weil ich dachte, dass ich die Arrays noch einmal benötigen werde. Denn je nach Länge der Seitenzahlen kann "Ausgabe" natürlich sehr lang werden. Daher dachte ich seinerzeit, dass ich die "Ausgabe" auf beispielsweise 10 Arrays beschränken kann und die Array-Werte 11 bis 21 in die nächste Zeile geschrieben werden usw. Der Hintergrund ist der, dass die Zusammenfassung der Seitenzahlen an eine Briefvorlage in Word übergeben werden und dort nicht unendlich viel Platz für eine lange "Ausgabe" ist.
Wäre diese "Zerlegung" auch mit deinem Code möglich, Michael? :-)

Ein weitere Ausnahme der Regel ist, dass nicht in jeder Zeile, die die Schleife durchläuft, eine Zahl oder Zahlen stehen werden. Die Liste könnte auch so aussehen:

1
LEER
2 bis 5
LEER
LEER
LEER
6
8 bis 10

Bei den leeren Zeilen steigt die Schleife aus. Nur wieso?

Gruß,
Max


 

Beiträge aus den Excel-Beispielen zum Thema "Seitenzahlen automatisch zusammenfassen"