Anzeige
Archiv - Navigation
1916to1920
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Anlegen einer eigenen Klasse

Anlegen einer eigenen Klasse
27.01.2023 17:16:38
André
Hallo,
wie kann ich in Excel eine eigene Klasse mit Eigenschaften und Methoden erstellen?
In meinem Beispiel möchte ich eine Klasse "GNSS_Punkt" erstellen mit folgenden Eigenschaften:
- Punktnummer (Typ Long)
- East (Typ Double)
- North (Typ Double)
- Differenz (Typ Double)
Und wie kann ich dann eine Instanz der Klasse "GNSS_Punkt" erzeugen?
Freundliche Grüße,
André

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
zu faul zu recherchieren? owt
27.01.2023 17:28:07
ralf_b
AW: zu faul zu recherchieren? owt
27.01.2023 17:59:13
André
Nein, ich bin nicht zu faul, zu recherchieren. Ich habe nur gefunden, wie man eine Klasse anlegt, aber nicht, wie man eine Klasse mitsamt Eigenschaften anlegt.
Google - Screenshot! (sprachlos!)
27.01.2023 18:15:13
EtoPHG
Userbild
+1 für Ralf, aber...
27.01.2023 18:02:53
Yal
... ich stelle mich die Frage: wie erklärt man sowas am einfachste?
Basic:
_ in VB-Editor, Menü "Einfügen", "Klassenmodul"
_ in den Eigenschaft ("Ansicht", "Eigenschaftsfenster") der Name der Klasse ändern. In dem Fall bittet sich "clsPunkt".
_ in der Klassenmodul "clsPunkt":
Public PunktNummer As Long
Public East As Double
Public South As Double
Public Function Absand(ByRef Punkt As clsPunkt) As Double
    Abstand = sqrt((Me.East - Punkt.East) ^ 2 + (Me.South - Punkt.South) ^ 2)
End Function
Im normalen Modul:
Sub test()
Dim P1 As clsPunkt
Dim P2 As New clsPunkt
    Set P1 = New clsPunkt
    P1.South = 1
    P1.East = 2
    P2.South = 5
    P2.East = 3
    Debug.Print "Abstand P1-P2: " & P1.Abstand(P2)
    Debug.Print "Abstand P2-P1: " & P2.Abstand(P1) & " (ist eh gleich :-)"
