Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Elemente einer Klasse über Variablen aufrufen

Forumthread: Elemente einer Klasse über Variablen aufrufen

Elemente einer Klasse über Variablen aufrufen
15.05.2005 12:55:23
Joe
Moin Excel-Profis,
ich habe ein VBA-Problem, und zwar möchte ich Elemente einer Klasse über eine Variable aufrufen. Unten ein kleines Listing. Das Listing stellt nur ein kleinen Ausschnitt dar ist so nicht „sinnvoll“.
Wie kann ich die Strings aus dem Array Tiere() als Bezeichner für die Klasse1 einsetzen? Gibt es einen Befehl, der einen String in einen Befehl/Bezeichner umwandelt? Ich suche etwas Analoges zu FORMULA. Wahrscheinlich ist es ganz einfach, nur habe ich Tomaten auf den Augen…
Vielen Dank im Voraus für Eure Hilfe!
Joe
Klasse 1
Option Explicit
Public Hund as Integer
Public Katze as Integer
Public Maus as Integer
Public…
Sub Ausgabe()
DIM Tiere(20), i
DIM cTier as Klasse1
’ Einlesen
Set cTier As New Klasse1
cTier.Hund = „Dackel“
cTier.Katze = „Tieger“
cTier.Maus = …
Tiere(1)= „Hund“
Tiere(2)= „Katze“
Tiere(3)= „Maus“
Tiere(4) = ...
’Ausgabe, die funktioniert
Cells(1,1) = cTier.Hund
Cells(1,2) = cTier.Katze
Cells(1,3) = cTier.Maus
…
’ Ausgabe, die nicht funktioniert
For i = 1 To 20
cells(1,i) = cTier.&Tiere(i)
Next i
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Elemente einer Klasse über Variablen aufrufen
15.05.2005 14:07:20
Nepumuk
Hi,
das geht doch viel einfacher über eine Collection.
Code in einem Standartmodul:


Option Explicit
Private objTiere As clsTiere
Public Sub test()
    Dim varItem As Variant
    Dim intIndex As Integer
    Set objTiere = New clsTiere
    With objTiere.Tiere
        .Add "Dackel", "Hund"
        .Add "Siamkatze", "Katze"
        .Add "Maus", "Nagetier"
        .Add "Amsel", "Vogel"
    End With
    MsgBox objTiere.Tiere("Hund")
    MsgBox objTiere.Tiere("Vogel")
    For Each varItem In objTiere.Tiere
        MsgBox varItem
    Next
    For intIndex = 1 To objTiere.Tiere.Count
        MsgBox objTiere.Tiere(intIndex)
    Next
    Set objTiere = Nothing
End Sub


Code in ein Klassenmodul mit dem Namen "clsTiere":


Option Explicit
Private mcolTiere As Collection
Public Property Get Tiere() As Collection
    Set Tiere = mcolTiere
End Property
Private Sub Class_Initialize()
    Set mcolTiere = New Collection
End Sub
Private Sub Class_Terminate()
    Set mcolTiere = Nothing
End Sub


Wie du siehst, lässt sich die Collection 1. über den Key auslesen, 2. mit einer For - Each Schleife und 3. unter Zuhilfenahme der Count - Eigenschaft auch in einer For - Next Schleife. Wobei die For - Each Schleife zu bevorzugen ist, das darin die Collection auf einmal übergeben wird, während die For - Next Schleife jedes Item einzeln aus der Collection holt.
Gruß
Nepumuk
Anzeige
Ergänzung
15.05.2005 14:17:35
Nepumuk
Mit folgender Konstruktion geht es auch per For - Next vernünftig:


    With objTiere.Tiere
        For intIndex = 1 To .Count
            MsgBox .Item(intIndex)
        Next
    End With


Gruß
Nepumuk
Anzeige
AW: Ergänzung
15.05.2005 14:40:29
Joe
Hallo Nepumuk,
vielen Dank, so geht es natürlich auch, sieht auch viel eleganter aus ;-)
Aber trotzdem: Kennst Du einen Befehl, mit dem ich ein String als Befehl ausgeben kann?
Danke und Gruß,
Joe
AW: Ergänzung
15.05.2005 14:59:43
Nepumuk
Hi,
da dein Array Tiere nicht Teil der Klasse ist, würde ich sagen so:
For i = 1 To 20
cells(1,i) = Tiere(i)
Next i
Gruß
Nepumuk
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Elemente einer Klasse über Variablen aufrufen in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Erstelle eine Klasse:

    • Gehe zu Einfügen > Klasse und nenne sie Klasse1.
    • Definiere die Variablen in der Klasse:
    Option Explicit
    Public Hund As Integer
    Public Katze As Integer
    Public Maus As Integer
  2. Erstelle ein Standardmodul:

    • Füge ein neues Modul hinzu und definiere die Subroutine:
    Sub Ausgabe()
        Dim Tiere(20) As String
        Dim cTier As Klasse1
        Set cTier = New Klasse1
    
        ' Einlesen
        cTier.Hund = "Dackel"
        cTier.Katze = "Tiger"
        cTier.Maus = "Maus"
    
        Tiere(1) = "Hund"
        Tiere(2) = "Katze"
        Tiere(3) = "Maus"
    
        ' Ausgabe, die funktioniert
        Cells(1, 1) = cTier.Hund
        Cells(1, 2) = cTier.Katze
        Cells(1, 3) = cTier.Maus
    
        ' Ausgabe, die nicht funktioniert
        Dim i As Integer
        For i = 1 To 20
            Cells(1, i) = cTier.Tiere(i) ' Hier wird der Fehler auftreten
        Next i
    End Sub
  3. Verwende eine Collection:

    • Füge eine Collection in einem Klassenmodul hinzu, um die Tiere dynamisch zu verwalten:
    Option Explicit
    Private mcolTiere As Collection
    
    Public Property Get Tiere() As Collection
        Set Tiere = mcolTiere
    End Property
    
    Private Sub Class_Initialize()
        Set mcolTiere = New Collection
    End Sub
    
    Private Sub Class_Terminate()
        Set mcolTiere = Nothing
    End Sub
  4. Füge Tiere in die Collection ein:

    • Verwende den folgenden Code, um Tiere hinzuzufügen:
    With objTiere.Tiere
        .Add "Dackel", "Hund"
        .Add "Siamkatze", "Katze"
        .Add "Maus", "Nagetier"
        .Add "Amsel", "Vogel"
    End With

Häufige Fehler und Lösungen

Fehler 1: Typ Mismatch beim Zugriff auf die Collection.
Lösung: Stelle sicher, dass der Typ der Variablen korrekt deklariert ist.

Fehler 2: Index außerhalb des Bereichs beim Zugriff auf das Array.
Lösung: Überprüfe die Indizes und stelle sicher, dass du nur auf die vorhandenen Elemente zugreifst.


Alternative Methoden

Eine alternative Methode zur Verwaltung von Tieren ist die Verwendung von Dictionaries anstelle von Collections. Dies kann dir mehr Flexibilität bei der Schlüsselverwaltung bieten. Hier ist ein Beispiel:

Dim dictTiere As Object
Set dictTiere = CreateObject("Scripting.Dictionary")
dictTiere.Add "Hund", "Dackel"
dictTiere.Add "Katze", "Siamkatze"

Praktische Beispiele

Ein praktisches Beispiel zur Verwendung der Klasse könnte die Ausgabe aller Tiere in ein Arbeitsblatt sein:

Dim i As Integer
For i = 1 To objTiere.Tiere.Count
    Cells(i, 1).Value = objTiere.Tiere(i) ' Hier wird das Nagetier ausgegeben
Next i

Tipps für Profis

  • Verwende die With-Anweisung, um den Code lesbarer zu gestalten und die Anzahl der wiederholten Objektreferenzen zu reduzieren.
  • Nutze die Collection oder Dictionary, um Daten effizient zu verwalten und dynamisch auf Elemente zuzugreifen.
  • Denk daran, das Arbeitsblatt regelmäßig zu speichern, um deine Fortschritte nicht zu verlieren.

FAQ: Häufige Fragen

1. Kann ich mit Strings auf Klassenvariablen zugreifen?
Nein, VBA unterstützt dies nicht direkt. Du musst entweder die Variablen explizit angeben oder eine Collection verwenden.

2. Was ist der Unterschied zwischen Collection und Array?
Ein Array hat eine feste Größe, während eine Collection dynamisch ist und Objekte mit Schlüsseln speichern kann.

3. Wie kann ich ein kleines Nagetier in die Collection hinzufügen?
Du kannst das Nagetier mit einem Schlüssel wie "Maus" hinzufügen:

objTiere.Tiere.Add "Maus", "Nagetier"

4. Was mache ich, wenn ich ein Element nicht finden kann?
Überprüfe die Schlüssel und die Indizes, um sicherzustellen, dass das Element korrekt hinzugefügt wurde.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige