Allgem. Frage: Wo speicher ich den Code?

Bild

Betrifft: Allgem. Frage: Wo speicher ich den Code?
von: P-Quest :-)
Geschrieben am: 25.07.2015 21:28:16

Hallo,
ich habe ein VBA Project realisiert und jetzt fällt mir auf, dass es nicht, wie bei einem Makro üblich, in einem allg. Modul sondern im Tabellenblatt zu finden ist.
Grund dafür ist, dass es mit dem Klicken auf eine Schaltfläche beinnen sollte und die ist ja nun mal Bestandteil des Blattes. Also habe ich fröhlich pfeifend jeden weiteren Code auch in dieses Blatt gepackt, auch wenn ich kreuz und quer auf die Inhalte unterschiedlicher Blätter zugreife und auch neue erstelle. Es funktioniert auch alles, wie es soll.
Was aber macht es für einen Unterschied, ob ich einen Code in ein Modul oder in ein Tabellenblatt schreibe?
Ich habe jetzt im Netz gesucht, finde aber keine griffige Erklärung, wie sich die Zuordnung eines Moduls zu einem best. Objekt auf die Ausführung auswirkt.
VBA mit Excel - das umfassende Handbuch von Gallileo Press schweigt sich zu dem Thema komplett aus.
Peter Hasserodt versucht das Ganze witzig zu erklären, was total misslingt, weil
a) er scheinbar kein Händchen dafür hat komplexe Sachverhalte locker flockig und witzig zu beschreiben und
b) er somit wieder sehr schnell ins Fachchinesisch verfällt, welches mir die Buchstaben vor den Augen tanzen lässt.
Weiss jemand eine Quelle, mit deren Hilfe ich das Ganze vernünftig nachvollziehen kann?
Gruß,
Peter

Bild

Betrifft: AW: Allgem. Frage: Wo speicher ich den Code?
von: mumpel
Geschrieben am: 25.07.2015 23:04:49
Hallo!
Code, der sich auf eine Tabelle bezieht (Ereignismakros der Tabelle) schreibt man in das Klassenmodul der Tabelle. Man kann da zwar auch normale Makros ablegen. Das sollte man aber nur tun wenn die Makros nur in diesem Tabellenblatt genutzt werden sollen. Aber keine Ausnahme ohne Regel. Möchte man normale Makros, die im Codebereich der Tabelle stehen, projektweit nutzen muss man den Tabellennamen (VBA-Name) davorsetzen (z.B. Tabelle1.Makro1). Dann doch besser in einem allgemeinen Modul.
Code, der sich auf die Arbeitsmappe bezieht (Ereignismakros der Arbeitsmappe) schreibt man in das Klassenmodul "DieseArbeitsmappe".
Allgemeine Makros schreibt man in ein allgemeines Modul. Wobei man zwischen "Private Sub" und "Public Sub" unterscheidet. "Private Sub" ist für andere nicht sichtbar, "Public Sub" ist projektweit verfügbar. "Option Private Module" am Anfang eines Moduls versteckt die Prozeduren und Funktionen, sie sind dann nicht im Makrodialog und Formelassistenten sichtbar.
Dann gibt es noch die Klassenmodule, in den Klassenprogrammierungen abgelegt werden.
Gruß, René

Bild

Betrifft: AW: Allgem. Frage: Wo speicher ich den Code?
von: P-Quest :-)
Geschrieben am: 25.07.2015 23:56:36
Hallo Rene,
danke für die Erläuterungen.
Nur zur Wiederholung um sicher zu sein, dass ich alles verstanden habe:
Da ich mich mit meinem Makro als erstes auf eine Schaltfläche in der Tabelle beziehe und das Makro auch aus keiner anderen Tabelle heraus ausgerufen werden kann und soll, habe ich ja offensichtlich alles richtig gemacht, indem ich es in der Tabelle abgelegt habe.
Ein Makro, welches z.B. in einer beliebigen Tabelle Formate ändert oder Daten kopiert, muss aus allen Tabellen erreichbar sein und muss dementsprechend als Public Sub in ein allgem. Modul. Werden aus diesem Public Sub z.B. weitere Unterroutinen aufgerufen, die z.B. nur als Unterprogramme lauffähig sind und somit nicht aus anderen Tabellen oder Modulen erreichbar sein sollen, deklariere ich sie als Private Sub.
Aktionen, die die Arbeitsmappe betreffen, z.B. Ereignisse beim Öffnen oder Schliessen (denkbar wäre hier das autom. erstellen einer Sicherheitskopie der Datei) werden im Container "Diese Arbeitsmappe" abgelegt.
Soweit alles richtig?
Gruß,
Peter

Bild

Betrifft: AW: Allgem. Frage: Wo speicher ich den Code?
von: Daniel
Geschrieben am: 25.07.2015 23:58:27
Hi
bei kleineren Projekten ist es sicherlich egal, ob man jetzt den Code in ein allgemeines Modul schreibt oder ins Tabellenblattmodul.
Hierbei ist nur das unterschiedliche Verhalten bei der Verwendung der Zellbezüge Range, Cells, Columns und Rows zu beachten.
Lässt man hier das Tabellenblatt vor dem Zellbezug weg, so beziehen sie sich:
- auf das jeweils aktive Blatt, wenn der Code in einem allgemeinen Modul steht
- auf das ModulBlatt, wenn der Code in einem Tabellenblattmodul steht.
ausserdem muss man, wenn man mit Range einen Zellbezug auf ein anderes Blatt mit Hilfe von Cells erstellt, im Tabellenblattmodul das Tabellenblatt auch vor dem Range stehen, während es im allgemeinen Modul weg gelassen werden kann:
allgemeines Modul: Range(Sheets("tabelle1").Cells(1, 1), Sheets("Tabelle1").Cells(8, 8))
Tabellenblattmodul: Sheets("Tabelle1").Range(Sheets("tabelle1").Cells(1, 1), Sheets("Tabelle1").Cells(8, 8))
Gruss Daniel

Bild

Betrifft: AW: Allgem. Frage: Wo speicher ich den Code?
von: P-Quest :-)
Geschrieben am: 26.07.2015 00:26:33
Hallo Daniel,
wenn man den Verlauf meiner Fragestellungen hier im Forum verfolgt, wird ziemlich schnell ersichtlich, dass ich genau mit diesen Dingen ständig Probleme hatte (und sich er auch noch habe).
Danke für diese wertvollen Hinweise!
Gruß,
Peter

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Allgem. Frage: Wo speicher ich den Code?"