Я не удивлен, что передача массива VBA в метод .NET, который ожидает System.Array
(например, CopyTo(System.Array, Integer)
), вызывает несовместимость.
Я не достиг большого успеха в прямом использовании возвращенной коллекциииз .Keys
, поэтому копирование его в ArrayList
кажется полезным обходным путем.
HashTable.Keys
возвращает ICollection
, и ArrayList
может принять ICollection
в своем AddRange()
, так что это должно работать:
Dim ht As Object
Set ht = GenerateSampleHashTable()
Dim oKeys As Object
Set oKeys = CreateObject("System.Collections.ArrayList")
oKeys.AddRange ht.Keys()
Полученный oKeys
может быть перечислен напрямую:
Dim i As Long
For i = 0 To oKeys.Count - 1
Debug.Print oKeys.Item(i)
Next
Или может быть перечислен с For Each
с помощью оболочкикласс, описанный в Обертка .Net ArrayList с пользовательским классом VBA get итератор (куда идут все кредиты):
Dim wr As ThatCollectionWrapperClass
Set wr = New ThatCollectionWrapperClass
wr.Init oKeys 'Poor man's constructor - add that method to the class and remove its Class_Initialize
Dim k As Variant
For Each k In wr
Debug.Print k
Next