Hallo!
Also, ich bräuchte mal dringend Hilfe. Ich möchte in Excel, dass das Speicherdatum in der Fußzeile erscheint. Wie das geht (über VBA), habe ich schon mitbekommen, den entsprechenden Code gebe ich in „Diese Arbeitsmappe“ ein, richtig? Dann habe ich das Speicherdartum aber nur für die aktuelle Arbeitsmappe.
Aber: Wie kann ich es schaffen, dass dieses Makro-Dingens, das ich ja damit erzeuge, IMMER für mich verfügbar ist? Ich möchte ein Icon haben, auf das ich einfach klicken kann und dann fügt Excel mir auch in neue Dokumente das Speicherdarum in der Fußzeile ein. Geht das??? Hilfe, bitte! Danke schon mal an euch!
Du mußt Makro und Schaltfläche in Deiner Personl.xls speichern.
Schritt 1: Personl.xls erzeugen, Prozedur erzeugen
- Wenn keine Datei offen ist: Extras - Makro - Aufzeichnen: Makro speichern in Persönliche Makroarbeitsmappe
- Aufzeichnung gleich beenden. In VB-Editor wechseln (Alt+F11). Im Projektexplorer erscheint jetzt das VBA-Projekt Personl.xls. Dort gibt’s jetzt auch ein Modul1.
- Dort ist auch Dein soeben aufgezeichneter Prozedurrumpf drauf. Gib Deinen Code ein.
Schritt 2: Schaltfläche erzeugen
- Zurück zu Excel. Immer noch keine Datei offen. Fenster - Einblenden: Personl.xls
- Extras - Anpassen - Befehle, Kategorie Makros: ‚Benutzerdefinierte Schaltfläche‘ an den gewünschten Platz ziehen
- im Anpassen-Dialog [Auswahl ändern] - Makro zuweisen: die erzeugte Prozedur erscheint.
- [Schließen].
- Fenster - Ausblenden (unbedingt, sonst wird Personl.xls bei jedem Excel-Start angezeigt).
HTH
Danke für Deine Antwort!
ABER: das geht nicht. Bei diesem Makro zum Speicherdatum muss ich im VBA-Editor „Workbook“ und „Before Save“ wählen, wenn ich den Makro erstellen möchte. Und diese Option gibt es nicht im Modul1 der PERSONAL.XLS. Hast Du das ausprobiert, geht das bei Dir? Ich bin auch Neuling und vielleicht stelle ich mich ja blöd an, aber irgendwie klappt es nicht…
ABER: das geht nicht. Bei diesem Makro zum Speicherdatum muss
ich im VBA-Editor „Workbook“ und „Before Save“ wählen, wenn
ich den Makro erstellen möchte. Und diese Option gibt es nicht
im Modul1 der PERSONAL.XLS. Hast Du das ausprobiert, geht das
bei Dir? Ich bin auch Neuling und vielleicht stelle ich mich
ja blöd an, aber irgendwie klappt es nicht…
Hallo Bibi,
zeig mal deinen Code.
Gruß
Reinhard
Hallo Reinhard,
so sieht der aus:
Private Sub Workbook_BeforeSave( _
ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
wks.PageSetup.LeftFooter = "Gespeichert am: " & Format(Date, „dd.mm.yyyy“)
Next wks
End Sub
Danke schonmal und liebe Grüße von Bibi
Private Sub Workbook_BeforeSave( _
ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
wks.PageSetup.LeftFooter = "Gespeichert am: " &
Format(Date, „dd.mm.yyyy“)
Next wks
End Sub
Hallo Bibi,
dann geht das so nicht, zumindest nicht ohne Klassenmodul in der personl.xls.
Workaround wäre, lege dir in Excel oben ein Symbol an dem du das Makro
personl.xls!Speichern
zuweist. Zum Speichern klickst du dann auf diesen Button.
Wenn du im nachfolgenden Code
ActiveWorkbook.Save
durch
ActiveWorkbook.close Savechanges=true
ersetzt, wird die Mappe im Speicherdatum aktualisiert und gespeichert und geschlossen.
In einem allgemeinen Modul(z.B. Modul1) der personl.xls hast du dann
Option Explicit
'
Sub Speichern()
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
wks.PageSetup.LeftFooter = "Gespeichert am: " & Format(Date, "dd.mm.yyyy")
Next wks
ActiveWorkbook.Save
End Sub
Gruß
Reinhard
Dann müssen wir Schritt 1 etwas abwandeln.
Schritt 1: Personl.xls erzeugen, Prozedur erzeugen
- Wenn keine Datei offen ist: Extras - Makro - Aufzeichnen: Makro speichern in Persönliche Makroarbeitsmappe
- Aufzeichnung gleich beenden. In VB-Editor wechseln (Alt+F11). Im Projektexplorer erscheint jetzt das VBA-Projekt Personl.xls.
- Im Projektexplorer (Strg+R) Doppelklick auf ‚Diese Arbeitsmappe‘: das Codefenster dieses Klassenmoduls wird angezeigt. Obendrüber gibt es zwei Dropdown-Felder. Im linken steht ‚(Allgemein)‘, im rechten ‚(Deklarationen)‘.
- Im linken Textfeld ‚Workbook‘,* im rechten das Ereignis ‚BeforeSave‘ auswählen. Der Prozedurrumpf dieses Ereignisses erscheint.
- Statt dem von Dir geposteten Code würde ich nur einen Befehl eingeben:**
ActiveWorkbook.PageSetup.LeftFooter =
"Gespeichert am: " & Format(Date, „dd.mm.yyyy“)
Bitte in einer Zeile eingeben, obwohl hier zwei dargestellt werden.
Auf Schritt 2 kannst Du dann verzichten, weil das Ereignis BeforeSave automatisch ausgelöst wird. Allerdings würde ich mir das irgendwo notieren, wenn Du mal eine Schaltfläche mit einer eigenen Prozedur in Excel anlegen willst.
____________
* Den Code für Workbook_Open, der da automatisch auftaucht, solltest Du aus hygienischen Gründen löschen: wenn die Prozedur nicht da ist, muß VBA sie auch nicht lesen.
** Ich verzichte auf die Schleife. BeforeSave wird von dem Workbook ausgelöst, das gespeichert werden soll. Warum soll man dann alle anderen Workbooks mit behandeln, wenn doch jedes einzelne dieses Ereignis selbst auslöst?
Korrektur
Moin,
es muß heißen:
Sub Speichern()
Dim wks As Worksheet
For Each wks In **ActiveWorkbook**.Worksheets
wks.PageSetup.LeftFooter = "Gespeichert am: " &
Format(Date, "dd.mm.yyyy")
Next wks
ActiveWorkbook.Save
End Sub
Gruß
Reinhard
Moin Markus,
Auf Schritt 2 kannst Du dann verzichten, weil das Ereignis
BeforeSave automatisch ausgelöst wird.
jain, die Ereignisprozedur „BeforeSave“ wird schon automatisch ausgelöst, aber nur dann wenn personl.xls gespeichert wird.
Soll Code in personl.xls auf das Speichern einer beliebigen anderen Mappe reagieren brauchst du ein Klassenmodul.
** Ich verzichte auf die Schleife.
…
Warum soll
man dann alle anderen Workbooks mit behandeln, wenn doch jedes
einzelne dieses Ereignis selbst auslöst?
Nein, geht nur mit Schleife. Die Schleife geht über alle Blätter nicht über alle Mappen!
Gruß
Reinhard
Lösung, Klassenmodul für Speichern
Hallo Bibi,
das Nachfolgende gehört alles in deine Personl.xls.
Modul: DieseArbeitsmappe
Option Explicit
Private Sub Workbook\_Open()
initializeClass
End Sub
Modul: Standardmodul, z.B. Modul1
Option Explicit
Dim AppObject As New clsWorkbook
Sub initializeClass()
Set AppObject.App = Application
End Sub
Modul: clsWorkbook
Option Explicit
Public WithEvents App As Application
Private Sub App\_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim wks As Worksheet
For Each wks In Wb.Worksheets
wks.PageSetup.LeftFooter = "Gespeichert am: " & Format(Date, "dd.mm.yyyy")
Next wks
End Sub
Modul clsWorkbook ist ein Klassenmodul. Einfach Einfügen—Klassenmodul.
Dann F4 drücken, dort im Fensterchen den Namen abändern auf clsWorkbook.
Eigenschaftsfensterchen schließen.
Dann oben links im VB-Editor auf Datei klicken um deine Personl.xls zu speichern.
Excel beenden, neu starten.
PS: Danke an Sepp für Hilfe zum Klassenmodul 
Gruß
Reinhard
Selbstverständlich hast Du recht. danke für die Aufmerksamkeit.
Gruß
Markus
Frage zur Lösung Klassenmodul für Speichern
Hallo Reinhard,
m.E. reicht es vollkommen aus, die von Dir beschriebene Schleife über alle Worksheets in den von mir beschriebenen Prozedurrumpf einzutragen.
Denn m.W. ist „Diese Arbeitsmappe“ bereits ein Klassenmodul, und der Event handler WBk_BeforeSave ist dort bereits vorgegeben, weil dort vorgesehen.
Danke für die Rückmeldung.
Gruß
Markus
______________
P.S.: Den Weg mit der Aufzeichnung des leeren Makros habe ich nur gezeigt, um dem User das manuelle Erstellen einer Personl.xls zu ersparen, und sicherzustellen, daß Personl.xls am richtigen Ort ist.
Hallo Markus,
m.E. reicht es vollkommen aus, die von Dir beschriebene
Schleife über alle Worksheets in den von mir beschriebenen
Prozedurrumpf einzutragen.
Mit Prozedurrumpf meinst du Workbook_BeforeSave in der Personl.xls.
Da die Schleife rein würde funktionieren, aller dings nur für die Worksheets in der Personl.xls sofern man diese speichert.
Speichern einer anderen Mappe ruft dieses Ereignis (Workbook_BeforeSave) NICHT aus.
Denn m.W. ist „Diese Arbeitsmappe“ bereits ein Klassenmodul,
und der Event handler WBk_BeforeSave ist dort bereits
vorgegeben, weil dort vorgesehen.
Ja, genau wie Tabelle1 usw. handelt es sich um Klassenmodule.
Aber die beziehen sich einzig auf die Mappe in der sie stehen.
Nur, so wie ich es gezeigt habe, mit EIGENEN Klassenmodulen kannst du Ereignisse in anderen Mappen „abfangen“.
P.S.: Den Weg mit der Aufzeichnung des leeren Makros habe ich
nur gezeigt, um dem User das manuelle Erstellen einer
Personl.xls zu ersparen, und sicherzustellen, daß Personl.xls
am richtigen Ort ist.
Das ist doch sehr korrekt. Es ist viel komplizierter Nichtsofitten zu erklären wie sie selbst eine Personl.xls erstellen können und in den richtigen Ordner stellen können.
Da ist es viel einfacher zu sagen, erstelle dir ein beliebiges Makro durch Aufzeichnung und bei der anfänglichen Abfrage wohin es gespeichert werden soll wählst du persönlicheArbitsmappe…
Gruß
Reinhard
Hallo Reinhard,
Da die Schleife rein würde funktionieren, aller dings nur für
die Worksheets in der Personl.xls sofern man diese speichert.
Speichern einer anderen Mappe ruft dieses EreignisWorkbook_BeforeSave) NICHT aus.
Ich hatte nicht getestet, ob mein Gedankengang funktioniert.
Nur, so wie ich es gezeigt habe, mit EIGENEN Klassenmodulen
kannst du Ereignisse in anderen Mappen „abfangen“.
Du hast vollkommen recht, anders geht es nicht. Tschuldigung.
Gruß
Markus
Workbook_BeforeSave) NICHT aus.