mikrocontroller.net

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


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Private Sub Class_Initialize()
   ' Hier irgendwelche sinnvollen Defaultwerte initialisieren
End Sub

Private Sub InitializeMe(ByVal MyParam As Long)
   ' Hier die "richtige" Initialisierung
End Sub

Public Static Function CreateInstance(ByVal MyParam As Long) As MyClass
   Dim oNewObj As New MyClass
   oNewObj.InitializeMe(MyParam)
   CreateInstance = oNewObj
End Sub

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

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: VBA_Hasser (Gast)
Datum:

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

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Sch. (doschi_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage selbst war aus dem jahr 2007 ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.