2015-06-11 14 views
2

У меня есть то, что мне кажется простой проблемой. У меня есть массив значений, которые мне нужны для цикла и удаления. Проблема в том, что массив можно только обновить (не удалять элемент в середине).Один словарь данных в VBA

Я созерцал использование словаря, но я бы не использовал значение, только ключ, который кажется пустой ... Есть ли такая вещь, как «ключ»?

Для контекста, что я хотел бы сделать что-то вроде:

  1. Создать массив: {1,2,3,4,5,6,7}

  2. Удаление элемента из середины: например, удалить (3) = {1,2,4,5,6,7}

Как я уже сказал, я могу использовать словарь, но, похоже, как отходы!

+0

Просто введите пустое значение в качестве элемента. Вы можете вернуть ключи в виде массива –

ответ

1

Я почти никогда не ставил значения в словаре. Я просто использую ключи. Не беспокойтесь об этом. Никакие данные не используют память.

Это ваши варианты.

От .NET (старайтесь избегать их как есть уже COM накладные расходы - в .NET накладные расходы, а просто дублирует функциональность COM)

ArrayList -An класс массив, который Безразлично» t имеют фиксированный размер. Вы можете просто добавлять к нему элементы.

Hashtable -Этот класс похож на Scripting.Dictionary class. Вы можете добавлять элементы и искать их по клавишам.

Очередь -Впервые представлена ​​первая в России коллекция (FIFO). Вы вставляете элементы, а затем читаете их позже в том же порядке.

Stack -A первый входить, последний вне (FILO) комплект. Вы нажимаете элементы на стек, а затем выбрасываете их в обратном порядке.

SortedList -В отличие от Hashtable, кроме случаев, когда вы повторяете элементы, они всегда сортируются по клавише.

См https://msdn.microsoft.com/en-us/library/aa719110(v=vs.71).aspx

COM объектов

Вы VBScript в Scripting.Runtime в словарь (VBScript является pastable в VBA)

'This dedups 
Set Dict = CreateObject("Scripting.Dictionary") 
On Error Resume Next 
Dict.Add "Key1", "Data" 
Dict.Add "Key2", "Data" 
Dict.Add "Key3", "Data" 
If Err.Number <> 0 then 
    If LCase(Arg(1)) = "l" then 
     Dict.Remove Line 
     Dict.Add Line, "" 
    End If 
End If 
For Each thing in Dict.Keys() 
    Msgbox thing 
Next 

Тогда есть ADO Recordset, что может быть ved и загружен из файла.

'This sorts and filters 
Set rs = CreateObject("ADODB.Recordset") 
With rs 
.Fields.Append "SortKey", 4 
.Fields.Append "Txt", 201, 5000 
.Open 
.AddNew 
.Fields("SortKey").value = 1 
.Fields("Txt").value = "Line1" 
.UpDate 
.AddNew 
.Fields("SortKey").value = 2 
.Fields("Txt").value = "Line2" 
.UpDate 
.AddNew 
.Fields("SortKey").value = 3 
.Fields("Txt").value = "Line3" 
.UpDate 

'Sorting 
.Sort = "SortKey ASC" 

'Filtering 
.filter = "Sortkey < 3" 

'Writing it out 
Do While not .EOF 
    MsgBox .Fields("Txt").Value 
    .MoveNext 
Loop 
3

Используйте ArrayList:

Set myAl = CreateObject("System.Collections.ArrayList")   
myAl.Add ("The") 'Add Item 
myAl.Add ("dog") 'Add Item 
myAl.Remove ("dog") 'Remove an item 

'An example of how to traverse the items of an ArrayList: 
For Each Item In myAl 
    Debug.Print Item 
Next Item 

Вы могли бы точно также использовать Dictionary, и я не ожидаю, что там будет много накладных расходов, тем не менее, структура ArrayList данных, вероятно, один, который вы ищете.

Существуют другие структуры данных, такие как Hashtables, Stacks, Queues, но они кажутся менее подходящими для ваших нужд.

Смежные вопросы