Excel VBA函数在单元格范围内查找值
Posted
技术标签:
【中文标题】Excel VBA函数在单元格范围内查找值【英文标题】:Excel VBA function to lookup value in a Cell range 【发布时间】: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中设法做到了一段时间。基本上从传递的表中解析第一行和第一列。在每个中进行索引查找,然后从数据中返回它们的交集 【参考方案1】:应该这样做:
Public Function VBAlookup(RowName As String, ColName As String, Table As Range) As String
Dim RowNum As Integer
Dim ColNum As Integer
VBAlookup = ""
For RowNum = 1 To Table.Rows.Count
If Table.Cells(RowNum, 1).Text = RowName Then
For ColNum = 1 To Table.Columns.Count
If Table.Cells(1, ColNum).Text = ColName Then
VBAlookup = Table.Cells(RowNum, ColNum).Text
End If
Next ColNum
End If
Next RowNum
End Function
请注意,我没有进行任何错误检查等,这是一个很好的做法!
【讨论】:
效果很好。表中的信息可以是数值、日期或文本。 AS 当前编写的函数将值作为文本返回。试图将函数定义为返回一个对象,并更改返回值的行以将其作为一个对象来执行。试图调试自己。也许你有一个快速的建议? 在函数 def 行更改为变体,并从返回行中删除了 .text 函数不能很好地扩展......我现在从 10 个不同的单元格中调用它,并且很小(10x4 表)。似乎擅长重新计算通过电子表格多次。所以函数被以指数方式调用!!! 我知道这是怎么发生的,那会!!糟透了!! - 在不知道您的确切情况的情况下,我会说一种可能的加快速度的解决方案是,例如,更改电子表格以包含一个名为“Calculate_My_UDF”的宏,它计算您的 VBALookup 单元格并简单地输入计算值而不是将其保留为易失性函数(例如,您可以在单元格注释中使用公式来标记这些单元格)...这具有加快电子表格速度的优势,但是您会丢失动态计算...只是一个可能的想法...... 也许也可以上网看看——我发现这个话题讨论了一些解决方案,例如:***.com/q/1291605/1693085——不管怎样,让我知道......以上是关于Excel VBA函数在单元格范围内查找值的主要内容,如果未能解决你的问题,请参考以下文章
EXCEL VBA - 根据单元格范围和字符串创建动态下拉列表[关闭]
VBA excel Target.Address =单元格范围