Diccionario anidado de Excel vba: acceso a elementos

Tim, ¿es posible extraer una lista de claves de fila de la clase clsMatrix? algo como esto...

Sub KEYS()
Dim KEY_LIST As Variant

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

End Sub

Luego puedo recorrer una tabla para extraer un subconjunto de datos que cumplan con ciertos criterios.

Tim, tu código funciona bien para una matriz 2D, pero tengo 5 tablas de referencia para que el proyecto funcione. Intenté usar las declaraciones if ... then else, pero es torpe y no funciona: la segunda pasada buscando datos de la tabla BOOK no puede encontrar las referencias del diccionario de filas y columnas. ¿Me puede sugerir un método mejor? Gracias por tu ayuda.

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

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

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta