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.