在指定的列中查找值
我最近想要做的事情很晚,而且不知道该怎么做,在我作为parameter passing给我的一篇专栏文章中,这是MATCH。 本质上,我有一个二维数组,我想能够find第n列中给定值的第一次出现,对于任何给定的值为n,并返回它出现在的行号。 或者(或多或less地等价),我想能够在列中search给定的列标题。 有没有办法做到这一点?
实际上,我想模拟不存在的函数=MATCH(lookup_value,lookup_array,lookup_column,[match_type])
我使用INDIRECT,一个可怕的bodge工作kludged工作,但冒犯了我可怕的。 =MATCH(lookup_value,INDIRECT("R"&<top of array>&"C"&<left of array>+<column reference>&":R"&<bottom of array>&"C"&<left of array>+<column reference>,FALSE),FALSE)
这个公式应该适合你,并会避免间接。 任何时候你可以避免使用间接,我build议这样做。
=MATCH(lookup_value,INDEX(lookup_array,0,MATCH(lookup_header,array_headers,0)),0)
如果您不按列标题查找列,只需要列号,则会变得更简单:
=MATCH(lookup_value,INDEX(lookup_array,0,column_number),0)
你可以做这样的事情:
Set findCell = ActiveSheet.Range("A:Z").Find(What:="term_to_search")
将根据您的search词select一个标题。
Set range = ActiveSheet.Range(findCell, findCell.Offset(DEF_MAX_ROWS, 0))
设置一个范围,将从整个列中的标题search。
对于超过Z
列引用,可以切换表示法(Excel选项,公式,处理公式和检查R1C1引用样式),并假定要查找的值位于'A1'(R1C1),列编号为'A2'( R2C1)适用:
=MATCH(R1C1,INDIRECT("C"&R2C1,0),0)
在保存一些将两个或三个字符的string转换为相关列号的复杂性。
假设我们有一个二维数组: B3:E17 ,我们希望在这个数组的第三列中findHappiness 。
在G1中input:
B3:E17
在G2中input:
3
在G3中input:
=ADDRESS(ROW(INDIRECT(G1)),COLUMN(INDIRECT(G1))+$G$2-1) & ":" & ADDRESS(ROW(INDIRECT(G1))+ROWS(INDIRECT(G1))-1,COLUMN(INDIRECT(G1))+$G$2-1)
这将显示第三列的地址。 然后在G4中input:
=MATCH("Happiness",INDIRECT(G3),0)
例如:
您可以使用INDIRECT
函数在公式中指定范围。 所以,例如,如果你把你想要在单元格A75中search的列的字母名称,你可以使用:
=MATCH("Value_To_Match", INDIRECT(A75 & ":" & A75), 0)
因此,如果A75中的值是G
,那么在INDIRECT
调用中build立的string是G:G
, MATCH
将通过G列查找“Value_To_Match”并返回find的行号。
使用这个想法,你可以在A75中input一个公式,为你想要search的列产生列名称。 例如,如果列标题全部位于第1行,并且要search的标题位于A74中,则可以执行以下操作:
=CHAR(MATCH(A74, 1:1, 0) + 64)
使用CHAR
函数将数字转换成ASCII字符,所以65变成A,66变成B等等。注意,这只有在你没有经过Z的列时才有效。你需要一个更挑剔的公式来做正确的AA等东西
您可以通过使用R1C1表示法来克服处理列字母的烦恼,您可以通过向INDIRECT
expression式添加第二个参数FALSE
来激活这些表示法 。 现在,而不是用一个字母来指定您的列,您将使用数字来指定它。 这简化了A75中的寻像器:
=MATCH(A74, 1:1, 0)
还有整个MATCH
的INDIRECT
expression式:
=MATCH("Value_To_Match", INDIRECT("C" & A75, FALSE), 0)