This is an old revision of the document!
Download iterator.cls (V-2.5.0)
In VBA gibt es verschiedene Listen-Arten. Array, Collection und Dictionary. Wenn man noch mit RegExp arbeitet kommen MatchCollection und Match.Submatches dazu. Bei Recordset die Fields.
Jeder dieser Listen muss anderst behandelt werden. Mal beginnen die Indexe irgendwo (array), mal bei 1 (Collection), meistens bei 0 oder im Fall von Dictionaries muss man über den Key zugriffen werden.
Ich wollte ein einheitliches Konstrukt, durch dass ich bequem mittels Loop durchiterieren kann. Dabei kam die Iterator-Klasse heraus.
Die folgenden Listen sind ausprogrammiert:
Array,
Collection1),
Dictionary2),
RegExp.MatchCollection3),
RegExp.Submatches,
DAO.Recordset,
DAO.Fields
Excel.Workbook (Die Sheets)
Excel.Sheets
'/** ' * Parameter zur Steuerung des Verhalten des Iterators ' * Die einzelnen Parameter sind mit + kombinierbar ' */ Public Enum itParams itNone = 0 'Kein Parameter hat gültigkeit itNothingAsEmptyList = 2 ^ 0 'Leerer String, Nothing, Empty, Null wird als leere Liste akzeptiert und wirft kein Fehler itListNextNoParamsAsToNext = 2 ^ 1 'Wenn bei listNext keine Parameter angeben werden, einfach eins vorrücken. itErrorAtEmptyList = 2 ^ 2 'Fehler generieren, wenn die iListe leer ist itDaoValue = 2 ^ 3 'Field-Value anstelle von Field ausgeben itIndexInsteadKey = 2 ^ 4 'Gibt bei den toX() Funktionen den Index anstelle des Keys zurück itDefault = itNothingAsEmptyList + itListNextNoParamsAsToNext [_LAST] = 4 End Enum
Die Eigenschaften der Klasse.
r steht für Readable, w für writable
Diese Properties sind die Einzeilzuordnungen zu itparams
Diese Funktionen dienesn dazu, dass die Klasse wie eine Collection genutzt werden kann.
http://msdn.microsoft.com/en-us/library/aa262338%28v=vs.60%29.aspx
'/** ' * Der NewEnum wird für die For Each.. Next Schleife verwendet ' * ' * Diese Funktion hat das Attribut "'Attribute NewEnum.VB_UserMemId = -4" ' * !! Diese Iterierung hat keinen Einfluss auf die aktuelle Position !! ' * ' * @return Das nächste element ' */ Public Function NewEnum() As IUnknown
'/** ' * Entspricht dem item()-Befehl der Listenobjekte ' * Alle 3 Propert-Funktionen aben das versteckte Attribut "Attribute item.VB_UserMemId = 0" ' * Dadurch kann mittels it(1), it("MyFeild"), it!MyField etc darauf zugegriffen werden. ' * ' * !! Das Verhalten dieser Funktion ist NICHT standartisiert. Sie entspricht dem entsprechenden Verhalten der Source !! ' * ' * @param Variant Index/Key ' * @return Variant ' */ Public Property Get item(ByVal iIndex As Variant) As Variant
'/** ' * Initialisuert den Iterator ' * @param Variant Die Liste, über welche Iteriert werden soll ' * @param itParams Parameters ' * @return Boolean true: iList ist eine Liste und hat Werte ' */ Public Static Function initialize( _ ByRef iList As Variant, _ Optional ByVal iParams As itParams = itDefault _ ) As Boolean
Die Parameters findest du hier. Sie sind mit + kombinierbar.
'/** ' * Analog zu initialze. Erstellt aber direkt ein Recordset aus einem SQL ' * @param String SLQ String ' * @param itParams Parameters ' * @return Boolean true: iList ist eine Liste und hat Werte ' */ Public Static Function initializeRs( _ ByVal iSql As String, _ Optional ByVal iParams As itParams = itDefault _ ) As Boolean
'/** ' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value ' * @param Variant Key oder pos des Items ' * @param Variant Das Item himself ' * @return Boolean EOF Public Function toNext( _ Optional ByRef oKey As Variant = Null, _ Optional ByRef oItem As Variant = Null _ ) As Boolean
'/** ' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value ' * @param Variant Key oder pos des Items ' * @param Variant Das Item himself ' * @return Boolean EOF Public Function toPrev( _ Optional ByRef oKey As Variant = Null, _ Optional ByRef oItem As Variant = Null _ ) As Boolean
'/** ' * Geht zum ersten Datensatz. ' * Vorsicht, während reset() eins vor den ersten Datensatz geht, geht toFirst() bereits auf den ersten Datensatz ' * Somit ists das eigentlich reset()+toNext() ' * @param Variant Key oder pos des Items ' * @param Variant Das Item himself ' * @return Boolean EOF Public Function toFirst( _ Optional ByRef oKey As Variant = Null, _ Optional ByRef oItem As Variant = Null _ ) As Boolean
'/** ' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value ' * @param Variant Key oder pos des Items ' * @param Variant Das Item himself ' * @return Boolean EOF Public Function toLast( _ Optional ByRef oKey As Variant = Null, _ Optional ByRef oItem As Variant = Null _ ) As Boolean
'/** ' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value ' * @param Long Absolute Position. Zwischen 0 und Count-1 ' * @param Variant Key oder index des Items ' * @param Variant Das Item himself ' * @return Boolean EOF Public Function toPosition( _ ByVal iAbsolutPosition As Long, _ Optional ByRef oKey As Variant = Null, _ Optional ByRef oItem As Variant = Null _ ) As Boolean
Siehe auch [VBA] list()
'/** ' * Rückt den Zeiger um Eins vor und gibt die Elemente einer Unterliste aus. ' * @paramArray Variant Auflistung der Variablen, die abgefüllt werden ' * @return EOF ' */ Public Function listNext( _ ParamArray oParams() As Variant _ ) As Boolean
Siehe auch [VBA] list()
'/** ' * Ggibt die Elemente der aktuellen Unterliste aus. ' * @paramArray Variant Auflistung der Variablen, die abgefüllt werden ' * @return EOF & BOF ' */ Public Function list( _ ParamArray oParams() As Variant _ ) As Boolean
'/** ' * Setzt den pos auf den Start-1 zurück, so dass bei einem toNext() der erste Datensatz kommt ' */ Public Sub reset()
Wenn das Current-Objekt selber wieder iterierbar ist, kann mit dieser Methode direkt ein Iterator für das Objekt erstellt werden.
'/** ' * Gibt current als Iterator zurück ' * @return Iterator ' */ Public Property Get subIterator() As Iterator
Die folgenden Datentypen werden vom Iterator als Liste erkannt und können iteriert werden