Forum: PC-Programmierung Excel VBA Konstruktor mit Parameterübergabe


von Tobias (Gast)


Lesenswert?

Hallo Kollegen,

Ich schlage mich gerade mit Excel-VBA programmieren rum um mir das Leben 
leichter zu machen. Ich verdiene meinen Lebensunterhalt mit 
objektorienter Programmierung in C++ und dies ist mein zweiter Tag an 
dem ich mich mit VBA-Basic in meinem Leben überhaupt rumschlage. 
Demzufolge tue ich mich mit den Einschränkungen die mir vor die Füße 
geworfen werden sehr schwer.

Gibt es in VBA für Klassen überhaupt richtige Konstruktoren ?
Kann ich in den Konstruktoren Parameter übergeben ?
Gibt es richtige Hash Maps, mein Code weiter unten funktioniert nämlich 
nicht ? ( Collection Datentyp)

folgendes habe ich gefunden:

Private Sub Class_Initialize()
    m_HashMap.Add "INIT", BLOCKTYPES.eInitBlock
    m_HashMap.Add "BLOCK", BLOCKTYPES.eComandBlock
End Sub

Private Sub Class_Deinitialize()
End Sub


Gewohnheitsgemäß versuche ich alles so umzusetzen wie ich es mit C++ 
kenne,
aber irgendwie bekomme ich alle 5 Minuten Gänsehaut was alles nicht 
funktioniert und wie umständlich alles in VBA gelöst ist.



Gruß Tobias

von der mechatroniker (Gast)


Lesenswert?

"richtige Konstruktoren" gibt es AFAIK in VBA nicht.

Wenn es dir zu umständlich ist, im Anwendercode jedesmal nach der 
Instantiierung noch ne Create-Methode o.ä. aufzurufen, kannst du es mal 
mit folgendem Pattern probieren:

In Klassenmodul MyClass:
1
Private Sub Class_Initialize()
2
   ' Hier irgendwelche sinnvollen Defaultwerte initialisieren
3
End Sub
4
5
Private Sub InitializeMe(ByVal MyParam As Long)
6
   ' Hier die "richtige" Initialisierung
7
End Sub
8
9
Public Static Function CreateInstance(ByVal MyParam As Long) As MyClass
10
   Dim oNewObj As New MyClass
11
   oNewObj.InitializeMe(MyParam)
12
   CreateInstance = oNewObj
13
End Sub

Instantiierung (oder heißt das jetzt Instanziierung?) erfolgt dann 
anstelle des New-Operators noch halbwegs elegant über
1
   Set MyObject = MyClass.CreateInstance(5)

von Tobias (Gast)


Lesenswert?

Vielen Dank für deine Antwort,

Ich habe mir schon gedacht, dass ich es irgendwie mit einer init-Methode 
lösen muss, aber ich konnte mir nicht vorstellen, dass eine 
Programmiersprache die Klassen unterstützt nicht soetwas wie einen 
Konstruktor mit Parameterübergabe hat.


Ich brauche aber weiter Unterstützung von euch :) Ich komme an folgendem 
Punkt nicht mehr weiter.

Ich habe eine Klasse die enthält folgende Methode und soll dynamisch 
eine Collection füllen.

Private Function ParseBlock(anfang As Integer, ende As Integer)
    Dim i As Integer
    For i = anfang + 1 To ende
        Dim v As New CCommand
        v.FillCommandEntrysFromLine i
        m_CommandCollection.Add v
    Next
    DebugPrintWholeBlock
End Function


Mein VBA-Script schmiert bei
       m_CommandCollection.Add v
komplett ab mit Laufzeitfehler 408

Wie kann ich sicher dynamisch Objekte erzeugen und einer Collection 
übergeben ?

Gruß Tobias


Meine CCommand-Klasse sieht so aus:

Private m_SID, m_LID, _
        m_CommandData, m_Description, _
        m_ExpectedResult, m_Check, m_InternalID As String
Private m_SID_Column, m_LID_Column, m_CommandData_Column, 
m_Description_Column, _
        m_ExpectedResult_Column As Integer
Private m_CPosition As New CPosition
Public Sub CCommand(sid As String, lid As String, _
                             Optional command As String = "", _
                             Optional description As String = "", _
                             Optional expectedResult As String = "", _
                             Optional id As Integer = 0)

    m_SID = sid
    m_LID = lid
    m_CommandData = command
    m_Description = description
    m_ExpectedResult = expectedResult
    m_InternalID = id
    m_SID_Column = m_CPosition.FindSpalteMitInhalt("SID", "Tabelle1", 1)
    m_LID_Column = m_CPosition.FindSpalteMitInhalt("LID", "Tabelle1", 1)
    m_CommandData_Column = m_CPosition.FindSpalteMitInhalt("CMD", 
"Tabelle1", 1)
    m_Description_Column = m_CPosition.FindSpalteMitInhalt("DSCR", 
"Tabelle1", 1)
    m_ExpectedResult_Column = m_CPosition.FindSpalteMitInhalt("E_RESP", 
"Tabelle1", 1)

