Formatierung von Seitenrändern in Excel mittels VBA

  • Sonstige

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Formatierung von Seitenrändern in Excel mittels VBA

    Hallo zusammen, ich habe ein problem und komme einfach nicht auf die Lösung.


    Folgendes:


    Ich steuere via Outlook VBA ein Excelblatt.

    Alle Formatierungen klappen, aber nicht der Teil, wo ich die
    Seitenränder anpassen will, um das HTML Dokument möglichst groß auf ein
    Blatt gedruckt zu bekommen. Eigentlich müßte auch der Code für die
    Seitenränder richtig sein, aber es passiert nichts.

    Hier der Code:

    Visual Basic-Quellcode

    1. Set objExcel = CreateObject("Excel.Application")
    2. objExcel.Workbooks.Open FileName:=Pfad2 & Betreff & ".html"
    3. objExcel.Visible = True 'macht Excelfenster sichtbar
    4. objExcel.ActiveSheet.PageSetup.Orientation = xlPortrait
    5. objExcel.ActiveSheet.PageSetup.Zoom = False



    'dieser Teil der Anpassung des Seitenformates klappt nicht; die Seitenränder werden nicht verschoben

    Visual Basic-Quellcode

    1. objExcel.ActiveSheet.PageSetup.LeftMargin = Application.InchesToPoints(0.28740157480315)
    2. objExcel.ActiveSheet.PageSetup.RightMargin = Application.InchesToPoints(0.28740157480315)
    3. objExcel.ActiveSheet.PageSetup.HeaderMargin = Application.InchesToPoints(0.21740157480315)
    4. objExcel.ActiveSheet.PageSetup.TopMargin = Application.InchesToPoints(0.28740157480315)
    5. objExcel.ActiveSheet.PageSetup.FooterMargin = Application.InchesToPoints(0.21740157480315)
    6. objExcel.ActiveSheet.PageSetup.BottomMargin = Application.InchesToPoints(0.32740157480315)

    'bis hier hin klappt es nicht

    Visual Basic-Quellcode

    1. objExcel.ActiveSheet.PageSetup.FitToPagesWide = 1
    2. objExcel.ActiveSheet.PageSetup.FitToPagesTall = 1
    3. objExcel.ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1
    4. objExcel.ActiveWindow.Close False
    5. myMail.UnRead = False 'Mail auf gelesen setzen


    Jemand eine Idee warum die Anpassung der Seitenränder einfach ignoriert werden?

    Freue mich auf euer Feedback!


    Vielen Dank. :)


    Edit by LaMa5:
    -->*moved* (Hauptforum => VBA)
    - VB-Tag eingefügt, das nächste Mal bitte selbst dran denken
    - unnötige Leerzeilen zwischen jeder(!) Code Zeile entfernt

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

    Du verwendest Outlook, um per Excel ein HTML zu drucken.
    Ok. Meinetwegen.

    Lösungsansatz:
    Lade das HTML-Dokument in Excel und formatiere es manuell so, bis du den gewünschten Erfolg hast.
    Diesen Formatierungsvorgang lässt du vom Macro-Recorder aufzeichnen.
    Dann siehst du schnell, was der anders macht.
    Solange du es manuell nicht formatiert bekommst, brauchst du auch nicht versuchen, es per Code hinzukriegen.

    P.S.:
    Gewöhne dir an, Objekte einer Variablen zuzuweisen, anstatt mit ActiveSheet und ActiveWindow zu arbeiten:

    Visual Basic-Quellcode

    1. Set Excel = CreateObject("Excel.Application")
    2. Set WB = Excel.Workbooks.Open (FileName:=Pfad2 & Betreff & ".html") 'Workbook
    3. Excel.Visible = True
    4. Set WS = WB.Sheets(1) 'Worksheet
    5. WS.PageSetup.Orientation = xlPortrait
    6. ...
    7. WB.Close False


    Edit:
    Dein eigentliches Problem dürfte sein, dass du Application verwendest.
    Application zeigt in deinem Fall auf "Outlook.Application" und nicht auf Excel.Application
    Ausserdem dürfte in Outlook xlPortrait nicht definiert sein.

    Visual Basic-Quellcode

    1. Private Const xlPortrait = 1
    2. Set Excel = CreateObject("Excel.Application")
    3. Set WB = Excel.Workbooks.Open (FileName:=Pfad2 & Betreff & ".html")
    4. Set ws = WB.Sheets(1)
    5. Excel.Visible = True
    6. WS.PageSetup.Orientation = xlPortrait
    7. WS.PageSetup.Zoom = False
    8. WS.PageSetup.LeftMargin = Excel.InchesToPoints(0.28740157480315)
    9. WS.PageSetup.RightMargin = Excel.InchesToPoints(0.28740157480315)
    10. WS.PageSetup.HeaderMargin = Excel.InchesToPoints(0.21740157480315)
    11. WS.PageSetup.TopMargin = Excel.InchesToPoints(0.28740157480315)
    12. WS.PageSetup.FooterMargin = Excel.InchesToPoints(0.21740157480315)
    13. WS.PageSetup.BottomMargin = Excel.InchesToPoints(0.32740157480315)
    14. WS.PageSetup.FitToPagesWide = 1
    15. WS.PageSetup.FitToPagesTall = 1
    16. WS.PrintOut From:=1, To:=1, Copies:=1
    17. WB.Close False
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hallo petaod,

    vielen Dank für Deine Antwort, es hat mich auf die richtige Spur gebracht.
    Application wurde durch objExcel ersetzt und dann klappten auch die Formatierungen.
    Jetzt ist alles wunderbar.

    Noch einmal vielen Dnak für die Hilfe und noch einen schönen (winterlichen) Tag ;)
    Freut mich, dass du zufrieden bist.
    Dann müsste ich es eigentlich auch sein und sollte einfach meine Schnauze halten.
    Heute schaffe ich das nicht.

    Dein Verhalten ist nicht untypisch.

    Ich erzähle dir, dass dein Programm-Design verbesserungswürdig ist und am Schluß weise ich dich auf deinen eigentlichen Denkfehler hin.
    Da ich nicht erwartet habe, dass du alles sofort umsetzt, werfe ich dir den fertigen Code incl. Design- und Funktions-Korrekturen hin.
    Was machst du?
    Du pickst dir die funktionale Korrektur raus und baust sie in dein Schrott-Design ein.

    Na gut, es ist dein Programm.

    P.S.:
    Wärst du nicht blind dem Macrorecorder gefolgt, sondern hättest versucht, die Methoden zu verstehen, wäre dir aufgefallen, dass du Excel.InchesToPoints eigentlich gar nicht benötigst, um die Margins auf einen konstanten Wert zu setzen.
    Aber so weit wollte ich gar nicht gehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Noch eine kurze Anschlussfrage:

    Es werden in dem Code mit einer Schleife verschiedene Workbooks geöffnet und wieder geschlossen. Wenn ich den Set Befehl von dir benutze, soll ich dann diesen Set Befehl nach jeder Schleife auf nothing setzen oder vllt nur ganz zum Schluss des Makros oder brauche ich das gar nicht zu machen?

    Danke :)
    Es reicht, wenn du die WB-Variable einfach neu belegst.
    Und beim Verlassen der Prozedur wird die Variable sowieso zerstört, wenn sie nur innerhalb der Sub (explizit oder implizit) definiert wurde.

    Explizite Definition außerhalb :

    Visual Basic-Quellcode

    1. Private WB as Workbook 'Variable wird modulweit definiert
    2. Sub Main
    3. Set WB=Workbooks.Open(...)
    4. ...
    5. End Sub
    Variable bleibt erhalten.

    Explizite globale Definition:

    Visual Basic-Quellcode

    1. Public WB as Workbook 'Variable wird projektweit definiert
    2. Sub Main
    3. Set WB=Workbooks.Open(...)
    4. ...
    5. End Sub
    Variable bleibt erhalten.

    Explizite Definition innerhalb:

    Visual Basic-Quellcode

    1. Sub Main
    2. Dim WB as Workbook 'Eine neue Variable wird definiert, selbst wenn außerhalb bereits mit gleichem Namen existiert
    3. Set WB=Workbooks.Open(...)
    4. End Sub
    Variable wird zerstört.

    Implizite Definition innerhalb:

    Visual Basic-Quellcode

    1. Sub Main
    2. Set WB=Workbooks.Open(...) 'Variable wird definiert, falls sie nicht außerhalb existiert
    3. End Sub
    Variable wird zerstört.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --