Nie mogę znaleźć dokumentacji wyjaśniającej, jak utworzyć tablicę mieszającą lub tablicę asocjacyjną w VBA. Czy to w ogóle możliwe?
Czy możesz podać link do artykułu lub jeszcze lepiej opublikować kod?
vba
hash
hashtable
associative-array
Tyler
źródło
źródło
Odpowiedzi:
Myślę, że szukasz obiektu Dictionary, który znajduje się w bibliotece Microsoft Scripting Runtime. (Dodaj odniesienie do swojego projektu z menu Narzędzia ... References w VBE.)
Prawie działa z każdą prostą wartością, która mieści się w wariancie (klucze nie mogą być tablicami, a próba uczynienia ich obiektami nie ma większego sensu. Zobacz komentarz @Nile poniżej):
Dim d As dictionary Set d = New dictionary d("x") = 42 d(42) = "forty-two" d(CVErr(xlErrValue)) = "Excel #VALUE!" Set d(101) = New Collection
Możesz także użyć obiektu VBA Collection, jeśli Twoje potrzeby są prostsze i chcesz tylko klucze ciągów.
Nie wiem, czy któryś z nich rzeczywiście coś haszuje, więc możesz poszukać dalej, jeśli potrzebujesz wydajności podobnej do haszowania. (EDYCJA: Scripting.Dictionary wewnętrznie używa tablicy skrótów ).
źródło
Empty
. Odpowiednio zredagowałem odpowiedź.W przeszłości kilkakrotnie korzystałem z klasy HashTable Francesco Baleny, gdy kolekcja lub słownik nie pasowały idealnie, a ja potrzebowałem tylko HashTable.
źródło
Spróbuj użyć obiektu Dictionary lub Collection.
http://visualbasic.ittoolbox.com/documents/dictionary-object-vs-collection-object-12196
źródło
Zaczynamy ... po prostu skopiuj kod do modułu, jest gotowy do użycia
Private Type hashtable key As Variant value As Variant End Type Private GetErrMsg As String Private Function CreateHashTable(htable() As hashtable) As Boolean GetErrMsg = "" On Error GoTo CreateErr ReDim htable(0) CreateHashTable = True Exit Function CreateErr: CreateHashTable = False GetErrMsg = Err.Description End Function Private Function AddValue(htable() As hashtable, key As Variant, value As Variant) As Long GetErrMsg = "" On Error GoTo AddErr Dim idx As Long idx = UBound(htable) + 1 Dim htVal As hashtable htVal.key = key htVal.value = value Dim i As Long For i = 1 To UBound(htable) If htable(i).key = key Then Err.Raise 9999, , "Key [" & CStr(key) & "] is not unique" Next i ReDim Preserve htable(idx) htable(idx) = htVal AddValue = idx Exit Function AddErr: AddValue = 0 GetErrMsg = Err.Description End Function Private Function RemoveValue(htable() As hashtable, key As Variant) As Boolean GetErrMsg = "" On Error GoTo RemoveErr Dim i As Long, idx As Long Dim htTemp() As hashtable idx = 0 For i = 1 To UBound(htable) If htable(i).key <> key And IsEmpty(htable(i).key) = False Then ReDim Preserve htTemp(idx) AddValue htTemp, htable(i).key, htable(i).value idx = idx + 1 End If Next i If UBound(htable) = UBound(htTemp) Then Err.Raise 9998, , "Key [" & CStr(key) & "] not found" htable = htTemp RemoveValue = True Exit Function RemoveErr: RemoveValue = False GetErrMsg = Err.Description End Function Private Function GetValue(htable() As hashtable, key As Variant) As Variant GetErrMsg = "" On Error GoTo GetValueErr Dim found As Boolean found = False For i = 1 To UBound(htable) If htable(i).key = key And IsEmpty(htable(i).key) = False Then GetValue = htable(i).value Exit Function End If Next i Err.Raise 9997, , "Key [" & CStr(key) & "] not found" Exit Function GetValueErr: GetValue = "" GetErrMsg = Err.Description End Function Private Function GetValueCount(htable() As hashtable) As Long GetErrMsg = "" On Error GoTo GetValueCountErr GetValueCount = UBound(htable) Exit Function GetValueCountErr: GetValueCount = 0 GetErrMsg = Err.Description End Function
Aby użyć w aplikacji VB (A):
Public Sub Test() Dim hashtbl() As hashtable Debug.Print "Create Hashtable: " & CreateHashTable(hashtbl) Debug.Print "" Debug.Print "ID Test Add V1: " & AddValue(hashtbl, "Hallo_0", "Testwert 0") Debug.Print "ID Test Add V2: " & AddValue(hashtbl, "Hallo_0", "Testwert 0") Debug.Print "ID Test 1 Add V1: " & AddValue(hashtbl, "Hallo.1", "Testwert 1") Debug.Print "ID Test 2 Add V1: " & AddValue(hashtbl, "Hallo-2", "Testwert 2") Debug.Print "ID Test 3 Add V1: " & AddValue(hashtbl, "Hallo 3", "Testwert 3") Debug.Print "" Debug.Print "Test 1 Removed V1: " & RemoveValue(hashtbl, "Hallo_1") Debug.Print "Test 1 Removed V2: " & RemoveValue(hashtbl, "Hallo_1") Debug.Print "Test 2 Removed V1: " & RemoveValue(hashtbl, "Hallo-2") Debug.Print "" Debug.Print "Value Test 3: " & CStr(GetValue(hashtbl, "Hallo 3")) Debug.Print "Value Test 1: " & CStr(GetValue(hashtbl, "Hallo_1")) Debug.Print "" Debug.Print "Hashtable Content:" For i = 1 To UBound(hashtbl) Debug.Print CStr(i) & ": " & CStr(hashtbl(i).key) & " - " & CStr(hashtbl(i).value) Next i Debug.Print "" Debug.Print "Count: " & CStr(GetValueCount(hashtbl)) End Sub
źródło