VBA Aufrufen Public Sub im Arbeitsblatt-Modul: Übersprechen zwischen Blatt-und ThisWorkbook Module
Ich war so froh, dass das funktioniert, dass ich dachte, dass ich es teilen würde...
Es mir erlaubt haben ein generisches event-Handler in der ThisWorkbook
- Modul zu initiieren Arbeitsblatt-spezifischen code in eine anonyme ActiveSheet
.
Ich die CalByName
- Funktion Zugriff auf Benutzer-definierte, Öffentliche Methoden in der Blatt-Objekte.
Verwende ich es neu starten einen timer, der getötet wird, durch automatische wiederherstellen speichert und es funktioniert Super. Ich habe es auf zwei Blatt.
In ThisWorkbook
Modul:
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Dim ws As Worksheet
Set ws = ActiveSheet
On Error GoTo afterSaveFailed
CallByName ws, "afterSave", VbMethod
If debugEvents Then Debug.Print timeStamp & ": " & "AfterSave: afterSave called in sheet: " & ws.Name
On Error GoTo 0
Exit Sub
afterSaveFailed:
If debugEvents Then Debug.Print timeStamp & ": " & "AfterSave: afterSave Failed in sheet: " & ws.Name
Err.Clear
End Sub
dann im jeweiligen Arbeitsblatt Modul:
Public Sub afterSave()
'sheet specific after save handler
End Sub
Du musst angemeldet sein, um einen Kommentar abzugeben.
CallByName
ist eine sehr alte und bekannte Methode. 🙂Auch in Ihrem code
debugEvents
Sie möchten möglicherweise verwenden SieOption Explicit
_AfterSave
und nicht_BeforeSave
? Was ist, wennafterSave()
eine änderung in der Arbeitsmappe? Sie haben, um erneut zu speichern, bevor Sie schließen.Auch anstelle von einfügen den code in der jeweils gültigen Arbeitsblatt und das erstellen doppelter code warum nicht einen gemeinsamen code in ein Modul?
Worst-Case-Szenario:
Unter der Annahme, dass die
afterSave
ist anders für jedes Arbeitsblatt. Sie können immer mit einerSelect Case
. Dadurch wird sichergestellt, dass Sie Ihren code an einem Ort. Sie müssen nicht hüpfen herum, den code zu überprüfen.danke für die Kommentare. Meine Antworten sind unten eingefügt:
Welches ist, warum ich nicht berechtigt den Beitrag "
CallByName
".Wenn Sie den Titel Lesen, das ist, worum es geht. Ich konnte nicht eine Lösung finden, um diese auf dem web so hatte ich, um herauszufinden, meine eigene Methode. Mein Punkt ist nicht über
CallByName
zur cross-talk zwischen den Modulen und mitCallByName
um eine maximale Wirkung zu erreichen, schlage ich vor, dassCallByName
ist Roman.Ich denke, ich könnte das gleiche zu erreichen, was mit
RaiseEvents
aber ich denke, das ist mehr straight-forward.War ich einfach nur glücklich coz VBA war, lassen Sie mich machen, was ich wollte für eine Veränderung :q
Es ist ein globales flag, um zu kontrollieren, wie laut das Direktfenster ist. Ja ich benutze immer option explicit und tun so in diesem Fall. Ich nehme an, das ist gegeben.
Weil die Sachen, die ich mache, muss getan werden, nachdem das speichern abgeschlossen ist, und nicht bevor es startet. Die
Autorecovery
speichern event tötet einen timer, der bei mir läuft, also muss ich neu starten, damit es nach dem speichern.Weil Ihr "Blatt-spezifische"
OK, ich werde darüber nachdenken: danke für die Anregung 🙂
Wenn ich generische Funktionen, die ich bevorzuge, zu behandeln, die mit
Class Modules
. Für mich ist das übersichtlicher: ich-Instanz das Objekt in das Blatt machen, dass das generische Funktionen, und wie in deinem Vorschlag, ich habe nur zu prüfen, es einmal. Ich benutze auch dieClass_Initialize
undClass_Terminate
Veranstaltungen transparent zu verwalten Lebenszyklus der generischen Funktionen. Ich konnte das nicht mit generischen code in derThisWorkbook
Objekt.Thats, wie ich handle die Allgemeinen Funktionen, für Objekt-spezifische Merkmale, meine Präferenz ist es, zu sammeln, die Codes, die spezifisch für das Objekt, das eigentliche Objekt: ich bevorzuge schüchtern Objekte. Es gibt wirklich keine Notwendigkeit zu setzen, die detail-Kontroll-code. Auch, wenn ich auf Arbeit bin das Blatt, ich habe nicht wieder überspringen zu einem Allgemeinen Modul, und ich don ' T haben, um zu versuchen und daran erinnern, wo ich den code oder erfinden einige übereinkommen, weil es genau dort in das Blatt.
Danke Ihnen sehr für die Zeit nehmen, um ausführlich beantworten!