End Sub
Wesentlich für die Instanzierung von Objekt (Objekt=Instanz einer Klasse, ung. so wie Variable = Instanz eines Typen) ist "New". Hier in den 2 Varianten.
In P1 und P2 werden nicht die Objekt selbst gespeichert, sondern die Adresse, wo diese Objekt im Speicher abgelegt sind. P1/P2 sind "Zeiger" auf das Objekt (engl. Pointer). Daher müssen diese "gesetzt" werden, engl. "Set". Eine Übergabe ist immer nur eine Übergabe der Adresse: Set P3 = P1.
Mit "Set P1 = Nothing" zeigt P1 auf nichts. Wenn der Objekt, worauf P1 davor zeigte, von keiner Variable mehr angezeigt ist, gilt es als entsorgt (der Speicher wird freigegeben). Es gibt keine Möglichkeit mehr, an diesem Objekt wieder zu kommen.
Nächste Stufe wäre die Verwendung von Property Get/Let. Insbesonders, wenn man eine Property Read-Only haben möchte. Aber da bitte googeln.
VG
Yal
Anzeige
AW: +1 für Ralf, aber...
27.01.2023 18:34:16
ralf_b
danke für die Note, aber du machst es den Faulpelzen immer leichter, durch deine Hilfen, ohne eigenes Zutun Lösungen zu bekommen. Und bei nächsten Mal werden sie noch dreister.
sagen wir, ...
27.01.2023 18:56:30
Yal
... ich hätte einen Herz für schwache Leute :-)
Ich bin nun jetzt gespannt, wie er sich positionieren wird. Er weiss, dass er etwas bekommen hat, woraus er etwas machen muss, bevor er die nächste Frage stellt.
Aber er hat was, womit er etwas machen kann.
+1 ist übrigens nicht 1+. Mit +1 adierre ich mich zu den Anzahl an Personen, die deine Meinung teilen (was für ein Glück hat man, Teenager im Haus zu haben =-)
VG
Yal
Anzeige
AW: sagen wir, ...
27.01.2023 19:10:58
ralf_b
Ohne Lerneffekt, bauen sich aber neue höhere Hürden auf.
Klassenprogrammieren ist keine Einsteigerübung. Ich schätze der Herr hat schon Vorkenntnisse, ist aber deutlich hilfeverwöhnt.
Mit Teenagern im Haus müßtest du dafür sensibilisiert sein. Ich bin zu alt für Teeny Sprache.
Grundsätzlich bin ich eher dazu geneigt den Frager aus der Reserve zu holen, als ihm die gebratenen Hühnchen vor die Nase zu halten.
Leider sehen das zu wenige Helferkollegen so.
AW: sagen wir, ...
27.01.2023 19:35:03
JoWE
Also ehrlich!!
Ich finde Du antwortest hier vorbildlich!!!
Manch einer macht Fragende zu oft schon in
der ersten Antwort "nieder" statt einfach einen
freundlichen und guten Ratschlag zu formulieren.
Und so manches Mal haben Antworten einen nahezu
beleidigenden aber zumindest sehr rauhen "Ton".
Schade, anders wär's schöner.
Und da gibt's zum Glück jetzt Dich.
Danke, bitte bleib' dabei.
LG
Jochen
Anzeige
Ich denke...
27.01.2023 20:19:26
Yal
... alle Meinungen sind erlaubt.
Aber in der Tat, wenn schon zwei deutlich gesagt haben, dass Sie die "Selbsthilfsbereitschaft" nicht ausreichend finden (da bin auch nicht der letzter, der das tadelt), dann muss ein Dritter ein Gegengewicht geben.
Zuckerbrot und Peitsche. Erst, wenn beide sich spuren lassen haben, kann der Betroffenen auswählen, was ihm lieber ist.
Und wie immer, eiserne Faust ja, aber in Samthandschuhe bitte.
VG
Yal
AW: Ich denke...
28.01.2023 10:31:50
André
Es ist nicht so, dass ich zu faul zum recherchieren war und voreilig ein Forum „ausnutze“, im Gegenteil: Ich hab zig Seiten und Videos angeschaut, hab das Prinzip verstanden, aber nicht, wie ich es konkret umsetze. Schon enttäuschend, dass einem bei der ersten Frage in so einem Forum gleich Unterstellungen gemacht werden, die in keinster Weise zutreffen. Aber vielleicht ist es für Excel-Profis einfach nicht verständlich, wenn Sachverhalte, die sie selbst einfach verstehen, von anderen nicht verstanden werden. Gibt es hier im Forum nicht auch eine Netiquette, die solche unverschämten Antworten, wie die erste hier, die auch polemisch ist und auf die Frage nicht eingeht, verbietet? Von einem Forum erwarte ich eigentlich Sachlichkeit statt Polemik. Aber gute Umgangsformen hat nicht jeder…
Anzeige
AW: Ich denke...
28.01.2023 11:21:39
Oberschlumpf
Hi André,
EtoPHG zeigt dir per Screenshot, mit welchem Suchtext du Ergebnisse für dich finden kannst.
Was fehlt, ist...deine Antwort an EtoPHG, ob und wie sein Tipp dir helfen konnte
Yal zeigt dir sogar mit Bsp-Code, wie so etwas grundsätzlich umgesetzt werden kann.
Was fehlt, ist...deine Antwort an Yal, ob und wie sein Tipp dir helfen konnte.
Was - nicht - fehlt...ist NUR (d)eine Antwort an die "bösen" Antworter, dir auch von dir Mitarbeit erwarten.
So, und was genau erwartest jetzt du?
Vielleicht doch genau - die eine - Antwort, die passgenau zu deiner Frage die Lösung bietet, die du nur per Copy + Paste einsetzen und nutzen könntest?
Was aber - dazu - mindestens fehlt....ist von dir eine Bsp-Datei, die du per Upload zur Verfügung stellen müsstest.
Aber wer weiß, vielleicht hast du ja schon deine Lösung - DAS tun nämlich auch viele Fragende: Einfach gar nicht mehr antworten, wenn ein Problem nich mehr vorhanden ist...
Ciao
Thorsten
Anzeige
AW: Ich denke...
28.01.2023 11:43:43
André
Du interpretierst da zu viel rein. Ich muss mich erstmal an die Benutzeroberfläche dieses Forums aufm Handy gewöhnen. Dass irgendwelche Antworter hier böse sind, hab ich nie geschrieben, lediglich, dass Antworten polemisch und unsachlich sind. Du benutzt somit ein Strohmann-Argument. Und den Screenshot hab ich noch gar nicht gesehen.
AW: Ich denke...
28.01.2023 13:16:10
Oberschlumpf
a) hast du die "" um das böse-Wort herum nicht gesehen?! Somit war "böse" von mir also nur ironisch gemeint, und ich hatte dich nicht zitiert, denn richtig, du selbst hattest böse nie geschrieben^^...aber meine Ironie hofftl jetzt verstanden
b) zum Beantworten meines Beitrags hat es ca 20 Minuten gedauert...für Antworten der anderen Teilnehmer musst du immer noch das Behandeln dieses Forums auf deinem Handy üben? - glaub ich irgdwie nich - bitte wer von uns argumentiert hier mit Stroh?^^
c) aber ok...du hast recht...ich hab....(such es dir aus)
Anzeige
AW: +1 für Ralf, aber...
28.01.2023 11:40:08
André
Vielen Dank, deine Antwort hat mir echt weitergeholfen.
Sorry, dass mein Dank erst etwas verspätet kam; ich schreib das alles aufm Handy und komm damit noch nicht so gut klar.
AW: +1 für Ralf, aber...
28.01.2023 12:25:19
JoWE
Hallo Yal, hallo André,
die Funktion in der neuen Klasse "clsPunkt" enthält zwei Schreibfehler,
also besser so:
Public Function Abstand(ByRef Punkt As clsPunkt) As Double
    Abstand = Sqr((Me.East - Punkt.East) ^ 2 + (Me.South - Punkt.South) ^ 2)
