2014-06-06 2 views
0

다음 형식의 2D 배열이 있습니다. (확실 그래서 테이블 형식으로 표시됩니다. 첫 번째와 두 번째 열은 1 자 각하고 3 열 2 자이를 포맷하는 방법) 처음에 내가 처음 "C"를 검색해야2 차원 배열의 문자열 검색 VBA

a 1 aa 
a 2 ab 
b 1 ba 
b 2 bb 
c 1 ca 
c 2 cb 
d 1 da 
d 2 db 
e 1 ea 
e 2 eb 
f 1 fa 
f 2 fb 

기둥. 그게 발견되면, 나는 두 번째에서 "2"를 검색하고 세 번째에서 해당 값을 찾아야합니다. 이 경우 마지막으로 "cb"값이 필요합니다. 여기

는 내가 지금까지 무엇을 가지고 있지만 내가 원하는 결과

가 표시되지 않기 때문에이 제대로 작동하지 않습니다
Public Sub Readinto_array() 

Dim TheArray As Variant 
Dim i As Long, j As Long, k As Long 
Dim found As Boolean 

TheArray = Range("G20:I31").Value 

found = False 
For i = LBound(TheArray) To UBound(TheArray) 
    For j = LBound(TheArray, 2) To UBound(TheArray, 2) 
     MsgBox TheArray(i, j) 
     If TheArray(i, j) <> "c" Then 
      Exit For 
     Else 
      If StrComp(TheArray(i, j + 1), "2", vbTextCompare) = 0 Then 
       MsgBox "found" 
       found = True 
       Exit For 
      End If 
     End If 
    Next j 
    If found Then 
     Exit For 
    End If 
Next i 

End Sub 
+0

나는 J + 1은 단순히 J + 2 할 필요가 생각합니다. – xQbert

답변

0

왜 항상 열이있는 지 알기 때문에 열을 반복해야하는 이유는 확실하지 않습니다. 이렇게 쉽게 보입니다.

Public Sub Readinto_array() 

Dim TheArray As Variant 
Dim i As Long 

TheArray = Range("G20:I31").Value 

For i = LBound(TheArray) To UBound(TheArray) 
    If TheArray(i, 1) = "c" And TheArray(i, 2) = "2" Then 
     MsgBox (TheArray(i, 3)) 
    End If 
Next i 

End Sub 

또는 선천적 인 엑셀 개체를 사용하여 더 단순화되었습니다.

Public Sub Readinto_array() 
    Dim MyRange As Range 
    Set MyRange = Range("G20:I31") 
    For Each cell In MyRange 
     If cell.Value = "c" And Cells(cell.Row, cell.Column + 1) = "2" Then 
     MsgBox (Cells(cell.Row, cell.Column + 2).Value) 
     End If 
    Next 
End Sub 
+0

감사합니다. 배열을 사용한 것은 이번이 처음입니다. 추측은 예제를 보면서 조금 혼란스러워했습니다. – rajeev

+0

@rajeev 문제 없습니다. 때로는 쉬운 방법이 있는지 잡초에서 물러나야합니다. 배열을 사용할 필요가 없었습니다. – xQbert

+2

데이터 범위가 매우 큰 경우 워크 시트 개체를 반복하는 것보다 배열을 사용하는 것이 더 빠릅니다. 둘 다 작동합니다. 단지 성능 문제 일뿐입니다. –

0

세 이전 칼럼에서 값을 연결에서 즉, 세 번째 열을 만들어보세요 D1이면 =A1&B1&C1이됩니다. 다음에 그것을 사용하십시오 vlookup 또는 과 일치합니다. 완전 일치를 지정하지 않은 경우 c 1에 대해 여러 항목이있는 경우 사용되는 비교 유형에 따라 처음 또는 마지막 항목을 가져옵니다.

1

워크 시트 수식을 사용하여이 작업을 수행 할 수도 있습니다. 예를 들어, E1에 column1 값이 포함 된 경우; 및 B1하여 2 열 값은 시도 :

G2: =INDEX(ThirdColumn,SUMPRODUCT((FirstColumn=E1)*(SecondColumn=E2)*ROW(ThirdColumn))) 

enter image description here

+0

나는 그곳에 있었던 기능을 알고 있었다. 당신의 기능을 볼 때까지 그것을 사용하는 실용적인 방법을 결코 발견하지 못했습니다. – rajeev

1

나는 구조와 같은 나무를보고 XML을하지만 간단한 사용하여 Dictionary 계속 생각 ... VBA를 편집기에서

를 - 사용 Tools/References 메뉴는 Microsoft Scripting Runtime에 대한 참조를 추가합니다.

는 사전을 생성하는 함수를 쓰기 :

Public Function LookErUp() As Dictionary 

    Dim i As Integer 
    Dim d As Dictionary 
    Set d = New Dictionary 

    Dim col1() As Variant 
    col1 = Array("a", "b", "c", "d", "e", "f") 

    Dim col2 As Dictionary 
    For i = 0 To UBound(col1) 
     Set col2 = New Dictionary 
     col2.Add 1, col1(i) & "a" 
     col2.Add 2, col1(i) & "b" 
     d.Add col1(i), col2 
    Next 

    Set LookErUp = d 

End Function 

당신은 사전에게 시험 절차를 사용하여 테스트 할 수 있습니다

Public Sub Test() 
    Dim ld As Dictionary 
    Set ld = LookErUp 

    If ld.Exists("c") Then 
     If ld("c").Exists(2) Then 
      MsgBox "Found " & ld("c")(2) 
     End If 
    End If 
End Sub 
+0

그것은 저에게 새로운 것입니다. 전에 그걸 몰랐어. 감사 – rajeev