Excel VBA - Ansicht auf jedem Rechner gleich machen?
Hallo,
wir haben unterschiedliche Arbeitsplätze mit diversen Druckertreibern.
Dadurch sehen manche Excel-Tabellen bei jedem unterschiedlich aus, wodurch die Zeilen teilweise auf eine neue Seite verschoben werden.
Kann man das ggf. mit Excel-VBA sicherstellen, dass es gleich bleibt?
Danke im Voraus.
4 Antworten
OOps. Wie ich grade feststelle gibt es doch dieses Event.
In diesem könnte man nun den Code unterbringen, der Skaliert UND auch die
Spalten und Zeilen so auslegt, dass diese den Druckbereich darstellen.
Hier mal noch Code der den Druckbereich ausrichtet als Beispiel. (ggf auf deine Bedürfnisse anpassen)
' Set ActiveSheet.HPageBreaks(1).Location = Range("A5")
' Set ActiveSheet.VPageBreaks(1).Location = Range("Q1")

mmhh. Warum in jedem Tabellenblatt?
Du kannst im "Workbook" ebenfalls jedes Event greifen und dort prüfen für welches Tabellenblatt es nötig war.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
With Sh.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End Sub
Das soll auf alle Tabellenblätter angewendet werden. Die sind alle gleich vom Layout.
eben. dann genügt es das Event im Workbook "einmal" zu programmieren und zu schauen, "wo man gerade ist". Dieser Code würde sich dann auch automatisch um weitere Blätter kümmern, die ggf mal ergänzt werden. 'Keine' VBA Anpassung nötig.
Also der letzte Code von Dir ist für alle Tabellenblätter gültig?
Ich habe es nicht selbst getestet. Sollte aber funktionieren.
ABER es muss im "Workbook" Object hinterlegt werden, nicht auf einem Tabellenblatt.
UND die Workbook Events werden immer zuerst ausgeführt.
Wenn du also einen Breakpoint setzt wirst du feststellen, dass man es im Workbook landet, alles dort abgearbeitet wird um anschließend noch den individuellen Sheet Source auszuführen.
Ich Schlage also vor. Lösche den Code in Tabelle1
Setze den Code in Workbook um.
Löse das "ActivateSheet" für Tabelle1 aus und prüfe was passiert.
Habe ich, aber ich kann es nicht testen, weil bei mir die Ansicht inzwischen passt. :-)
Hm. So etwa in den dort bestehenden Code einfach einbinden?
Private Sub Workbook_Open(ByVal Sh As Object)
Dim msg As String
With Sh.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Worksheets(1).Activate
msg = MsgBox("Soll das Eingabeformular gestartet werden?", vbYesNo, "")
If msg = vbYes Then
UserForm1.Show
Else
Exit Sub
End If
End Sub
Excel selbst weiß erstmal nicht von dem Zieldrucker.
Wenn nun jemand mit seinem Rechner das Excel öffnet sind dort diverse Drucker
(lokal oder Netzwerk) hinterlegt. Erst im Moment der Druckerwahl ist also klar auf welchen Treiber skaliert werden muss.
Mir ist kein Befehl bekannt der "OnPrinter_Selection' nochmal Änderungen am Sheet zulässt.
Ggf hilft es bereits im WorkbookOpen_Event
Hardcoded den Druckbereich auf die gewünschten Zeilen und Spalten zu "rücken".
Dies kann man per Makroaufzeichnung erledigen und dann im Event hinterlegen.
Bei Bedarf kann ich aber auch nen Beispiel Code posten.
Es hat wohl mit der Skalierung zu tun und ich habe nun folgendes eingesetzt:
Private Sub Worksheet_Activate()
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End Sub
Es funktioniert halt aber dennoch erst, wenn man auf Drucken geht.
Aber wenn man das öffnet und die Standardansicht ist das Seitenlayout, wird es eben zunächst falsch angezeigt.
Habe es auf der Arbeit angepasst und Zuhause geöffnet und nun sind Zeilen nicht mehr alle in der Ansicht, wodurch 2 Seiten angezeigt werden.
Es muss doch irgendwie möglich sein, dass im Hintergrund dieser Druckmodus mit Skalierung gestartet wird, damit sich die Ansicht aktualisiert, oder?
ggf einmal für jedes Tabellenblatt in den Druckereinstellungen festlegen, dass es auf eine Seitenbreite skaliert werden soll.
Das war bereits eingestellt. Scheint nicht zu funktionieren.
Hast Du mal geprüft, ob unterschiedliche Schriftarten genutzt werden ?
Da es sich um eine Vorlage handelt, die jeder benutzen soll wird auch nichts geändert. Wenn man aber die Ansicht von Umbruchvorschau auf Normalansicht hin und her schaltet, dann scheint es zumindest beim Kollegen wieder zu passen. Echt doof, wenn man das immer machen muss.
Wenn du im Workbook Open Event die Dinge anstoßen willst ist wieder etwas mehr Arbeit nötig, da im Open event das SheetObject NICHT vorhanden ist.