End Function
Gruß
Jochen
Ja, ...
28.01.2023 13:17:21
Yal
... so hat es den Compiler mir auch gesagt :-))
Leider nachdem ich gepostet hatte.
Schönes WE an alle
VG
Yal
Anzeige
AW: Anlegen einer eigenen Klasse
28.01.2023 13:18:37
Zwenn
Hallo André,
unabhängig von der restlichen Diskussion, hier ein Link, unter dem Du Dich in der Navigation links "von oben nach unten" durcharbeiten kannst. Ich verlinke direkt den Teil zu Objekten, dessen Navigation dann ausgeklappt ist. Da findest Du auch die von Yal bereits genannten erweiterten Mechanismen zur Verwaltung von Eigenschaften.
https://www.vba-tutorial.de/objekte/
Falls es Dir um echte Objektorientierte Programmierung geht, solltest Du diese nicht mit VBA (kennen)lernen. VBA bietet nur ein eingeschränktes OOP Modell. (Keine Vererbung, Keine Konstruktoren, ...)
Viele Grüße,
Zwenn
Anzeige
Beschränkte OOP in VBA
28.01.2023 13:39:14
Yal
Vollkommen richtig: VBA hat eine sehr eingeschränkte Anwendung von Objekte.
Aber ich sehe das wiederum fast als Vorteil für Anfänger: man muss sich nicht mit Vererbung, Polymorphie und co. beschäftigen.
Ärgerlich ist mMn der fehlende Konstruktor: man muss zuerst das Objekt instanzieren, dann die Basiseigenschaften einzeln übergeben. So muss man einige Eigenschaften als "write only once" aufwändig gestalten. Lästig.
Auch Vorteil von VBA: der Excel-Objektmodell zeigt vor, wie man Objekt verschachteln kann. Da muss man nur nachmachen.
Tipp: Auflistung-Objekte mit Dictionary anstatt Collection aufbauen ;-)
VG
Yal
Anzeige
AW: Beschränkte OOP in VBA
28.01.2023 15:35:54
Zwenn
Es kommt vielleicht darauf an, wie jemand etwas lernt. Meine Erfahrung ist, das 10 Fingersystem zum Schreiben auf einer Tastatur lerne ich in diesem Leben nicht mehr. Einfach, weil ich meine "Tastaturfähigkeiten" viele Jahre intuitiv entwickelt habe. Eine Erweiterung meiner (funktionierenden) Fähigkeiten würde nur mit sehr großem Aufwand klappen.
Auf das Programmieren übertragen sehe ich da meine Anfänge in der rein strukturierten Programmierung (Basic auf dem C64, später Turbo Pascal auf dem PC, später dann etwas C). Mich in die Objektorientierung einzufinden fiel mir sehr schwer (erster Kontakt in Java). Deshalb denke ich, einmal OOP von grundauf lernen wäre der bessere Weg. Jedenfalls, sofern man den Blick über den Tellerrand von VBA in Erwägung zieht.
AW: Beschränkte OOP in VBA
28.01.2023 16:09:18
Yal
Hallo Zwenn,
sehr valide argument.
Ich habe selber lange die Theorie gelernt, und versucht diese in C++ einzusetzen, bin aber zuerst mit meiner Mängel an Erfahrung an einer künstlichen Komplexität gescheitert, und habe zuerst das Thema OOP abgehakt (zugegeben waren vielleicht die Schulbeispiel dafür zu undurchgedacht).
Erst den Weg über VBA, weil es hier auf reale Fälle basierte, und auch weil ich mit VBA "Zuhause" war, habe ich mich mit Objekten wieder versöhnt. Und dann erst später das Fehlen von Vererbung vermisst.
Aber nochmal: Appetit auf Objekte kam bei mir hauptsächlich aufgrund der beispielhafte Strukturierung der Excel-Objektmodell. So wollte ich mein Code sauber haben. Ohne den Vorzeigeeffekt wäre ich sicher länger OOP ferngeblieben und das Pattern Design komplett ignoriert.
Aber das theoretisches OOP-Wissen könnte ruhig parallel angeschaut werden. Das kann man nur empfehlen.
VG
Yal
AW: Beschränkte OOP in VBA
28.01.2023 17:38:47
Anton
Hallo, ja, da hast du recht. Ichs arbeite viel mit Klassenprogrammierung und fehlende Konstruktoren haben mich immer genervt. Um es zu kompensieren, nutze ich sehr gerne „Fabrikmethoden“. Das ist eine ganz normale Funktione, die als Parameter alle Werte entgegennimmt, die ich für eine vollständige Initialisierung eines Objektes brauche. Innerhalb dieser Funktion wird dann das Objekt erzeugt und mit übergebenen Werten befüllt. Zum Schluss übergebe ich das fertige und befüllte Objekt als Rückgabereferenz an den Aufrufer zurück.
Viele Grüße
Anton
AW: Anlegen einer eigenen Klasse
28.01.2023 15:08:02
snb
Classmodule 'C_dist'
Mit Code
Function F_dist(south, east, N_south, N_east)
   F_dist = Sqr((east - N_east) ^ 2 + (south - N_south) ^ 2)
End Function
Im Makromodul (eines Arbeitsblattes, oder des Workbook, ein Algemeiner Makromodul oder ein Userform):
Sub M_snb()
   With New C_dis
      MsgBox .F_dist(1, 2, 13, 55)
   End With
End Sub

AW: Anlegen einer eigenen Klasse
28.01.2023 15:27:51
Zwenn
Hallo snb,
Deine Lösung funktioniert natürlich, wie man es von Dir gewohnt ist :-) Aber nur mit einer Methode ist ja keine Klasse notwendig. Objekte ohne Eigenschaften sind irgendwie sinnfrei (zumindest in VBA). Die Eigenschaften beschreiben ja den Zustand eines Objektes, der auch nach der "Verwendung" eines instanzierten Objektes in seinem aktuellen Zustand erhalten bleibt. Objekte Deiner Klasse bleiben aber alle identisch.
Viele Grüße,
Zwenn
AW: Anlegen einer eigenen Klasse
28.01.2023 17:44:54
snb
Ich wollte nur illustrieren dass die Verwendung einer Klasse hier, auf Grund der Fragestellung, wohl möglich, doch ziemlich troppo kompliziert ist.
Was ist in diesem Beispiel objektspezifisch?
28.01.2023 15:46:08
Yal
auch wenn Objekte viele Vorteil haben, eine einfache Function als Klassenfunktion zu definieren, ergibt wenig Mehrwert (außer eine Diskussion zu starten, wie Objekt sinnvoll anzuwenden sind :-)
Erst wenn die Eigenschaften in dem Objekt gespeichert werden, in dem Fall South, East und der Nummer des Punktes, macht es Sinn, einen Objekt überhaupt zu haben.
Andere gesagt: ein Objekt nur mit Eigenschaften (equiv. "Variablen") ist denkbar, aber ein Objekt nur mit Methoden (equiv. "Funktionen"), selten sinnvoll (es mag Ausnahme geben. Es fällt mir aber keine ein).
Methoden, um sich von Funktionen abzugrenzen, sollten sich hauptsächlich mit den Eigenschaften des Objekts befassen.
Aber nicht ausschließlich, wie in der Punkt-Beispiel: es muss an den Methode "Abstand" von Objekt P1 einen zweiten Objekt P2 übergeben werden, um die Distanz zwischen beiden zu rechnen.
Hier auch zur Sinnhaftigkeit von Objekte: P2 als Objekt der Methode "Abstand" übergeben, anstatt seine Eigenschaften South und East als einzelne Variablenwert.
VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige