【发布时间】:2014-03-20 14:06:18
【问题描述】:
我知道如何在 Excel 中使用匹配和索引来做到这一点。我的电子表格有很多这样的查找,而且它必须易于审核。
在纯 excel 公式中很简单:
=index(match()...match()) of the table
虽然很容易做到,但如果桌子的大小发生变化等,它会让人头疼。公式的可读性也很差。表格、标题和列的命名范围使故障排除更加困难。
Col1 Col2 Col3
Row1 1 2 3
Row2 4 5 6
Row3 7 8 9
我将这个范围命名为行名和列名,分别作为第一行和第一列。
因此 Excel 变量将被称为 test_table。
想写一个我可以调用的 VBA 函数:
=VBAlookup("Row2", "Col2", test_table)
returns 5
目前我正在使用带有 DataNitro 和 pandas 的 python 来轻松地进行这种拼接。不擅长 VBA,所以用 VBA 写这个需要相当长的时间。当然,我不是第一个或唯一一个寻找此功能的人,但谷歌搜索似乎没有找到任何地方。
不想回答我自己的问题,但到目前为止我的解决方案(改编自@John Bustos 下面的回答)是:
Public Function VBAlookup(RowName As Variant, ColName As Variant, Table As Range) As Variant
Dim RowNum As Integer
Dim ColNum As Integer
VBAlookup = "Not Found"
For RowNum = 1 To Table.Rows.Count
If Table.Cells(RowNum, 1) = RowName Then
For ColNum = 1 To Table.Columns.Count
If Table.Cells(1, ColNum) = ColName Then
VBAlookup = Table.Cells(RowNum, ColNum)
End If
Next ColNum
End If
Next RowNum
End Function
这会以正确的格式获取任何类型的内容,如果值不在表中,也会给出一些反馈
【问题讨论】:
-
所以,只是为了理解,您的表格实际上将具有行和列标题,并且范围将被垂直和水平命名,还是只是一个或另一个?如果有,是哪一个??
-
只想传递整个表。根据定义,名称将位于第一行和第一列。否则,您必须在 excel 中命名三件事。想我在VBA中设法做到了一段时间。基本上从传递的表中解析第一行和第一列。在每个中进行索引查找,然后从数据中返回它们的交集