我有以下格式的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
答案 0 :(得分:1)
您也可以使用工作表公式执行此操作。例如,如果E1包含您的column1值;和B1你的column2值,尝试:
G2: =INDEX(ThirdColumn,SUMPRODUCT((FirstColumn=E1)*(SecondColumn=E2)*ROW(ThirdColumn)))
答案 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