2016-08-19 1 views
0

Ich werde einen Code schreiben, um die Frage zu veranschaulichen.VBA in Für jeden OItem Loop, wie kann ich auf die ID des OItem zugreifen?

For Each oElement in myArray 
    MsgBox oElement 
Next 

Dies würde eine Meldung aus dem Wert von „oElement“ enthielt in „myArray“ so oft sagen, wie es Elemente in „myArray“ ist.

Was aber, wenn ich die ID von "oElement" wissen möchte? Gibt es Eigenschaften von "oElement", auf die ich zugreifen kann? etwas wie das Drucken der Anzahl der Elemente anstelle des Wertes des Elements?

For Each oElement in myArray 
    MsgBox oElement.ID 
Next 

Ist es möglich? Gibt es Eigenschaften, auf die zugegriffen werden kann?

Vielen Dank im Voraus für Ihre Zeit und Aufmerksamkeit,

+0

Sie können für jede nur über Varianten ausführen, wenn es ein Array oder gegen eine Sammlung ist. Wenn es ein reines Array ist, gibt es keine Eigenschaften für den Zugriff auf was auch immer.Wenn Sie an Indizes interessiert sind, führen Sie einfach eine Schleife von "lbound" nach "ubound" durch. Wenn es sich um eine Auflistung handelt, können Sie auf alle Eigenschaften zugreifen, die das zugrunde liegende Objekt verfügbar macht. – cyboashu

Antwort

1

Nein, es gibt keine Möglichkeit, den Index des Elements in dem Array zu erhalten. Sie haben eine separate Variable zu erhalten:

Dim Index As Integer 

Index = 0 
For Each oElement In myArray 
    Print Index 
    Index = Index + 1 
Next 
+0

völlig einverstanden. Nicht die Haare zu teilen, aber auf diese Weise muss auch die "Optionsbasis" -Einstellung berücksichtigt werden. – cyboashu

+0

Das ist, wie ich es gelöst habe, aber ich wollte nur sicherstellen, dass es keine unbändigen Eigenschaften gab, auf die ich zugreifen könnte, um es sauberer zu machen. Vielen Dank. – RaRdEvA

0

eine Abhilfe anstelle eines Variant Array die Verwendung eines Dictionary Objekt sein könnte:

Sub main() 
    Dim myDict As Scripting.Dictionary 
    Dim key As Variant 

    Set myDict = GetDict '<--| get your "test" dictionary with "indexes" as 'keys' and "elements" as 'items' 

    For Each key In myDict.Keys '<--| iterate over keys (i.e. over your "indexes") 
     MsgBox key '<--| this will give you the "index" 
     MsgBox myDict(key) '<--| this will give you the "element" 
    Next key 
End Sub 

wo es die folgende Funktion verwendet wird ein „Test“ zurückzukehren Wörterbuch

Function GetDict() As Scripting.Dictionary 
    'function to return a test dictionary 

    Dim i As Long 
    Dim myDict As New Scripting.Dictionary 

    For i = 1 To 10 
     myDict.Add i, "string-" & CStr(i) '<--| use the 'key' as your "index" and the 'item' as your element 
    Next i 
    Set GetDict = myDict 
End Function 

In Wahrheit die folgenden Reverse Ansatz könnte mehr simila scheinen r zu Ihrem ursprünglichen Code:

Sub main() 
    Dim myDict As Scripting.Dictionary 
    Dim oElement As Variant 

    Set myDict = GetDict2 '<--| get your "test" dictionary with "elements" as 'keys' and "indexes" as 'items' 

    For Each oElement In myDict.Keys '<--| iterate over dictionary keys (i.e. over your "elements") 
     MsgBox myDict(oElement) '<--| this will give you the "index" 
     MsgBox oElement '<--| this will give you the "element" 
    Next oElement 
End Sub 

wobei für die Funktion verwendet wird:

Function GetDict2() As Scripting.Dictionary 
    Dim i As Long 
    Dim myDict As New Scripting.Dictionary 

    For i = 1 To 10 
     myDict.Add "string-" & CStr(i), i '<--| use the 'key' as your "element" and the 'item' as your key 
    Next i 
    Set GetDict2 = myDict 
End Function 

aber es würde den großen Nachteil hat Ihre „Elemente“ als keys verwenden, damit möglicherweise ihre Einzigartigkeit zu verletzen, während sequenzielle Ganzzahlen immer diese Anforderung erfüllen würden

+0

Ich stimme zu, dass dieser Ansatz genau das ist, wonach mein Verstand suchte. Der Nachteil ist, wie Sie sagten, auf der einen Seite die Einzigartigkeit und auf der anderen Seite (der Einfachheit halber) ist es einfacher, einen manuellen Zähler hinzuzufügen (wie in der vorherigen Antwort), nur um Zeit und Codezeilen zu sparen. – RaRdEvA

Verwandte Themen