MS Excel:如果查找数组太大,“MATCH()”找不到包含文本的单元格

我正在创build一个庞大而复杂的时间表,我想要一个视图将时间表显示为一个白天的网格,另一个视图允许从一个按字母顺序排列的名单中按名称查找演讲者。 我在这里发布了一个简化的例子:

http://www.calpoly.edu/~epearse/excel-issue.png

在字母表中,date和时间应该由使用MATCH的函数填充。 举个例子,我手动input了我想为琼斯发生的事情。

我不能让MATCH()正确地在时间表中find发言者的名字。 没有隐藏的字符:请注意在单元格D15中Excel正确识别G2和C7是相同的。

这里是如果我把各种代码放在H2中会发生什么事情:

  • = MATCH(G2,$ A $ 1:$ D $ 9)导致#N / A
  • = MATCH(G2,$ C $ 2:$ C $ 9)导致#N / A
  • = MATCH(G2,$ B $ 7:$ D $ 7)结果为2(正确!)
  • = MATCH(G2,$ A $ 7:$ D $ 7)导致#N / A

我想将= MATCH(G2,$ A $ 1:$ D $ 9)放入H2中,然后将单元格填充到H25,并用Excel表示相邻名称出现的那一天的列号,然后使用INDIRECT或者把这个数字转换成星期几。

可能是由于数据types不同,在search数组中包含列A会导致问题。 作为一个实验,我把第一列写入TEXT,在这种情况下= MATCH(G2,$ A $ 7:$ D $ 7)错误地返回1!

即使如此,我也不明白为什么$ B $ 7:$ D $ 7可以工作,但是既不是$ C $ 2:$ C $ 9也不是$ B $ 7:$ D $ 8。

任何解决方法或替代策略将不胜感激,谢谢。

要做到这一点,你需要添加一些其他的逻辑来find正确的列和行。 这个AGGREGATE()函数完成这个工作。

日用:

=INDEX($A$1:$D$1,AGGREGATE(15,6,COLUMN($A$2:$D$9)/(($A$2:$D$9=G2)),1)) 

小时:

 =INDEX($A$1:$A$9,AGGREGATE(15,6,ROW($B$1:$D$9)/(($B$1:$D$9=G2)),1)) 

在这里输入图像说明

AGGREGATE()函数是在Excel 2010中引入的。


对于其他版本:

2010年之前,他们将需要数组公式:

天:

 =INDEX($A$1:$D$1,MIN(IF($A$2:$D$9=G2,COLUMN($A$2:$D$9)))) 

小时:

 =INDEX($A$1:$A$9,MIN(IF($B$1:$D$9=G2,ROW($B$1:$D$9)))) 

作为数组公式,在退出编辑模式时,必须用Ctrl-Shift-Enter确认。 如果正确完成,Excel将自动在公式周围放置一个数组公式。

最新的Office 360​​或在线:

天:

 =INDEX($A$1:$D$1,MINIFS(COLUMN($A$2:$D$9),$A$2:$D$9,G2)) 

小时:

 =INDEX($A$1:$A$9,MINIFS(ROW($B$1:$D$9),$B$1:$D$9,G2)) 

至于MATCH在这种情况下不起作用的原因:

MATCH()仅适用于单行或列,而不适用于多列/行范围。 它被设置为返回一个等于find的顺序位置的数字,因此必须是1维数组。

给定数据集的最有效方法是使用三个MATCH查询 – 每列一个。

对于这一天,看起来像这样:

 =IF(ISERROR(MATCH(G2,$B$2:$B$10,0)),"",$B$1)&IF(ISERROR(MATCH(G2,$C$2:$C$10,0)),"",$C$1)&IF(ISERROR(MATCH(G2,$D$2:$D$10,0)),"",$D$1) 

对于时间,看起来像这样:

 =INDEX($A$2:$A$10,IFERROR(MATCH(G2,$B$2:$B$10,0),0) + IFERROR(MATCH(G2,$C$2:$C$10,0),0) + IFERROR(MATCH(G2,$D$2:$D$10,0),0)) 

…但事实是被告知,在这个小数据集上,你不会注意到这个方法与Scott的AGGREGATE方法有任何的性能差异。 在大数据集(成千上万行),你可能会。

请注意,您的初始方法失败的另一个原因是您没有指定MATCH的第三个参数,所以Excel使用默认值,假定您的列表数据按字母顺序sorting。 你几乎永远不想忽略这个论点,而且你几乎总是想使用FALSE(或者是Zero,这意味着FALSE到Excel)

用vba和listobjects替代解决scheme(你需要给出两个表的名字,如下面的代码所示) 表单截图 Public Sub makeAppointmentList()Dim aSheet As Worksheet Set aSheet = ThisWorkbook.Worksheets(“sheet1”)

 Dim aSchedule As ListObject Set aSchedule = aSheet.ListObjects("schedule") Dim anAppointmentList As ListObject Set anAppointmentList = aSheet.ListObjects("appointmentList") On Error Resume Next anAppointmentList.DataBodyRange.Delete On Error GoTo 0 Dim c As ListColumn Dim r As ListRow Dim newRow As ListRow For Each c In aSchedule.ListColumns For Each r In aSchedule.ListRows If c.Index > 1 And Intersect(c.Range, r.Range) <> "" Then Set newRow = anAppointmentList.ListRows.Add Intersect(newRow.Range, anAppointmentList.ListColumns("Name").Range).Value = Intersect(c.Range, r.Range) Intersect(newRow.Range, anAppointmentList.ListColumns("Day").Range).Value = Intersect(c.Range, aSchedule.HeaderRowRange) Intersect(newRow.Range, anAppointmentList.ListColumns("Time").Range).Value = Intersect(aSchedule.ListColumns(1).Range, r.Range) End If Next r Next c anAppointmentList.Sort.SortFields.Clear anAppointmentList.Sort.SortFields.Add Key:=Intersect(anAppointmentList.HeaderRowRange, _ anAppointmentList.ListColumns("Name").Range) anAppointmentList.Sort.SortFields.Add Key:=Intersect(anAppointmentList.HeaderRowRange, _ anAppointmentList.ListColumns("Day").Range), _ CustomOrder:="Mon,Tue,Wed,Thu,Fri,Sat,Sun" anAppointmentList.Sort.SortFields.Add Key:=Intersect(anAppointmentList.HeaderRowRange, _ anAppointmentList.ListColumns("Time").Range) anAppointmentList.Sort.Apply Dim s As SortField End Sub