【问题标题】:Single data dictionary in VBAVBA 中的单个数据字典
【发布时间】:2015-08-27 01:06:13
【问题描述】:

我有一个在我看来很简单的问题。我有一个需要循环和删除的值数组。问题是数组只能redimmed(不能删除中间的元素)。

我正在考虑使用字典,但我不会真正使用值,只使用键,这似乎很浪费...... 有没有“键”列表这样的东西?

对于上下文,我想做的是:

  1. 创建数组:{1,2,3,4,5,6,7}

  2. 从中间删除一个元素:例如删除(3) = {1,2,4,5,6,7}

正如我所说,我可以使用字典,但似乎很浪费!

【问题讨论】:

  • 只需将一个空白值作为项目。您可以将 Keys 作为数组返回

标签: arrays excel vba dictionary


【解决方案1】:

使用 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,但它们似乎不太适合您的需求。

【讨论】:

    【解决方案2】:

    我几乎从不将值放入字典中。我只用钥匙。别担心。没有数据不占用内存。

    这些是您的选择。

    来自 .NET(尽量避免这些,因为已经存在 COM 开销 - .NET 开销也只是复制了 COM 功能)

    ArrayList——没有固定大小的数组类。您可以继续向其中添加项目。

    Hashtable——这个类类似于 Scripting.Dictionary 类。您可以添加项目并按键查找。

    队列——这是一个先进先出 (FIFO) 集合。您将项目推入,然后在稍后以相同的顺序读出它们。

    堆栈——先进后出 (FILO) 集合。您将项目压入堆栈,然后以相反的顺序将它们弹出。

    SortedList——与 Hashtable 类似,但当您遍历项目时,它们总是按键排序。

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

    COM 对象

    你有 VBScript 的 Scripting.Runtime 的 Dictionary(vbscript 可以粘贴到 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,可以从文件中保存和加载。

    '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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多