Zeilenumbruch ermitteln - Druckbereiche erstellen - Excel

  • VBScript

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von felix_gorgas.

    Zeilenumbruch ermitteln - Druckbereiche erstellen - Excel

    Hallo,

    es geht mal wider um Excellisten und die Steuerung mittels VBS. Wir haben nun, mit starker Hilfe aus diesem Forum, eine gute Stückliste hinbekommen. Leider gibt es noch einen Punkt, den man verbessern könnte. Da sich unsere Stücklisten in einzelne Baugruppen unterteilen wäre ein passender Seitenumbruch günstig, sodass die Gruppen nicht durch den automatischen Seitenumbruch zerstückelt werden. Man hätte also "im schlimmsten Fall" eine Baugruppe mit sehr vielen unterschiedlichen Teilen auf einer Seite, diese ist dann aber vollständig.

    Im Anhang ist mal solch eine Stückliste als PDF- und Excel-Dokument. Man sieht, dass z.B. die Baugruppe 6 durch den automatischen Zeilenumbruch zerrissen wird (Teile auf Seite 1 und Teile auf Seite 2).

    Mit dem Befehl

    Visual Basic-Quellcode

    1. objExcel.Rows(ZEILENANGABE).PageBreak = True

    kann man einen Seitenumbruch einfügen.

    Leider fehlt mir ein Denkansatz, wie man das Ganze bewerkstelligen könnte. In einem anderen VBS (Normteile anstelle Strukturliste) habe ich das Problem vereinfacht lösen können. Ich musste hier nur schaun, dass die letzte Zeile keinen bestimmten Wert angenommen hat. Das habe ich mit 30 "If Abfragen" gelöst. Da ich aber nun mitten im Text arbeite, fällt mir kein passender Weg ein. Wie im Excel-Dokument zu sehen ist, können wir zusätzliche Spalten für Eintragungen nutzen (Q bis T nehme ich z.B. schon um farbliche Markierungen oder Summenbildungen zu realisieren).

    Hat jemand von euch eine gute Idee, wie man das Problem lösen könnte? Die verfügbare Zeilenzahl pro Seite bleibt übrigens beständig bei 38.

    MfG
    Dateien
    • Listen.zip

      (112,99 kB, 157 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felix_gorgas“ ()

    Moin,

    also ich habe mir eine Lösung ausgedacht, brauche aber etwas Hilfe.

    Da es sich immer um 38 Zeilen handelt, wollte ich nach folgendem Schema vorgehen:
    • Die Zeilenzahl des Dokumentes wird durch das VBS bereits ermittelt und liegt als Variable "MyTableLength" vor. Diese lasse ich mir in eine Zelle schreiben.
    • Die Zahl wird anschließend durch 38 geteilt und gerundet. Damit habe ich die Anzahl der zu erstellenden "Seitenumbrueche".
    • Jetzt soll für 1 bis "Seitenumbrueche" folgendes abgearbeitet werden:
    • Es wird in Zeile 40 gesprungen und von unten nach oben in Spalte 20 nach 555 einmalig gesucht. Wenns gefunden wird einen Seitenumbruch erstellen.
    • Anschließend soll auf die gefundene Zeile 38 addiert werden. Damit wäre ich beim theoretisch nächsten Umbruch gelandet. Dann soll das Spielchen von vorn losgehen.
    Mit folgendem Ablauf kann ich einmalig diese Such durchführen, weiß aber nicht, wie ich es für die ermittelte Anzahl der benötigten "Seitenumbrueche" umwandle:

    Visual Basic-Quellcode

    1. Dim wsStruct3
    2. Dim yt
    3. Dim pt
    4. set wsStruct3 = objExcel.Worksheets("Strukturliste")
    5. For pt = 40 To 6 Step -1
    6. yt = wsStruct3.Cells(pt, 20).Value
    7. If yt = 555 Then
    8. objExcel.Rows(pt).PageBreak = True
    9. Exit For
    10. End If
    11. next


    Wie könnte man das Ganze in eine Abfolge anhand der ermittelten Zahl der "Seitenumbrueche" abändern?

    _________________________________________________________________________________________________________________________________________________________
    EDIT:
    Folgendes SUB habe ich jetzt erstellt. Damit wird durch einen Loop und dem Vergleich der Durchläufe zur benötigten Seitenzahl die Wiederholung realisiert.

    Visual Basic-Quellcode

    1. Sub Umbrueche()
    2. Dim Seitenzahlen
    3. Dim ZeilendesExceldokumentes
    4. Dim yty
    5. Dim ptp
    6. Dim Wert1
    7. Dim Wert2
    8. Dim iLoop
    9. objExcel.Cells(1,23).Value = ISDGetText("Zeilenzahl")
    10. objExcel.Cells(2,23).Value = ISDGetText("Seiten")
    11. ZeilendesExceldokumentes = objExcel.Cells(1,24).Value
    12. Seitenzahlen = ZeilendesExceldokumentes/39
    13. objExcel.Cells(2,24).Value = ISDGetText(Seitenzahlen)
    14. objExcel.Cells(2,24).Value = objExcel.RoundUp(Seitenzahlen, 0)
    15. Seitenzahlen = objExcel.Cells(2,24).Value
    16. Wert1 = 1
    17. Wert2 = 40
    18. iLoop = 0
    19. Do
    20. For ptp = Wert2 To Wert1 Step -1
    21. yty = objExcel.Cells(ptp, 20).Value
    22. If yty = 555 Then
    23. objExcel.Rows(ptp+1).PageBreak = True
    24. Wert1 = ptp+1
    25. Wert2 = ptp+38
    26. Exit For
    27. End If
    28. next
    29. iLoop = iLoop + 1
    30. Loop until ( iLoop = Seitenzahlen)
    31. End Sub
    32. Umbrueche

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „felix_gorgas“ ()

    Moin,

    ein kleines Problem hat sich aufgetan. Ich hatte nun Baugruppen die länger sind als die Zeilenzahl von 38. Damit greift das VBS nicht mehr korrekt und ich muss mir etwas einfallen lassen um den Fall des "ich finde yty = 555 nicht" zu umgehen. Ich müsste also irgetwie herausbekommen ob die If Abfrage durchgeführt wurde oder nicht. Wenn diese nicht durchgeführt wurde müsste ich Wert1 und Wert2 vergrößern um auf die theoretisch nächste Seite zu springen (Wert 1 also + 33 und Wert2 + 38).

    Folgendes habe ich mir gedacht:
    • in Zelle X-3 (3,24) wird die Zahl 2 bei jedem Neustart der for Anweisung eingetragen
    • Trifft der normlale Fall zu, also Baugruppe nicht länger als 38 Zeichen, soll die Zahl 2 durch eine 1 ersetzt werden.
    • Trifft der normale Fall nicht zu, soll durch eine weitere IF Abfrage der Wert überprüft werden
    • Dazu habe ich XYZ1 als Variable eingeführt und trage nach der normalen Abfrage den Wert von Zelle X-3 ein
    • Ist XYZ1 dann 1 muss nichts getan werden, ist XYZ1 gleich 2 müssen die Werte angepasst werden

    Leider haut es nicht hin. Hat jemand einen Rat wie ich das bewerkstelligen könnte oder wo mein Denkfehler ligen könnte?

    Visual Basic-Quellcode

    1. '____________SEITENUMBRÜCHE ERSTELLEN_______START_______
    2. Sub Umbrueche()
    3. Dim Seitenzahlen
    4. Dim ZeilendesExceldokumentes
    5. Dim yty
    6. Dim ptp
    7. Dim Wert1
    8. Dim Wert2
    9. Dim iLoop
    10. Dim XYZ1
    11. 'mit den Druckeinstellungen passen 39 Zeilen auf 1 Blatt
    12. objExcel.Cells(1,23).Value = ISDGetText("Zeilenzahl")
    13. objExcel.Cells(2,23).Value = ISDGetText("Seiten")
    14. objExcel.Cells(3,23).Value = ISDGetText("BG Länge")
    15. ZeilendesExceldokumentes = objExcel.Cells(1,24).Value
    16. Seitenzahlen = ZeilendesExceldokumentes/38
    17. objExcel.Cells(2,24).Value = ISDGetText(Seitenzahlen)
    18. objExcel.Cells(2,24).Value = objExcel.RoundUp(Seitenzahlen, 0)
    19. Seitenzahlen = objExcel.Cells(2,24).Value
    20. Wert1 = 6
    21. Wert2 = 39
    22. iLoop = 0
    23. If Seitenzahlen>1 then
    24. Do
    25. objExcel.Cells(3,24).Value = ISDGetText("2")
    26. For ptp = Wert2 To Wert1 Step -1
    27. yty = objExcel.Cells(ptp, 22).Value
    28. If yty = 555 Then
    29. objExcel.Rows(ptp+1).PageBreak = True
    30. Wert1 = ptp+1
    31. Wert2 = ptp+38
    32. objExcel.Cells(3,24).Value = ISDGetText("1")
    33. Exit For
    34. End If
    35. XYZ1 = objExcel.Cells(3,24).Value
    36. If XYZ1 = 1 then
    37. objExcel.Cells(3,25).Value = ISDGetText("übersprungen")
    38. Exit For
    39. End If
    40. If XYZ1 = 2 then
    41. objExcel.Cells(3,26).Value = ISDGetText("Werte angepasst")
    42. Wert1 = Wert1+33
    43. Wert2 = Wert2+38
    44. Exit For
    45. End If
    46. next
    47. iLoop = iLoop + 1
    48. Loop until ( iLoop = Seitenzahlen)
    49. End If
    50. End Sub
    51. '____________SEITENUMBRÜCHE ERSTELLEN_______ENDE_______

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felix_gorgas“ ()

    Hallo petaod,

    ich habe mir mal VBSedit herunter geladen und als Trial gestartet (habe ja keine Lizenz). Beim Test des Codes sagt mir die Debug Spalte:

    ***** script completed - exit code: 0 *****

    Hilft mir das weiter? Ich weiß leider nicht warum es nicht funktioniert. Mache ich etwas falsch von der Reihenfolge oder ist etwas an der falschen Stelle?

    MfG
    Das heisst zumindest, dass das Script durchläuft.

    Wenn du Fehler finden willst, musst du schon in Einzelschritten durch den Code gehen und an den kritischen Stellen schauen, ob der Code das macht, was sich der Programmierer vorgestellt hat.
    Soweit ich mich erinnere, kriegst du Einzelschritte mit F8.
    Breakpoints kannst du mit F9 setzen (oder mit der Maus).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    ich kann das VBS schlecht von allein starten. Das VBS wird von einem anderen Programm (CAD Software) ausgeführt welches Informationen an Excel übergibt. Das kann ich nur steuern in dem ich Beispiele aus dem Programm übergebe.

    MfG

    EDIT:
    Gerade wo ich es schreibe kommt mir der GEdanke, alles vor die FOR Anweisung zu legen. Jetzt funktioniert zumindest geht jetzt das Prinzip. Nun muss ich noch die korrekten Zahlenwerte "finden". Ich melde mich bei einem Problem nochmals. Danke!
    Hiho,

    sooooo Problem gelöst. Ich habe noch ein paar Dinge eingearbeitet um z.B. schnell einen Überblick über die Zeilenzahlen der einzelnen Seiten zu bekommen. Hier der Code für alle Wissbegierigen:

    Visual Basic-Quellcode

    1. '____________SEITENUMBRÜCHE ERSTELLEN_______START_______
    2. Sub Umbrueche()
    3. Dim Seitenzahlen
    4. Dim ZeilendesExceldokumentes
    5. Dim yty
    6. Dim ptp
    7. Dim Wert1
    8. Dim Wert2
    9. Dim iLoop
    10. Dim XYZ1
    11. Dim Subtraktion, Subtr1, Subtr2
    12. 'mit den Druckeinstellungen passen 38 Zeilen auf 1 Blatt
    13. objExcel.Cells(1,23).Value = ISDGetText("Zeilenzahl")
    14. objExcel.Cells(2,23).Value = ISDGetText("Seiten")
    15. objExcel.Cells(5,25).Value = ISDGetText("Wert 1")
    16. objExcel.Cells(5,26).Value = ISDGetText("Wert 2")
    17. objExcel.Cells(5,27).Value = ISDGetText("W2 - W1")
    18. ZeilendesExceldokumentes = objExcel.Cells(1,24).Value
    19. Seitenzahlen = ZeilendesExceldokumentes/37
    20. objExcel.Cells(2,24).Value = ISDGetText(Seitenzahlen)
    21. objExcel.Cells(2,24).Value = objExcel.RoundUp(Seitenzahlen, 0)
    22. Seitenzahlen = objExcel.Cells(2,24).Value
    23. Wert1 = 6
    24. Wert2 = 38
    25. iLoop = 0
    26. If Seitenzahlen>1 then
    27. Do
    28. XYZ1 = objExcel.Cells(3,24).Value
    29. If XYZ1 = 2 then 'Abfrage ob durch die For Anweisung ein Umbruch erstellt wurde. Ist dies nicht erfolgt steht noch Wert 2 in der Abfragezelle und die "Seite" wird übersprungen.
    30. Wert1 = Wert1+38
    31. Wert2 = Wert2+38
    32. End If
    33. For ptp = Wert2 To Wert1 Step -1
    34. If Wert1 = 6 then
    35. Wert1 = 0
    36. End If
    37. objExcel.Cells(iloop+6,25).Value = ISDGetText(Wert1)
    38. objExcel.Cells(iloop+6,26).Value = ISDGetText(Wert2)
    39. Subtr1 = objExcel.Cells(iloop+6,25).Value 'Wert1
    40. Subtr2 = objExcel.Cells(iloop+6,26).Value 'Wert2
    41. Subtraktion = Subtr2 - Subtr1 'Wert2 minus Wert 1
    42. objExcel.Cells(iloop+6,27).Value = ISDGetText(Subtraktion)
    43. objExcel.Cells(3,24).Value = ISDGetText("2")
    44. yty = objExcel.Cells(ptp, 22).Value
    45. If yty = 555 Then
    46. objExcel.Rows(ptp+1).PageBreak = True
    47. Wert1 = ptp+1 'Wert1 entspricht nun gefundener Zeile
    48. Wert2 = ptp+38 'Wert2 entspricht nun gefundener Zeile + 38 Zeilen nach unten
    49. objExcel.Cells(3,24).Value = ISDGetText("1") 'Wird benötigt um Baugruppen, die länger sind als 37 Zeilen, mit dem Umbruch zu überspringe
    50. objExcel.Cells(iloop+6,28).Value = ISDGetText("Umbruch")
    51. Exit For
    52. End If
    53. next
    54. iLoop = iLoop + 1
    55. Loop until ( iLoop = Seitenzahlen)
    56. End If
    57. End Sub
    58. '____________SEITENUMBRÜCHE ERSTELLEN_______ENDE_______


    MfG