Aufruf einer Methode

Hallo!
Ich hab ein Problem mit einem Excel Makro VB Programm!
Also folgendes:

Das Programm sieht folgendermaßen aus:

Function H3LiveLog_newValue(aVal)
Dim sMsg
sMsg = „“
sMsg = "Value: " & aVal.From
Sheets(„Tabelle1“).Select
Columns(„A“).Select
Cells(1, 1).Value = sMsg
H3LiveLog_newValue = 1
End Function

Sub Test1()

IPAddr = „192.168.170.31“
Port = 5551
COMPort = 1

'H3LiveLog Objekt erzeugen:
Set H3LiveLog = CreateObject(„H3Tool.H3LiveLog“)
!!!
H3LiveLog.Start IPAddr, Port, COMPort

End Sub

Da wo die 3 Ausrufezeichen stehen, soll die Methode H3LiveLog_newValue aufgerufen werden. Als Methode von dem Object H3LiveLog.
Ich bin noch Anfänger in VB und bekomm es einfach nicht hin.
Man hat mir schon gesagt, dass es irgendwie über Event aufgerufen werden soll. Was bedeutet das?
Auch habe ich im Zusammenhang mit diesem Programm schon was von EventHandler und Callback gehört.

Kann vielleicht jemand etwas Licht ins Dunkle bringen ?
Bin echt am verzweifeln mit diesem Programm…

Viele Grüße, Kerstin

Hallo Kerstin,

Ich bin noch Anfänger in VB und bekomm es einfach nicht hin.
Man hat mir schon gesagt, dass es irgendwie über Event
aufgerufen werden soll. Was bedeutet das?

Also, VB hat da einen Object Orientierten Ansatz:

Für Dinge die immer wieder gebraucht werden bastelt man ein Object zusammen, wie z.B eine Schaltfläche.
So eine SChaltfläche hat nun mehrere Eigenschaften , wie z.B. Farbe, Grösse, Position auf deinem Formular. Viele dieser Eigenschaften kannst du durch dein Programm beeinflussen und manche nur wärend der Entwicklung der Software.
Dann hat so eine Schaltfläche noch Methoden , im Prinzip Soubrotinen, welche dann irgend etwas zusätzliches machen.
Und dann besteht jetzt noch das Problem, wie dein Programm informiert werden soll, wenn der Benutzer deine Schaltfläche anklickt. Dies wird mit den Events erledigt, im Prinzip ruft das Objekt eine bestimmte Routine in deinem Programm auf, wenn ein solches Ereignis auftritt, ohne, dass du das Objekt explizit abfragen musst.

Mit
„H3LiveLog = CreateObject(„H3Tool.H3LiveLog“)“
erzeugst du dein Objekt vom Typ „H3Tool“ und erzeugst einen Verweis auf dieses Objegt unter der Variablen „H3LiveLog“.
Der erste „Trick“ besteht nun darin, dass du soviele unterschiedliche Objekte erzeugen kannst wie dir lustig ist, solange du die Verweise in unterschiedlichen Variablen ablegst.
Wenn nun eines deiner Objekte einen Event erzeugt, ruft es die entsprechende Routine in deinem Programm auf.
Unter VB muss der Name der entsprechnden Routine folgendermassen aufgebaut sein

H3LiveLog_newValue()
Dabei muss „H3LiveLog“ exact mit dem Variablen-Namen übereinstimmen unter welchem du den verweis auf das Objekt abgelegt hast.
„newValue“ ist vom entsprechenden Objekt definiert worden und entspricht dem entsprechenden Event.

In VB geht das mehr oder weniger automatisch obwohl der Mechanismus dahinter recht kompliziert ist :wink:

Was aber noch fehlt ist der Hinweis an VB, dass es mit den Events überhaupt machen soll. Irgendwo müsste noch ein
WITHEVENTS
in deinem Programm stehen, damit VB diese Aufrufe von deinem Objekt überhaupt verarbeitet. Events welche keine zugehörigen Routinen in deinem Programm haben, werden von VB einfach ignoriert.

MfG Peter(TOO)

Hallo Peter!
Vielen Dank für deine Hilfe! Ich seh jetzt einiges klarer.

Hab jetzt versucht ein WITHEVENTS einzufügen.

Dim WithEvents H3LiveLog as H3Tool.H3LiveLog

Nun bekomme ich die Fehlermeldung: „nur in Objectmodul zulässig“, und dabei ist das Schlüsselwort WithEvents markiert!

Ich habe diese Zeile vor der Objectdeklarierung eingefügt.
Wieso mag er den Befehl denn nicht? So hab es im Internet öfters gesehen.

Viele Grüße, Kerstin

Du darfst das WithEvents nicht direkt in den Code des Arbeitsblattes, der Form, etc schreiben, sondern musst dazu ein Klassen-Modul verwenden. Dort definiert man i.d.R. das gesamte Objekt mit all seinen Eigenschaften, Methoden, etc.

Das hat den Vorteil, dass man das Klassenmodul exportieren kann und bei Bedarf immer wieder verwenden kann :smile:
-> Im Projektexplorer Rechtsklick-> Einfügen-> Klassenmodul

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like