在二维数组vba中搜索字符串

时间:2014-06-06 17:31:30

标签: excel vba

我有以下格式的2D数组。 (不确定如何格式化,以便以表格格式显示。第一列和第二列各为1个字符,第3列为2个字符)

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

我需要先在第一列中搜索“c”。如果找到了,我需要在第二个中搜索“2”并在第3个中找到相应的值。在这种情况下,我最终需要值“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

4 个答案:

答案 0 :(得分:1)

您也可以使用工作表公式执行此操作。例如,如果E1包含您的column1值;和B1你的column2值,尝试:

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

enter image description here

答案 1 :(得分:1)

我看到一个树状的结构,并想到xml,但为了保持简单,请使用词典......

在VBA编辑器中 - 使用“工具/参考”菜单添加对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

答案 2 :(得分:0)

尝试创建第三列,您可以在其中连接前三列的值,例如 D1 ,您将拥有=A1&B1&C1。接下来使用 vlookup 匹配。如果您没有指定完全匹配,那么如果 c 1 有多个条目,您将获得第一个或最后一个,具体取决于所使用的比较类型。

答案 3 :(得分:0)

不知道为什么你必须为列循环,因为你知道总是3 ... 所以这看起来更容易。

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

或者使用先天的excel对象进一步简化。

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