End Sub

Private Sub Class_Initialize()
    m_CPosition = New CPosition
    m_SID_Column = m_CPosition.FindSpalteMitInhalt("SID", "Tabelle1", 1)
    m_LID_Column = m_CPosition.FindSpalteMitInhalt("LID", "Tabelle1", 1)
    m_CommandData_Column = m_CPosition.FindSpalteMitInhalt("CMD", 
"Tabelle1", 1)
    m_Description_Column = m_CPosition.FindSpalteMitInhalt("DSCR", 
"Tabelle1", 1)
    m_ExpectedResult_Column = m_CPosition.FindSpalteMitInhalt("E_RESP", 
"Tabelle1", 1)
End Sub

Private Sub Class_Terminate()
End Sub


Public Function FillCommandEntrysFromLine(line As Integer) As Boolean
    Sheets("Tabelle1").Activate
    If Cells(line, 1) = "END" Or Cells(line, 1) = "BLOCK" Then
        FillCommandEntrysFromLine = False
    Else
        m_SID = Cells(line, m_SID_Column)
        m_LID = Cells(line, m_LID_Column)
        m_CommandData = Cells(line, m_CommandData_Column)
        m_Description = Cells(line, m_Description_Column)
        m_ExpectedResult = Cells(line, m_ExpectedResult_Column)
    End If
End Function

Property Get DiagnosisCommand() As String
    DiagnosisCommand m_SID & m_LID & m_CommandData
End Property

Property Get InternalID() As Integer
    InternalID = m_InternalID
End Property

Property Let InternalID(id As Integer)
    m_InternalID = id
End Property

Public Function DebugPrintCommand()
    Debug.Print "SID : " & m_SID & "LID : " & m_LID & "CMD : " & 
m_CommandData & "DSCR : " & m_Description & "E_RESP : " & 
m_ExpectedResult & "Result : " & "CHECK" & m_Check
End Function

von VBA_Hasser (Gast)


Lesenswert?

funktioniert nicht! Ich habe den Eindruck, dass sich da etliche Fehler 
eingeschlichen haben. So endet z.B. die function mit "End Sub"..

von Ben (Gast)


Lesenswert?

Falls jemand von Euch wie ich auf diese Lösung hier stößt, die auch mir 
nicht weitergeholfen hat; schaut hier nach, hat bei mir wunderbar 
geklappt:

http://www.office-loesung.de/ftopic618585_0_0_asc.php

Viele Grüße

von c-hater (Gast)


Lesenswert?

Tobias schrieb:

> Ich schlage mich gerade mit Excel-VBA programmieren rum um mir das Leben
> leichter zu machen. Ich verdiene meinen Lebensunterhalt mit
> objektorienter Programmierung in C++ und dies ist mein zweiter Tag an
> dem ich mich mit VBA-Basic in meinem Leben überhaupt rumschlage.
> Demzufolge tue ich mich mit den Einschränkungen die mir vor die Füße
> geworfen werden sehr schwer.
>
> Gibt es in VBA für Klassen überhaupt richtige Konstruktoren ?

Nein. Es gibt in VBA selber nicht einmal wirkliche Klassen. Alles, was 
VBA kann, ist Instanzen von Klassen ZU VERWENDEN. Die kommen aber von 
"aussen" in Form von OLE-Objekten. In VBA selber hingegen hat man es nur 
mit einem Pseudo-OO-Design zu tun. Sieht an einigen Stellen fast so aus 
wie OO, das ist aber mehr oder weniger nur Sprachkosmetik.

> Gewohnheitsgemäß versuche ich alles so umzusetzen wie ich es mit C++
> kenne,

Das ist natürlich ein völlig IDIOTISCHER Ansatz. Normalerweise liest 
(oder zumindest überfliegt) man die Sprachdokumentation der Zielsprache, 
erkennt, was die Sprache kann und was sie ist und nutzt sie dann auch 
entsprechend. Oder wie hast du C++ gelernt? Kannst du überhaupt wirklich 
C++? Oder nur ein bissel rumfrickeln, um zusammengeklauten Code 
notdürftig zusammen zu leimen?

von Thomas S. (doschi_)


Lesenswert?

Die Frage selbst war aus dem jahr 2007 ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.