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
"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) |
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
funktioniert nicht! Ich habe den Eindruck, dass sich da etliche Fehler eingeschlichen haben. So endet z.B. die function mit "End Sub"..
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.