Microsoft Office Forum [ www.Office-Fragen.de ] >> READONLY <<
Microsoft Office 2003-2019 => Excel => Thema gestartet von: FlorianF am Februar 23, 2017, 20:33:37 Nachmittag
-
Hi Leute,
mich interessiert mal eure Meinung zu den nachfolgende beschrieben Sachverhalt und den Lösungswegen.
Ich habe eine Excel-Datei welche Projektdaten speichert. Zu den Daten zählen:
- Projektname
- Gesamteinzahlung
- Gesamtauszahlungen
- Teil-Einzahlung mit Angabe
- Teilauszahlungen mit gleichen Angaben wie Teil-Einzahlungen
Die Erfassung der Daten erfolgt über ein Userform und wird dann für jedes Projekt zeilenweise in eine Tabelle geschrieben. Nun gibt es ja verschiedene Möglichkeiten diese Daten in die Tabelle zu schreiben:
- Zwischenspeichern in einem Array und diese dann mit einer Schleife zum Speichen in der Tabelle durchlaufen
- Speichern in einem eigene datentyp und dann jedes Feld einzeln speichert
- Eigene Klasse für das Projekt welche die Daten eine Projekts entgegen nimmt
Bei den ersten zwei Alternativen könnte man die Schritte auch noch in eigene Prozeduren auslagern um es etwas schlanker zu gestalten.
Wie würdet ihr es denn lösen? Ich weiss, dass es aufgrund der wenigen Daten wohl keine großen Unterschiede in Sachen Performance macht aber doch sicher in der Einfachheit der Erweiterung des Programms mit Feldern, anderen Funktionen usw.
Ich muss dazu sagen, dass ich noch ziemlicher Anfänger bin, daher vielleicht die recht umfangreiche Fragestellung. Aber ich finde, dass ich an diesem Beispiel ganz gut die unterschiedlichen Vor- und Nachteile dieser Arten verstehen kann. Insbesondere habe ich noch nicht ganz kapiert warum man eine Klasse anlegen sollte und nicht einfach nur separate Prozeduren und Funktionen.
Ich hoffe ihr versteht alles, wenn nicht einfach nachfragen. Danke euch!!
Beste Grüße
Flo
-
Hallo,
ja nachdem, wie Deine Userform aufgebaut ist, z.B. falls diese ermöglicht, alle Datensätze zu bearbeiten,
also nicht nur eine Zeile, bietet sich als performateste Methode an...
- Daten als Array einlesen
- Daten ggf. modifizieren
- Daten als Array zurückschreiben
Klassen bieten sich beispielsweise an...
- Du hast eine ganze Menge an Steuerelementen, z.B. Textboxes oder Checkboxes, deren Ereignisse Du
nicht alle einzeln anlegen/schreiben möchtest, sondern über das Ereignis eine Klasse abfangen möchtest. - Du brauchst z.B. Hilfsobjekte, die Dir ermöglichen Deinen Code besser zu organisieren, z.B. eine Klasse,
die Arrays implementiert, aber mit Zusatzfunktionen wie Sortieren, Elemente löschen/hinzufügen. - Man kann z.B. eine Klasse anlegen, die die Konfiguration einer Anwendung bereitstellt und sich um das
Einlesen/Setzen/Abrufen usw. von Deinen Anwendungseinstellungen kümmert. - Anderes Beispiel ist eine Klasse, die eine Verbindung zu einer Datenbank herstellt und alle dortigen
Operationen ausführt.
Die Beispiele hier oben (bis auf das erste mit den Steuerelementen) lassen sich aber auch als Module anlegen,
ohne Klassen zu verwenden. Das ist eine Designfrage.
Da Du sagst, Du bist Anfänger, und wenn Du Spass an der Sache hast, wäre ein Vorschlag, wie folgt
vorzugehen...
- Alles, was nicht die Userform betrifft, in ein Modul auslagern und in der Userform über Funktionen aufrufen, z.B.
GetProjectName(ProjectID), SetProjectName(ProjectID, Data) usw. - Die Funktionen im Modul in weitere kleinere Teile zerlegen, unter anderem auch weitere Module mit noch mehr in
sich logische kleineren Einheiten. Z.B. ein Modul für die Projekte als Ganzes, ein Modul für Zahlungen, usw. Spätestens
dann wirst Du merken, dass Du Beziehungen zwischen den Modulen herstellen musst (Variablen, Prozeduren, ...). - Dann wärst Du von den Klassen nicht mehr ganz weit weg und kannst versuchen, das Modell in Klassen abzubilden.
Gruß
-
Hi,
erstmal danke für die ausführliche Antwort.
Meine Form speichert immer nur einen einzelnen Datensatz. Ich habe es bis jetzt auch als Array gelöst um zunächst alle Felder einzeln in das Array zu lesen und dann über eine For-Next Schleife in die Tabelle zu schreiben. Das schien mir der effizienteste Programmier-Weg.
Dein Vorschlag habe ich in meinen Programm (es kann mehr als nur ein paar Projektdaten in eine Tabelle schreiben :D) schon an einigen anderen Stellen so umgesetzt. Ich habe oft gemerkt, dass ich Dinge doppelt programmiere, lediglich mit anderen Parametern oder, dass der Code in eine Prozedur zu lang wird. Dann habe ich mir separate Prozeduren und Functions gebaut um es auszulagern. Ich denke da sieht mein Programm schon recht professionell aus, wobei es sicher auch noch an einigen Stellen besser geht. Aber das werde ich mit zunehmender Erfahrung bestimmt auch noch merken.
Was für mich vielleicht den "Klick" herbeiführt um das mit den Klassen richtig zu verstehen. Was wäre den ein oder mehrere Features die meine Form können müsste, damit es sinnvoll wäre über eine Klasse zu gehen? Oder ist es eher schon eine Glaubensfrage ob mit normalen Subs/Functions oder über eine Klasse?
Beste Grüße
Flo
-
Hallo,
Angenommen, Du würdest in Deiner Userform die Steuerelemente per Code anlegen, also zur Laufzeit. Dann kämst Du um
Klassen nicht herum, um auf die Ereignisse (Click, Change, ...) zu reagieren.
Angenommen, Du hättest ganz viele Steuerelemente, jetzt wie aktuell statisch per Designer angelegt, so um, sagen wir mal
25 Checkboxen, und Du hättest keine Lust, für jede Checkbox die Ereignisprozedur anzulegen oder würdest das gerne zen-
tralisiert machen. Dann wäre ebenfalls eine Klasse sinnvoll. Für wenige Steuerelemente desselben Typs lohnt sich das nicht.
Ansonsten, schau' mal bei online-excel.de rein, die haben Beispiele.
Gruß