Excel vba嵌套字典 - 访问项目 [英] Excel vba nested dictionary - accessing items

查看:636
本文介绍了Excel vba嵌套字典 - 访问项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Tim可以从clsMatrix类中提取行键列表吗?这样的...

Tim is it possible to extract a list of row keys from the clsMatrix class? something like this...

Sub KEYS()
Dim KEY_LIST As Variant

KEY_LIST = TABLES("UDLY").dR.KEYS

End Sub

然后我可以循环一个表来提取满足一定条件的数据子集。

I can then cycle through a table to extract a subset of data which meet a certain criteria.

Tim,你的代码对于一个2D矩阵很好,但是我有5个工作表参考。我尝试使用if ... then else语句,但它很笨拙,不起作用 - 从BOOK表中查找数据的第二遍找不到行和列字典引用。你能建议一种更好的方法吗?感谢您的帮助。

Tim, your code works well for one 2D matrix, but I have 5 tables to reference for the project to work. I tried using if...then else statements, but it's clumsy and doesn't work - the second pass looking for data from the BOOK table can't find the row and col dictionary references. Can you suggest a better method? Thanks for your help.

Option Explicit
Private dR, dC
Private m_arr, UDLY, BOOK
'

Sub Init(TABLE As String)

    Dim i As Long
Dim RNGE As Range
Dim DATA As Variant
Dim arr As Variant

If TABLE = "UDLY" Then Set RNGE = Worksheets("SETTINGS").Range("UDLY_TABLE")
If TABLE = "BOOK" Then Set RNGE = Worksheets("BOOK").Range("BOOK_TABLE")

    arr = RNGE.Value

    Set dR = CreateObject("Scripting.Dictionary")
    Set dC = CreateObject("Scripting.Dictionary")

    'add the row keys and positions
    For i = LBound(arr, 1) + 1 To UBound(arr, 1)
        dR.Add arr(i, 1), i
    Next i
    'add the column keys and positions
    For i = LBound(arr, 2) + 1 To UBound(arr, 2)
        dC.Add arr(1, i), i
    Next i

'    m_arr = arr
    If TABLE = "UDLY" Then UDLY = arr
    If TABLE = "BOOK" Then BOOK = arr
End Sub

Function GetValue(TABLE, rowKey, colKey)


    If dR.Exists(rowKey) And dC.Exists(colKey) Then
'        GetValue = m_arr(dR(rowKey), dC(colKey))

        If TABLE = "UDLY" Then GetValue = UDLY(dR(rowKey), dC(colKey))
        If TABLE = "BOOK" Then GetValue = BOOK(dR(rowKey), dC(colKey))
    Else
        GetValue = 999 '"" 'or raise an error...
    End If
End Function

'============== $ / $ $ $ $
$ b

'===========================================================

Option Explicit

Sub Tester()
    Dim m As New clsMatrix

'    m.Init (ActiveSheet.Range("b40").CurrentRegion.Value)
'    m.Init (Worksheets("settings").Range("udly_table"))
    m.Init ("UDLY")
    Debug.Print m.GetValue("UDLY", "APZ4-FUT", "SPOT_OFFLINE")

    m.Init ("BOOK")
    Debug.Print m.GetValue("BOOK", "2.04", "STRIKE")
End Sub


推荐答案

Sub DICT_OF_DICT()

    Dim d1, d2

    Set d1 = CreateObject("Scripting.Dictionary")
    Set d2 = CreateObject("Scripting.Dictionary")

    d1.Add "BPH", "Hello"
    d2.Add "Shaun", d1

    Debug.Print d2("Shaun").Item("BPH")

End Sub

编辑:如果我想处理使用行/列标题快速访问2-D数组,那么我会倾向于不使用嵌套字典,而是使用两个不同的词典来键入每个维度(行标签字典和列标签)。

if I wanted to deal with quickly accessing a 2-D array using row/column headers then I'd be inclined not to use nested dictionaries, but to use two distinct dictionaries to key into each dimension (a "row label" dictionary and a "column label" one).

您可以将其包装成一个简单的类:

You can wrap this up in a simple class:

'Class module: clsMatrix
Option Explicit

Private dR, dC
Private m_arr

Sub Init(arr)

    Dim i As Long

    Set dR = CreateObject("Scripting.Dictionary")
    Set dC = CreateObject("Scripting.Dictionary")

    'add the row keys and positions
    For i = LBound(arr, 1) + 1 To UBound(arr, 1)
        dR.Add arr(i, 1), i
    Next i
    'add the column keys and positions
    For i = LBound(arr, 2) + 1 To UBound(arr, 2)
        dC.Add arr(1, i), i
    Next i

    m_arr = arr
End Sub

Function GetValue(rowKey, colKey)
    If dR.Exists(rowKey) And dC.Exists(colKey) Then
        GetValue = m_arr(dR(rowKey), dC(colKey))
    Else
        GetValue = "" 'or raise an error...
    End If
End Function

'EDIT: added functions to return row/column keys
'   return a zero-based array
Function RowKeys()
    RowKeys = dR.Keys
End Function

Function ColumnKeys()
    ColumnKeys = dC.Keys
End Function

示例用法:假设A1是顶部 - 第一行为列标题(col1至colx),第一列为行标题(row1至rowy)的矩形范围单元格 -

Example usage: assuming A1 is the top-left cell in a rectangular range where the first row is column headers ("col1" to "colx") and the first column is row headers ("row1" to "rowy") -

EDIT2 :进行了一些更改,以显示如何管理多个不同的表(没有更改类代码)

EDIT2: made some changes to show how to manage multiple different tables (with no changes to the class code)

'Regular module
Sub Tester()

    Dim tables As Object, k
    Set tables = CreateObject("Scripting.Dictionary")

    tables.Add "Table1", New clsMatrix
    tables("Table1").Init ActiveSheet.Range("A1").CurrentRegion.Value

    tables.Add "Table2", New clsMatrix
    tables("Table2").Init ActiveSheet.Range("H1").CurrentRegion.Value


    Debug.Print tables("Table1").GetValue("Row1", "Col3")
    Debug.Print tables("Table2").GetValue("R1", "C3")

    k = tables("Table1").RowKeys()
    Debug.Print Join(k, ", ")

End Sub

这篇关于Excel vba嵌套字典 - 访问项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