在指定的列中查找值

我最近想要做的事情很晚,而且不知道该怎么做,在我作为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:GMATCH将通过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表示法来克服处理列字母的烦恼,您可以通过向INDIRECTexpression式添加第二个参数FALSE来激活这些表示法 。 现在,而不是用一个字母来指定您的列,您将使用数字来指定它。 这简化了A75中的寻像器:

 =MATCH(A74, 1:1, 0) 

还有整个MATCHINDIRECTexpression式:

 =MATCH("Value_To_Match", INDIRECT("C" & A75, FALSE), 0)