Office: Code in (Klassen-) Modul auslagern

Helfe beim Thema Code in (Klassen-) Modul auslagern in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo liebe VBA Gurus, ich möchte mich jetzt mal an die nächste Stufe des programmierens ranwagen. Das Auslagern von Codeteilen. Bis jetzt schreibe... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Kentucky, 10. Juni 2014.

  1. Code in (Klassen-) Modul auslagern


    Hallo liebe VBA Gurus,

    ich möchte mich jetzt mal an die nächste Stufe des programmierens ranwagen. Das Auslagern von Codeteilen. Bis jetzt schreibe ich alles in eine Userform rein, aber die wird immer länger und unübersichtlicher.

    Ich habe hier Online - Excel Programmierung VBA Makro: Klassen [1] - Einstieg ein Tutorial zu dem Thema gefunden, aber ich schaffe es leider nicht das umzusetzen. (Hier wird dem Klassenmodul etwas übergeben und ich will ja nur den Code abrufen)

    In meinem Code habe ich einen Block der sich mit Listboxen befasst. Diesen Block würde ich gerne in ein Modul (oder Klassenmodul) auslagern und in die Userform dann nur einen Funktionsaufruf machen.



    Meine Fragen:

    Für das ganze nehm ich doch ein Klassenmodul, weil ich nur eine Userform habe, oder? Hätte ich mehrere UF die auf den Code zugreifen bräuchte ich ein Modul. Ist das soweit richtig?

    Eröffne ich den Code im (Klassen-) Modul mit "Public Sub" oder muss ich das mit "Public Property Let" machen?

    Ruf ich den Code in der Userform dem Namen der Sub bzw Property auf oder muss ich das "Call" davor stellen? (Oder allgemein gefragt: wie ruf ich das Modul richtig auf?)


    Vllt. hat mir auch jmd. ein kleines Bsp.-Programm wo ein Codeteil ausgelagert ist. Z.B. eine Userfrom mit einer Listbox oder irgendwas anderes, ganz egal. Halt möglichst einfach.



    So, schonmal vielen Dank fürs durchlesen und hoffentlich kann mir jemand weiter helfen.



    Beste Grüße

    Kentucky

    :)
     
    Kentucky, 10. Juni 2014
    #1
  2. Hajo_Zi
    Hajo_Zi Erfahrener User
    Klassen benutzt man für gleichartige Steuerelemente. Dein Problem ist nur ein Makro, das beim Steuerelement einen Bezug zur UserForm haben muss. Warum auslagern muss uns nicht klar sein.
     
    Hajo_Zi, 11. Juni 2014
    #2
  3. Beverly
    Beverly Erfahrener User
    Hi,

    lagere dein Makro ganz normal in ein allgemeines Modul aus und definiere Variablen, die du aus dem userForm an das Makro übergibst, dort als Public.


    Code in (Klassen-) Modul auslagern grusz.gif
     
    Beverly, 11. Juni 2014
    #3
  4. Code in (Klassen-) Modul auslagern

    Hallo,

    danke für die schnellen Antworten.


    @Hajo: Ich versteh leider nicht ganz was du mir sagen willst. Kannst du mir dazu ein Bsp. nennen oder es einfacher ausdrücken?
    Ein Kumpel (der Programmierer ist) hat mir gesagt, dass man seine Programme immer verschachteln sollte damit man eine bessere Übersicht hat und schneller bestimmte Parameter ändern kann. Klar funktioniert mein Programm auch ohne Verschachtelung, aber ich möchte mich gerne daran versuchen.

    @Beverly
    Code:
    So sieht mein Modul aus. In die Userform schreib ich einfach
    Code:
    damit er das Modul ausführt, oder?
    Dann bringt er mir aber als Fehler das die with-Block-Variable nicht festgelegt ist.
    Aber ich habe sie doch als Objekt deklariert.

    Nochmals vielen Dank und ich würde mich über weiter Antworten sehr freuen.


    Beste Grüße

    Kentucky
     
    Kentucky, 11. Juni 2014
    #4
  5. Hajo_Zi
    Hajo_Zi Erfahrener User
  6. Beverly
    Beverly Erfahrener User
    Hi,

    der Aufruf aus dem UserFrim ist korrekt, das Makro im Modul

    Code:
    Code in (Klassen-) Modul auslagern grusz.gif
     
    Beverly, 11. Juni 2014
    #6
  7. Hi Kentucky,

    ok, Dein kompletter Code im Modul der Form wird zu unübersichtlich und Du willst ihn deshalb strukturieren. Das ist soweit ganz vernünftig. Objektereignisse der Form müssen dennoch im Formmodul verbleiben. Aber alles, was nicht direkt mit dem Formular zusammenhängt (z. Bsp. Funktionen die Berechnungen durchführen) könnte man in ein separates Modul auslagern. Andere Funktionen, die bestimmte Aktionen, wie z. Bsp. Aktionen in Tabellenblättern ausführen, wieder in ein anderes Modul.
    Dazu benötigst Du keine Klassenmodule.
    Aber... wozu braucht man dann Klassenmodule überhaupt?
    Grundsätzlich ist eine Klasse ja nichts anderes als eine technische Zeichnung von Objekten (die es noch nicht gibt) aber nach deren Bauplan sie erstellt werden sollen.
    Bei Dir wäre eine Listboxklasse denkbar (aber nicht zwingend notwendig, dazu kenne ich Dein Projekt zu wenig).
    Im Grunde genommen arbeitest Du ja schon damit. Immer dann, wenn Du eine Listbox auf dem Formular erstellst. Die Listboxklasse, die Du da unbewusst verwendest, stellt Dir bereits eine Menge an Eigenschaften (Höhe, Breite...) und Methoden (Click, MouseMove,....) bereit. Solange die Anzahl Deiner Listboxen überschaubar bleibt, ist es auch nicht nötig da extra noch eine Listboxklasse zu erstellen. Die Sache würde erst dann richtig interessant, wenn Du z. Bsp. vorher nicht weißt, wieviele Listboxen (TextBoxen, Buttons...) Du brauchst und sie deshalb dynamisch erstellen musst. Weil Du aber trotzdem auf bestimmte Ereignisse dieser Objekte reagieren willst, musst Du dann auf die Klasse zurückgreifen.
    Ich hab Dir mal im Anhang eine Datei mit einer Textboxklasse beigefügt, die das Prinzip verdeutlichen soll.
    Dennoch, ich denke nicht, dass das in Deinem Fall notwendig sein wird. Hier reicht die Aussonderung funktional gleichartiger Funktionen in entsprechende Module. Das hätte überdies den Vorteil, dass Du sie auch in anderen Projekten immer wieder verwenden kannst.
     
  8. Code in (Klassen-) Modul auslagern

    Vielen Dank RJ für deine Erklärung. Ich hab sie schon dreimal gelesen und werd sie bestimmt noch dreimal lesen *wink.gif* , aber so kann ich wirklich was mit anfangen.
    Deine Datei ist sehr hilfreich, auch wenn ich nicht unbedingt jede Zeile Code verstehe, aber das Prinzip ist zu erkennen.

    Auch dank Beverlys Code versteh ich jetzt deutlich besser wie die Kommunikation zwischen Userform und Modul abläuft.


    Vielen, vielen Dank an alle Helfer.



    Beste Grüße

    Kentucky
     
    Kentucky, 12. Juni 2014
    #8
  9. Hallo,

    einfach gesagt, eine Klasse für ein einzelnes Control macht keinen Sinn außer den Code zusätzlich aufzublähen. Dem Modul des Userforms ist es vollkommen egal wie viele tausend Zeilen Code es beinhaltet, und ob die ganze Konstruktion pflegeleichter wird wenn du dauernd zwischen verschiedenen Modulen hin- und her-switchen musst kann ich nicht wirklich glauben. Ich arbeite viel mit Klassen, aber nicht für eine einzelne Variable oder ein einzelnes Objekt.
     
    Nepumuk, 12. Juni 2014
    #9
  10. Hmm... ok.
    Also mein Kumpel hat mir in VB ein Programm gezeigt wo er alles verschachtelt hat.

    So nach dem Schema:
    code
    code
    Listbox
    code
    code
    code

    Und der Befehl Listbox verweißt dann auf ein Modul in dem dann alles was mit Listbox zu tun hat drin steht. Also was rein geladen wird, Style, etc. Er hat da immer von Funktionen gesprochen. Muss ich an Fuktionen immer was übergeben oder kann ich das auch (so wie ich das gern hätte) nur zum Code auslagern verwenden?

    In VB waren das immer neue Fenster, d.h. ich geh davon aus, dass es sich um Module handelt.

    Allerdings könnte ich doch, weil es mir ja hauptsächlich um die Übersichtlichkeit geht, meine Code-Fragmente innerhalb der Userform auslagern. Also das ich die Fragmente in dem Userform-Fenster einfach unten als eigenen Sub anhängen.

    Was meint ihr dazu? Ist das ein Schritt in Richtung "gutes Programmieren" oder macht man das eher nicht so? Oder ist es besser / sinnvoller das über Module zu lösen?
    Anderst gefragt: Was macht ihr um eine lange Userform übersichtlicher zu machen?


    Freu mich über jeden Beitrag und vielen Dank an alle die mir bisher geholfen haben.


    Beste Grüße

    Kentucky
     
    Kentucky, 12. Juni 2014
    #10
  11. Hi Kentucky,

    was ist (in VB und VBA) der Unterschied zwischen Funktion und Prozedur, außer der Deklaration mit Sub und Function?
    Im Prinzip ist eine Funktion auch nichts anderes als eine Prozedur, jedoch mit dem Unterschied, dass sie irgendwas zurückliefert. Das Ergebnis einer Berechnung, einen Text, ein Array... was immer Du brauchst. Deshalb steht ja am Ende des Funktionskopfes auch immer der Rückgabetyp der Funktion.
    Code:
    Da die Parameterliste optional ist, muss also nicht zwingend etwas an die Funktion übergeben werden. Es sei denn, es stehen im Funktionskopf ein oder mehrere Parameter. Die müssen dann in exakt der Reihenfolge und dem Datentyp übergeben werden, wie sie im Funktionskopf angegeben wurden. Das gleiche gilt übrigens auch für 'normale' Prozeduren. Auch da können Parameterlisten enthalten sein. Nur, wie gesagt, Funktionen benötigen einen Typ für die Rückgabe und geben (in der Regel) auch einen Wert zurück.
    Bsp.:
    Prozedur, die Funktionen mit unterschiedlichen Rückgabewerten und Parameterlisten und eine Prozedur aufruft:
    Code:
    Wann verwendet man am besten separate Funktionen oder Prozeduren?
    Immer dann, wenn eine eigenständige Funktionalität vorliegt.
    Was soll das heißen?
    Stell Dir vor, Du schreibst ein Programm "Mein Tag".
    Jetzt könntest Du alles in einem Satz, ohne Punkt und Komma beschreiben. Liest sich blöd, oder? Also bildest Du Abschnitte (Module: Vormittag, Nachmittag, Abend....), und/oder Prozeduren (aufstehen, waschen, essen...), wobei essen wieder unterteilt werden kann in frühstück, mittag, Abendessen und bei der Essenszubereitung (mit Übergabe der Parameter der Zutaten) immer wieder die gleiche Funktion (Berechne meine Kalorien) anfällt, die Du deshalb wieder in eine separate Funktion auslagern solltest.

    Kurz: Alles was als eigenständig betrachtet werden kann und öfter gebraucht wird, separat behandeln... was zusammengehört, zusammenhalten...
     
  12. Hallo RJ

    der Beitrag ist wirklich Gold wert!
    Super! Vielen, vielen Dank.


    Als was wird dann das Ergebnis bei Subtrakt übergeben wenn kein Parametertyp angegeben wird? Integer weil beide Übergabewerte integer sind oder als Variant?

    Ich hätte noch eine Kleinigkeit zu einem anderen Thema. Es ist aber so banal das sich ein eigenes Thema nicht lohnt.
    In der angehängten Excel-Datei hab ich versucht die ActiveCell auf Inhalt zu überprüfen. Aber es klappt nicht. Würde mich freuen wenn da jmd. kurz drauf schauen könnte.



    Besten Dank für die tolle Hilfe.



    Gruß Kentucky
     
    Kentucky, 12. Juni 2014
    #12
  13. Code in (Klassen-) Modul auslagern

    Hi,

    Was hat das mit Activecell zu tun?
     
    chris-kaiser, 12. Juni 2014
    #13
  14. Hallo chris-kaiser,

    danke für die schnelle Antwort. Na in meinem Versuch hab ich doch mit ActiveCell rumgewurschtelt.
    Ich glaub ich mach doch ein neues Thema auf, weil doch ein oder zwei Dinge dazu erklärern muss. Außerdem können dann auch andere die so ein Problem haben es leichter recherchieren.

    Nochmals danke und vllt. magst mir in dem kommenden Thema auch noch ein bisschen helfen *Smilie


    Beste Grüße


    Kentucky
     
    Kentucky, 12. Juni 2014
    #14
  15. ...an Substrakt wird kein Ergebnis übergeben. Substrakt ist eine Prozedur OHNE Rückgabe. Hier wird das Ergebnis direkt in der Prozedur gebildet und ausgewertet. An Substrakt werden lediglich 2 Parameterwerte übergeben. Schau Dir mal die unterschiedlichen Aufrufe von Prozeduren und Funktionen an. Bei Funktionen weist Du einer Variablen den Rückgabewert der Funktion zu:
    Bsp.: Der Variable 'Ergebnis' den Rückgabewert der Funktion Addieren zuweisen:
    Code:
    Aber... bei Prozeduraufruf benötigst Du keine Variable, der ein Wert zugewiesen werden soll. Prozeduraufruf:
    Code:
    Erkennst Du den Unterschied?

    Bei Verwendung der Funktion kannst Du das einmal gebildete Ergebnis im Gültigkeitsbereich (hier in der aufrufenden Prozedur) immer wieder verwenden,
    Bsp.:
    Code:
    ...während Du, wenn Du mit Prozeduren arbeitest, diese jedesmal neu aufrufen müßtest, wenn Du das darin ermittelte Ergebnis bräuchtest...
     