Kannst Du mir vielleicht helfen, wie ich beim Öffnen der Tabelle bzw. der Tabellenblätter eine Aktualisierung vom Seitenlayout vornehme? Wenn ich manuell in die Druckansicht gehe und zurück dann passt ja auch das Seitenlayout wieder. Wie kann ich das automatisieren? Da wäre ich sehr dankbar, da das meine letzte Aufgabe ist, die ich lösen möchte.
Ich dachte dies hätte ich schon. Im Workshop Chance event den Code wie bereits beschrieben einbauen.
UND
Im workbook_open Event den anderen Vorschlag. Grundsätzlich hast du den funktionierenden Code. Nun gilt es diesen mit den verschiedenen Events zu koppeln.
Dies kriegst du hin :-)
Echt? Das Ich habe bereits anderen Code im Workbook_Open Event:
Private Sub Workbook_Open()
Dim msg As String
Worksheets(1).Activate
msg = MsgBox("Soll das Eingabeformular gestartet werden?", vbYesNo, "")
'Worksheets("Fertigungsprüfplan Seite 1").[BA5] = Environ$("USERNAME")
If msg = vbYes Then
UserForm1.Show
Else
Exit Sub
End If
End Sub
Wenn ich Deinen Code einfüge erhalte ich eine Fehlermeldung.
Also was unten steht funktioniert dann nicht:
Private Sub Workbook_Open(ByVal Sh As Object)
Dim msg As String
With Sh.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Worksheets(1).Activate
msg = MsgBox("Soll das Eingabeformular gestartet werden?", vbYesNo, "")
If msg = vbYes Then
UserForm1.Show
Else
Exit Sub
End If
End Sub
Dieser Code konnte nicht funktionieren, da workbook_open keine Parameter hat.nur (). Dann kommt mein Beispiel mit der schleife ins Spiel. Was macht die üserform ?
Die Userform macht sehr viel... Glaube da kann ich nicht ins Detail gehen, das würde sehr lange dauern....
Uns hat auch zu viele Zeichen um das hier einzufügen. Die UserForm hat ein paar Buttons und Textfelder sowie Label.
Ok. So wie es jetzt ist kann man nur nicht damit arbeiten. :-(
Hi, aber auch hier würde es doch nur wirken, wenn man auf Drucken geht?
Ich habe aktuell dieses hier in jedem Tabellenblatt:
Das Problem ist halt, dass ich möchte, dass dieser Code beim Öffnen des Dokuments und dann für alle Tabellenblätter (auch die ausgeblendeten) oder zumindest dann beim aktivieren eines Tabellenblatts, ausgeführt wird.
Denn die Seitenansicht soll beim Laden direkt richtig angezeigt werden, damit es nicht irritiert.
' Set ActiveSheet.HPageBreaks(1).Location = Range("A5")
' Set ActiveSheet.VPageBreaks(1).Location = Range("Q1")
Muss ich da die komPlette Range eingeben (z. B. "A5:A10")?