我想使用 Application.Match 来查找表的一行并将其存储在数组中。我让它用于搜索单个列:
With Worksheets("Data").ListObjects(tblName)
myArray = Application.Transpose(Application.Transpose(.ListRows( _
Application.Match(searchTerm, .ListColumns(1).DataBodyRange, 0 _
).Range)))
End With
但是我想用这个子查看的一些表格可能在第 2 列中有searchTerm
,所以我想扩展Application.Match" to the 1st and 2nd columns. I've heard about using
中提到的范围。调整大小(,2(' 但我无法让它工作。今天我发现了结构化引用,我可以像这样引用列:
Worksheets("Data").Range("tblName[[Column1]:[Column2]]").Activate
但这需要我通过标题名称来引用列,这些标题名称在表之间有所不同,并且我希望能够使用它们的编号。有谁知道如果在第一列中找不到searchTerm
则不涉及循环的解决方案?
更新:
提供有关我的问题的更多信息。
用户选择一个包含字符串的单元格。字符串在数组
instruction
中分为 2 个元素。instruction(0) =
我要查找的表的名称。instruction(1) =
我正在寻找的术语。该术语可放在第1栏或第2栏中。然后,包含
instruction(1)
的表instruction(0)
行将加载到另一个名为interactData
的数组中每个表都有自己的 sub,它使用
interactData
的元素来做不同的事情。
这是我能够想到的解决方法:
Dim headers As Variant
headers = Application.Transpose(Application.Transpose(Data.Range(instruction(0) & "[#Headers]")))
interactData = Application.Transpose(Application.Transpose(Data.ListObjects(instruction(0)).ListRows( _
Data.Range(instruction(0) & "[[" & headers(1) & "]:[" & headers(2) & "]]").Find(instruction(1)).Row - 2 _
).Range))
Erase headers
我使用另一个数组headers
来存储列的名称,然后在Range().Find().Row
函数的结构化引用中使用了headers(1)
和headers(2)
。不幸的是,.DataBodyRange
这种方法效果不佳,所以我不得不从行结果中减去 2,因为表格的第 1 行位于工作表的第 3 行。