Suche…


Bemerkungen

Sie müssen dem VBA-Projekt Microsoft Scripting Runtime über den Befehl Tools → References der VBE hinzufügen, um das frühe Binden des Scripting Dictionary-Objekts zu implementieren. Diese Bibliotheksreferenz wird mit dem Projekt mitgeführt. Es muss nicht erneut referenziert werden, wenn das VBA-Projekt auf einem anderen Computer verteilt und ausgeführt wird.

Eigenschaften und Methoden

Ein Scripting Dictionary-Objekt speichert Informationen in Schlüssel- / Elementpaaren. Die Schlüssel müssen eindeutig sein und dürfen kein Array sein, aber die zugehörigen Elemente können wiederholt werden (ihre Eindeutigkeit wird vom zugehörigen Schlüssel gehalten) und können von jeder Art von Variante oder Objekt sein.

Ein Wörterbuch kann als eine In-Memory-Datenbank mit zwei Feldern und einem primären eindeutigen Index für das erste 'Feld' (den Schlüssel ) betrachtet werden. Dieser eindeutige Index der Keys-Eigenschaft ermöglicht sehr schnelle "Lookups", um den mit einem Schlüssel verknüpften Elementwert abzurufen.


Eigenschaften

Name lesen Schreiben Art Beschreibung
CompareMode lesen Schreiben CompareMode-Konstante Das Setzen des CompareMode kann nur für ein leeres Wörterbuch durchgeführt werden. Zulässige Werte sind 0 (vbBinaryCompare), 1 (vbTextCompare), 2 (vbDatabaseCompare).
Anzahl schreibgeschützt vorzeichenlose lange ganze Zahl Eine einseitige Anzahl der Schlüssel- / Elementpaare im Skriptwörterbuchobjekt.
Schlüssel lesen Schreiben Nicht-Array-Variante Jeder einzelne eindeutige Schlüssel im Wörterbuch.
Artikel ( Schlüssel ) lesen Schreiben jede Variante Standardeigenschaft Jedes einzelne Element ist einem Schlüssel im Wörterbuch zugeordnet. Wenn Sie versuchen, ein Element mit einem Schlüssel abzurufen, der nicht im Wörterbuch vorhanden ist, wird der übergebene Schlüssel implizit hinzugefügt .

Methoden

Name Beschreibung
Hinzufügen ( Schlüssel , Element ) Fügt dem Wörterbuch einen neuen Schlüssel und ein neues Element hinzu. Der neue Schlüssel darf nicht in der aktuellen Schlüsselauflistung des Wörterbuchs vorhanden sein. Ein Element kann jedoch unter vielen eindeutigen Schlüsseln wiederholt werden.
Existiert ( Schlüssel ) Boolescher Test, um festzustellen, ob ein Schlüssel bereits im Wörterbuch vorhanden ist.
Schlüssel Gibt das Array oder die Sammlung eindeutiger Schlüssel zurück.
Artikel Gibt das Array oder die Sammlung zugehöriger Elemente zurück.
Entfernen ( Schlüssel ) Entfernt einen einzelnen Wörterbuchschlüssel und das zugehörige Element.
Alles entfernen Löscht alle Schlüssel und Elemente eines Wörterbuchobjekts.

Beispielcode

'Populate, enumerate, locate and remove entries in a dictionary that was created
'with late binding
Sub iterateDictionaryLate()
    Dim k As Variant, dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'locate the Item for Green
    Debug.Print dict.Item("Green")
    
    'remove key/item pairs from the dictionary
    dict.Remove "blue"      'remove individual key/item pair by key
    dict.RemoveAll          'remove all remaining key/item pairs

End Sub

'Populate, enumerate, locate and remove entries in a dictionary that was created
'with early binding (see Remarks)
Sub iterateDictionaryEarly()
    Dim d As Long, k As Variant
    Dim dict As New Scripting.Dictionary
    
    dict.CompareMode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    dict.Add Key:="White", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'iterate through the keys by the count
    For d = 0 To dict.Count - 1
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'iterate through the keys by the boundaries of the keys collection
    For d = LBound(dict.Keys) To UBound(dict.Keys)
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'locate the Item for Green
    Debug.Print dict.Item("Green")
    'locate the Item for the first key
    Debug.Print dict.Item(dict.Keys(0))
    'locate the Item for the last key
    Debug.Print dict.Item(dict.Keys(UBound(dict.Keys)))
    
    'remove key/item pairs from the dictionary
    dict.Remove "blue"                         'remove individual key/item pair by key
    dict.Remove dict.Keys(0)                   'remove first key/item by index position
    dict.Remove dict.Keys(UBound(dict.Keys))   'remove last key/item by index position
    dict.RemoveAll                             'remove all remaining key/item pairs