Thema:

Code in (Klassen-) Modul auslagern

Die Seite wird geladen...
  1. Code in (Klassen-) Modul auslagern - Similar Threads - Code Klassen Modul

  2. Per Hyperlink ausgeblendetes Blatt einblenden

    in Microsoft Excel Hilfe
    Per Hyperlink ausgeblendetes Blatt einblenden: Hola ins Forum, ich bräuchte mal wieder eure Hilfe. Ich habe ein Tabellenblatt das mir als Register dient und wo Hyperlinks eingefügt sind um auf das dazugehörige Blatt zu springen. Diese Blätter...
  3. Code wird nicht komplett ausgeführt

    in Microsoft Excel Hilfe
    Code wird nicht komplett ausgeführt: Guten Morgen in die Runde! Situation: Dieser Code wird nicht komplett ausgeführt. es wird der Teil mit der Du Until Schleife übersprungen. Wenn ich aber mit Einzelschritte durch den Code gehe...
  4. Rabat Codes in einen Serienbrief einfügen

    in Microsoft Word Hilfe
    Rabat Codes in einen Serienbrief einfügen: Hi, Ich möchte bei einem Brief für meine Kunden eine Rabatcode einfügen. Diese sind zufällig erstellt und in Excel als Tabelle gespeichert. Wie bekomme ich diese nun so eingefügt das auf jedem...
  5. Combobox einbinden

    in Microsoft Excel Hilfe
    Combobox einbinden: Hallo, ich bastele an einer Funktion, bei der ich an einer Stelle im Programm eine Combobox aufrufen möchte, die dann mit bestimmten Werten aus einer Tabelle gefüllt ist und dann den gewählten...
  6. VBA Code für Zeilen ausblenden einblenden mit JA/Nein

    in Microsoft Excel Hilfe
    VBA Code für Zeilen ausblenden einblenden mit JA/Nein: Hallo, habe eine Exceltabelle, bei der ich bei einer Zelle eine Ja/Nein abfrage mache, wenn in der Zelle Nein steht, dann soll ein bestimmter Zeilenbereich, den ich definieren möchte, ausgeblendet...
  7. VBA Code ohne ergebnis

    in Microsoft Excel Hilfe
    VBA Code ohne ergebnis: Hallo, ich habe einen VBA Code der in meiner Tabelle nicht funktioniert. Kann mir vielleicht jemand bei der Korrektur ggf. weiter helfen? Danke und Gruß Private Sub Worksheet_Change(ByVal Target...
  8. Bild löschen auch wenn es nicht vorhanden ist?! Code funktioniert nicht mehr..

    in Microsoft Excel Hilfe
    Bild löschen auch wenn es nicht vorhanden ist?! Code funktioniert nicht mehr..: Hallo Leute, Habe ein Macro in Benutzung das jetzt über Monate gut funktioniert hat und jetzt kam anscheint ein update und es funktioniert nicht mehr, wobei ich es mir nicht erklären kann, weil...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden