2014-11-28 3 views
4

Tim이 clsMatrix 클래스에서 행 키 목록을 추출 할 수 있습니까? 이 같은 ...Excel vba 중첩 된 사전 - 항목 액세스

Sub KEYS() 
Dim KEY_LIST As Variant 

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

End Sub 

나는 다음 테이블을 통해주기는 특정 기준을 충족하는 데이터의 하위 집합을 추출 할 수 있습니다.

Tim, 코드는 하나의 2D 행렬에서 잘 작동하지만 프로젝트가 작동하려면 참조 할 5 개의 테이블이 있어야합니다. if ... then else 문을 사용해 보았지만 어색하고 작동하지 않습니다. BOOK 테이블의 데이터를 찾는 두 번째 단계에서 행 및 col 사전 참조를 찾을 수 없습니다. 더 나은 방법을 제안 해 주시겠습니까? 당신의 도움을 주셔서 감사합니다.

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 
+0

다차원이란 2 차원 이상을 의미합니까? –

답변

6
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 

EDIT : I 빨리 다음 행/열 헤더를 이용하여 2-D 어레이에 액세스를 처리하기를 원한다면 중첩 된 사전을 사용하지 않고 두 개의 고유 한 사전을 사용하여 각 차원 ("행 레이블"사전 및 "열 레이블"중 하나)에 키를 입력하는 경향이 있습니다.

하면 간단한 수업이 마무리 수

'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 ") -

EDIT2가 : 클래스 코드 변경없이)

과 (여러 다른 테이블을 관리하는 방법을 보여주기 위해 몇 가지 변경을
'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 
+0

Tim, 정확히 내가 찾고 있던 것을 감사드립니다. – Zeus

+0

Tim 다른 문제가 발생했습니다. 가능한 경우 질문을 다시보십시오. 최종 목표는 다차원 배열에서 데이터를 가져 와서 행 및 열 머리글을 사용하여 값/항목을 참조하는 것입니다. – Zeus

+0

감사합니다. 나는 당신 (또는 다른 누구)이 관심을 가지고 있다면 코드를 작동시켰다. 그러나 클래스 모듈 사용에 대한 귀하의 제안은 더 간단하고 우수합니다. – Zeus