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

Benutzerdefinierte Typen in Collections

Forumthread: Benutzerdefinierte Typen in Collections

Benutzerdefinierte Typen in Collections
12.08.2003 09:53:10
Marco
Hallo,
wie bekomme ich benutzerdefinierte Typen (Records, Strukturen, wie auch immer
man sie nenen will) in Collections. Oder können VBA Collections nur
einfache Datentypen ("Sting, Integer usw...)aufnehmen ?
Dieser Quelltext steht in einem KlassenModul:
Private Type t_fahrzeug
colorindex As Integer
pos_nr As Integer
y_nr As String
verwendung As String
End Type
Private fahrzeuge As Collection
' Kontruktor
Public Sub Class_initialize()
Call SetFahrzeugData
End Sub

' Setzt memebervariable fahrzeuge

Private Sub SetFahrzeugData()
Dim i As Integer
Dim fahrzeug As t_fahrzeug
Set fahrzeuge = New Collection
Sheets("Fzg-Uebersicht").Activate
i = 1
Do Until ActiveCell.Value = ""
fahrzeug.colorindex = Range("quelle_color").Offset(i, 0).Value
fahrzeug.y_nr = Range("quelle_ynr").Offset(i, 0).Value
fahrzeug.verwendung = Range("quelle_verwendung").Offset(i, 0).Value
fahrzeug.pos_nr = Range("quelle_pos").Offset(i, 0).Value
' fahrzeug in Collection aufnehmen
---->    fahrzeuge.Add fahrzeug                -----> hier ist mein Problem !!
' nächste Zeile
ActiveCell.Offset(1, 0).Activate
Loop
Debug.Print ("Es wurden " & fahrzeuge.Count & " Fahrzeuge ermittelt")
End Sub

Als Fehlermeldung erscheint immer:
----------------------------------
Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert wurden, können in den oder aus dem Typ Variant umgewandelt werden, oder an eine zur Laufzeit auflösbare Funktion weitergeleitet werden.
Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Benutzerdefinierte Typen in Collections
13.08.2003 09:51:16
Michael Schirow
Hi Marco,
verwende eine Klasse für den benutzerdef. Typ. Beispiel s.u.
HTH, Michael
' -------------------------
' Klassenmodul: clsFahrzeug
' -------------------------
Option Explicit
' Eigenschaften
Public FarbCode As Integer
Public Hersteller As String
Public Typ As String
' Methoden
' -------------------------
' Klassenmodul: clsFahrzeuge
' -------------------------
Option Explicit
Private fahrzeugliste As Collection
' Konstruktor

Private Sub Class_Initialize()
Set fahrzeugliste = New Collection
End Sub

' öffentliche Methoden
Public Sub add(fahrzeug As clsFahrzeug)
fahrzeugliste.add fahrzeug
End Sub

Public Sub show(index As Integer)
Dim f As clsFahrzeug
Set f = fahrzeugliste(index)
With f
Debug.Print .Hersteller
Debug.Print .FarbCode
Debug.Print .Typ
End With
End Sub

' ---------------------------
' Modul: modTest
' ---------------------------
Option Explicit
Sub test_clsFahrzeuge()
Dim fahrzeug As clsFahrzeug
Dim fahrzeuge As clsFahrzeuge

Set fahrzeug = New clsFahrzeug
Set fahrzeuge = New clsFahrzeuge

With fahrzeug
.FarbCode = 1
.Hersteller = "Mercedes"
.Typ = "LKW"
End With

fahrzeuge.add fahrzeug
fahrzeuge.show (1)

End Sub


Anzeige
;
Anzeige

Infobox / Tutorial

Benutzerdefinierte Typen in VBA Collections verwenden


Schritt-für-Schritt-Anleitung

Um benutzerdefinierte Typen in VBA Collections zu verwenden, folge diesen Schritten:

  1. Erstelle ein Klassenmodul für deinen benutzerdefinierten Typ. In unserem Beispiel nennen wir die Klasse clsFahrzeug.

    ' Klassenmodul: clsFahrzeug
    Option Explicit
    Public FarbCode As Integer
    Public Hersteller As String
    Public Typ As String
  2. Erstelle ein weiteres Klassenmodul für die Collection, beispielsweise clsFahrzeuge.

    ' Klassenmodul: clsFahrzeuge
    Option Explicit
    Private fahrzeugliste As Collection
    
    Private Sub Class_Initialize()
       Set fahrzeugliste = New Collection
    End Sub
    
    Public Sub add(fahrzeug As clsFahrzeug)
       fahrzeugliste.Add fahrzeug
    End Sub
    
    Public Sub show(index As Integer)
       Dim f As clsFahrzeug
       Set f = fahrzeugliste(index)
       With f
           Debug.Print .Hersteller
           Debug.Print .FarbCode
           Debug.Print .Typ
       End With
    End Sub
  3. Verwende die Klassen in einem Modul:

    ' Modul: modTest
    Option Explicit
    Sub test_clsFahrzeuge()
       Dim fahrzeug As clsFahrzeug
       Dim fahrzeuge As clsFahrzeuge
    
       Set fahrzeug = New clsFahrzeug
       Set fahrzeuge = New clsFahrzeuge
    
       With fahrzeug
           .FarbCode = 1
           .Hersteller = "Mercedes"
           .Typ = "LKW"
       End With
    
       fahrzeuge.add fahrzeug
       fahrzeuge.show (1)
    End Sub

Häufige Fehler und Lösungen

Ein häufiger Fehler, den Du beim Arbeiten mit benutzerdefinierten Typen in Collections vermeiden solltest, ist die Verwendung von benutzerdefinierten Typen, die nicht in öffentlichen Objektmodulen definiert wurden. Um diesen Fehler zu beheben:

  • Verwende Klassenmodule anstelle von benutzerdefinierten Typen. So kannst Du Objekte in einer Collection speichern, ohne auf Fehler zu stoßen.

Falls Du dennoch eine Fehlermeldung erhältst, die besagt, dass der Typ nicht in eine Variant konvertiert werden kann, überprüfe, ob Du in Deinem Code den richtigen Datentyp verwendest.


Alternative Methoden

Wenn Du keine Klassenmodule verwenden möchtest, kannst Du auch Arrays oder Dictionary-Objekte verwenden, um komplexe Datentypen zu speichern. Beispiel für die Verwendung von Dictionary:

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "Fahrzeug1", Array("Mercedes", 1, "LKW")

Diese Methode ist jedoch nicht so strukturiert wie Klassen und kann weniger Übersichtlichkeit bieten.


Praktische Beispiele

Hier ist ein praktisches Beispiel, das die Verwendung von benutzerdefinierten Typen in einer Collection zeigt:

Sub Beispiel()
    Dim fahrzeug As clsFahrzeug
    Dim fahrzeuge As clsFahrzeuge

    Set fahrzeug = New clsFahrzeug
    Set fahrzeuge = New clsFahrzeuge

    With fahrzeug
        .FarbCode = 2
        .Hersteller = "BMW"
        .Typ = "PKW"
    End With

    fahrzeuge.add fahrzeug
    fahrzeuge.show (1)
End Sub

Dieses Beispiel zeigt, wie Du ein Fahrzeugobjekt erstellen und in einer Collection speichern kannst.


Tipps für Profis

  • Nutze die Option Explicit Anweisung in jedem Modul, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Dokumentiere Deine Klassen und Methoden mit Kommentaren, um die Wartbarkeit Deines Codes zu verbessern.
  • Experimentiere mit Eigenschaften und Methoden in Deinen Klassen, um den Code flexibler zu gestalten.

FAQ: Häufige Fragen

1. Kann ich benutzerdefinierte Typen in einer normalen Collection speichern? Nein, um benutzerdefinierte Typen in einer Collection zu speichern, musst Du Klassenmodule verwenden.

2. Was ist der Unterschied zwischen einem benutzerdefinierten Typ und einer Klasse? Ein benutzerdefinierter Typ ist eine einfache Datenstruktur, während eine Klasse Methoden und Eigenschaften enthält, die komplexere Logik ermöglichen.

3. Wie kann ich auf die Elemente in einer Collection zugreifen? Du kannst die Item-Methode oder den Index verwenden, um auf Elemente in einer Collection zuzugreifen, wie im Beispiel gezeigt.

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