Ich soll einige große Datenbereiche von Excel nach Powerpoint exportieren, eine Seite pro Folie, und natürlich sollte ich die Seitenumbrüche behandeln, um "verwaiste" Zeilen oder Spalten zu vermeiden.Wie kann ich Excel zwingen, Seitenumbrüche korrekt zu zählen?
Ich versuche zu überprüfen, wie viele Seiten ich vertikal und horizontal mit einem bestimmten Zoom haben würde, indem ich HPageBreaks.Count und VPageBreaks.Count lese, und dann manuell die Position jedes Bruches definiere. Die Idee ist ungefähr die gleiche Breite und Höhe auf jeder Seite zu haben.
Wenn ich meinen Code Schritt für Schritt debugge, läuft es gut, und die Logik scheint in Ordnung, aber wenn ich es "frei" ausführen, sind die Seitenumbrüche vollständig deaktiviert. Wenn ich einige MsgBox-Anweisungen hinzufüge, sehe ich, dass wenn ich HPageBreaks.Count (oder vertikal) lese, die falschen Werte erhalten werden. (Ich kann die richtigen überprüfen, wenn ich manuell mache, was der Code tun soll).
In vielen vielen Foren suchen, sehe ich einige hässliche Umgehungslösungen wie Erzwingen eines Reset von PaperSize (ws.PageSetup.PaperSize = ws.PageSetup.PaperSize). Nachdem Sie einige von ihnen ausprobiert hatten, schien es besser zu sein, PrintCommunication vor einem Wechsel zu PageSetup zu deaktivieren und dann wieder einzuschalten. Dies funktionierte gut auf den meisten meiner Blätter, aber auf den wirklich großen (~ 750 Zeilen x 80 Spalten, fast alle Zellen mit Formeln), tut es einfach nicht.
Hier ein Auszug aus dem Code:
'Reset page breaks
.ResetAllPageBreaks
'Set minimum acceptable zoom factor
Application.PrintCommunication = False 'This is the ugly workaround
.PageSetup.Zoom = 60
Application.PrintCommunication = True
MsgBox "Zoom = " & .PageSetup.Zoom 'Only for debugging
'Calculate the number of pages in width
Application.PrintCommunication = False
NPagesWide = .VPageBreaks.Count + 1
Application.PrintCommunication = True
MsgBox "NPagesWide = " & NPagesWide
'Find the higher zoom factor that can fit that number of pages
Application.PrintCommunication = False
.PageSetup.Zoom = 100
Application.PrintCommunication = True
Do While .VPageBreaks.Count > NPagesWide - 1
Application.PrintCommunication = False
.PageSetup.Zoom = .PageSetup.Zoom - 5
Application.PrintCommunication = True
Loop
MsgBox "Zoom = " & .PageSetup.Zoom
'Set average width per page and initialize column pointer
If HasTitleColumns Then 'Defined earlier
PageWidth = (PrintArea.Width + TitleColumns.Width * (NPagesWide - 1))/NPagesWide
j = TitleColumns.Columns(TitleColumns.Columns.Count).Column + 1
Else
PageWidth = PrintArea.Width/NPagesWide
j = 1
End If
'Cycle vertical page breaks
For i = 1 To NPagesWide - 1
'Set width of TitleColumns
If HasTitleColumns Then
CumulWidth = TitleColumns.Width
Else
CumulWidth = 0
End If
'Cumulate columns width until the available page width
Do While CumulWidth + .Columns(j).Width <= PageWidth
CumulWidth = CumulWidth + .Columns(j).Width
j = j + 1
Loop
'Add the break
.VPageBreaks.Add .Columns(j + 1)
Next i
Irgendwelche Ideen, warum dies geschieht, und wie kann ich sie lösen?
Danke,
Keine Ideen? Jede Kritik wäre willkommen! – Edgard
Haben Sie versucht, nach der Zeile, in der Sie den Zoom ändern, 'DoEvents' hinzuzufügen? Normalerweise empfehle ich das nicht, aber in diesen Fällen, in denen es scheint, dass die Aktion nicht abgeschlossen ist, bevor du den nächsten Befehl nimmst, zog es mich aus einigen wirklich unlösbaren Mysterien heraus. Wenn es funktioniert, kann ich es zu einer Antwort machen. – ib11