2016-04-25 7 views
8

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,

+0

Keine Ideen? Jede Kritik wäre willkommen! – Edgard

+0

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

Antwort

2

schlage ich allgemeine Hinweise zum Thema, wenn VBA Code funktioniert gut, während F8 in dem Debug-Modus schlagen, aber es funktioniert nicht, nicht nach F5 trifft die ganze Makro auszuführen.

Hinweis 1. Verwenden Sie ThisWorkbook.ActiveSheet anstelle von ActiveWorkbook.ActiveSheet wann immer möglich, um das richtige Blatt zu referenzieren. Verwenden Sie ThisWorkbook.Application anstelle von nur Application. Es könnte sein, dass Sie ein anderes Addin-Programm im Hintergrund arbeiten, wechseln ActiveSheet zu etwas, das Sie möglicherweise nicht bewusst sind. Überprüfen Sie, ob andere Makros aktiviert sind und entfernen Sie alles, was Sie nicht verwenden. Bevor Sie etwas Wichtiges in Ihrem Code eingeben, versuchen Sie, den Fokus für Ihr Blatt mit ThisWorkbook.Activate zu erhalten. Sehen Sie sich die Grafik auf dieser Seite: http://analystcave.com/vba-tip-day-activeworkbook-vs-thisworkbook/

Hint 2. Kraft Excel in anderer Weise zu warten, dann DoEvents.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Place this line of code at the very top of module 
Sleep 1 'This will pause execution of your program for 1 ms 

https://stackoverflow.com/a/3891017/1903793 https://www.fmsinc.com/microsoftaccess/modules/examples/AvoidDoEvents.asp

Oder alternativ:

Application.Calculate 
If Not Application.CalculationState = xlDone Then 
    DoEvents 
End If 

https://stackoverflow.com/a/11277152/1903793

Hinweis 3. Wenn die oben immer noch nicht zum Auffrischen Gebrauch arbeiten:

ThisWorkbook.Connections("ConectionName").Refresh 
ThisWorkbook.Application.CalculateUntilAsyncQueriesDone 

https://stackoverflow.com/a/26780134/1903793

Verwandte Themen