End Sub

Daten mit Scripting.Dictionary aggregieren (Maximum, Anzahl)

Wörterbücher eignen sich hervorragend zum Verwalten von Informationen, bei denen mehrere Einträge vorkommen, aber es geht nur um einen einzelnen Wert für jeden Eintragssatz - den ersten oder letzten Wert, den Mindest- oder Höchstwert, einen Durchschnitt, eine Summe usw.

Stellen Sie sich eine Arbeitsmappe vor, die ein Protokoll der Benutzeraktivität enthält, mit einem Skript, das den Benutzernamen und das Bearbeitungsdatum jedes Mal einfügt, wenn jemand die Arbeitsmappe bearbeitet:

Log - Arbeitsblatt

EIN B
Bob 10/12/2016 9:00 Uhr
alice 13.10.2016 13:00 Uhr
Bob 13.10.2016 13:30 Uhr
alice 13.10.2016 14:00 Uhr
alice 14.10.2016 13:00 Uhr

Angenommen, Sie möchten die letzte Bearbeitungszeit für jeden Benutzer in ein Arbeitsblatt mit dem Namen Summary ausgeben.

Anmerkungen:
1. Es wird angenommen, dass sich die Daten in ActiveWorkbook .
2. Wir verwenden ein Array, um die Werte aus dem Arbeitsblatt zu ziehen. Dies ist effizienter als das Durchlaufen jeder Zelle.
3. Das Dictionary wird mithilfe einer frühen Bindung erstellt.

Sub LastEdit()
Dim vLog as Variant, vKey as Variant
Dim dict as New Scripting.Dictionary
Dim lastRow As Integer, lastColumn As Integer
Dim i as Long
Dim anchor As Range

With ActiveWorkbook
    With .Sheets("Log")
        'Pull entries in "log" into a variant array
        lastRow = .Range("a" & .Rows.Count).End(xlUp).Row
        vlog = .Range("a1", .Cells(lastRow, 2)).Value2

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)
            Dim editDate As Date
            editDate = vlog(i, 2)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = editDate
            ElseIf dict(username) < editDate Then
                dict(username) = editDate
            End If
        Next
    End With

    With .Sheets("Summary")
        'Loop through keys
        For Each vKey in dict.Keys
            'Add the key and value at the next available row
            Anchor = .Range("A" & .Rows.Count).End(xlUp).Offset(1,0)
            Anchor = vKey
            Anchor.Offset(0,1) = dict(vKey)
        Next vKey
    End With
End With
End Sub

und die Ausgabe sieht so aus:

Summary Arbeitsblatt

EIN B
Bob 13.10.2016 13:30 Uhr
alice 14.10.2016 13:00 Uhr

Wenn Sie dagegen ausgeben möchten, wie oft jeder Benutzer die Arbeitsmappe bearbeitet hat, sollte der Rumpf der For Schleife folgendermaßen aussehen:

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = 1
            Else
                dict(username) = dict(username) + 1
            End If
        Next

und die Ausgabe sieht so aus:

Summary Arbeitsblatt

EIN B
Bob 2
alice 3

Mit Scripting.Dictionary eindeutige Werte erhalten

Das Dictionary ermöglicht es sehr einfach, eine eindeutige Menge von Werten zu erhalten. Betrachten Sie die folgende Funktion:

Function Unique(values As Variant) As Variant()
    'Put all the values as keys into a dictionary
    Dim dict As New Scripting.Dictionary
    Dim val As Variant
    For Each val In values
        dict(val) = 1 'The value doesn't matter here
    Next
    Unique = dict.Keys
End Function

was könnte man dann so nennen:

Dim duplicates() As Variant
duplicates = Array(1, 2, 3, 1, 2, 3)
Dim uniqueVals() As Variant
uniqueVals = Unique(duplicates)

und uniqueVals würde nur {1,2,3} .

Hinweis: Diese Funktion kann mit jedem aufzählbaren Objekt verwendet werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow