通过在Excel中执行查找(vlookup / hlookup)来提取值

时间:2017-08-13 08:47:28

标签: excel indexing match vlookup lookup

这些是我表的列

**Type**                **long_name**       
route                    unamed road
locality                 yorkshire
sub-locality             printon
admin_area_level1        phase-II
PostalCode               490029
street_number            18
route                    JC park
neighborhood             behind A- Cabin
Sub-locality             leston k
Sub-locality1            park A
Sub-locality2            St Ben
locality                 Breach Candy
admin_area_level_2       Dun Street
admin_area_level_1       Parkton
country                  USSR
postal_code              587644

我想使用HLOOKUP或任何其他查找方法水平查找列,以便我的输出变为

#Street_number  #route          #intersection      #country    #admin_area_level_1 
NA             unamed road    NA                NA         phase-II  
18             JC Park        NA                USSR       Parkton
#admin_area_level_2    #admin_area_level_3    #locality     #ward    #sub-locality     
NA                    NA                    yorkshire    NA      NA   
Dun Street            NA                    Breach Candy NA     leston k 
#premises    #PostalCode
NA          490029
NA          587644

为此,我尝试使用HLOOKUP,但似乎没有工作,它将所有值赋予 #NA

=HLOOKUP(Sheet1!J1,'sheet2'!I:J,2,FALSE)

关于如何做到这一点的任何建议。非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

在此回答中,针对输入数据遵循的规则提出了一些问题。这些观点可能会在评论中提出,但会严重影响500个字符的限制。

下图显示了输入数据和输出中所需的列列表。

Input Data and Columns for Output

在此图片中暂时忽略列E和列G:H - 我稍后会再回来。

输入表的列D中的值(标记为Rec.No)表示将插入Long_name值的输出表的记录号。我已手动将值插入此列。我稍后将返回自动计算这些值。

给定Rec.No值可以计算输出表,如下所示。

Calculated Output Table

在两张图片中,蓝色显示的单元格为公式。

毫无疑问,这种输出计算有不同的方法,我使用了以下方法。

  1. 我手动为Output表的每一行分配了Rec. No.列中的记录编号(标记为J)。
  2. KL是几个辅助列。列K(标记为Starts)标识输入数据中的哪一行数据(请参见第一张图片)提供当前输出记录的初始行。列L(标记为Num.Rows)表示输入表的行数对当前输出记录的贡献。单元格K4中的公式为=MATCH(J4,D$4:D$19,0),而L4中的公式为=COUNTIF(D$4:D$19,J4)
  3. 辅助列值在两个OFFSET()函数中用于定义列B(标记为Type)和C(标记为Long_name)的范围每个输出记录对应的输入数据。对于第一个输出记录,这些范围分别为OFFSET($B$3,$K4,0,$L4,1)OFFSET($C$3,$K4,0,$L4,1),它们分别对应$B$4:$B$8$C$4:$C$8 - 即列B和{{{{}}}的部分1}}表示C列中Rec.No为1的行。
  4. 在单元格D中,M4函数用于标识单元格MATCH()中的标题出现在第一个{{1}定义的M3值范围内的位置(范围Type)。结果在OFFSET()函数中使用,涉及第二个$B$4:$B$8范围(INDEX()),以标识与标题匹配的OFFSET()值。单元格$C$4:$C$8中的公式为 Long_name如果M4中的标题不匹配,公式将返回=INDEX(OFFSET($C$3,$K4,0,$L4,1),MATCH(M$3,OFFSET($B$3,$K4,0,$L4,1),0))
  5. #N/A中的公式可以复制到M3K4K5以及L4L5。 / LI>

    需要注意几个数据问题:

      输入中的
    • 单元格M4已更正为M4:X5(从D7)和单元格admin_area_level_1admin_area_level1(来自D8)确保输入数据与输出中使用的标题之间的一致性。
    • 输出的第一条记录的postal_code中的结果已计算为PostalCode(请参阅单元格sub-locality),而不是OP中指定的printon。计算结果似乎与输入数据更好地对齐。

    到目前为止一切顺利,但上面的所有内容都依赖于输入数据的V4列中手动插入的值。如果要将方法扩展到更大的输入数据集 - 太大而无法考虑手动分配该列 - 那么就有一些问题需要处理。

    首先,对于每个输出记录,输入数据的行数明显不同,因此基于简单计数的方法不能用于分配NA列。

    其次,返回第一张图片,标有Rec.No的列Rec.No会显示输出的哪一列与E值匹配。列表Col.No中的表格中列出了输出列,单元格Type中的公式为G:H。此E4列显示输入数据中=MATCH(B4,$H$4:$H$15,0)值的排序与输出中这些值的排序不同。例如,在输出列中Col.No出现在列Type之后(右侧)的几列,而输入数据localityadmin_area_level_1出现之前Type。这意味着无法使用基于假设输入数据中locality值的顺序遵循输出列标题的顺序的方法。

    实际上,如果没有OP中指定的输出的好处,就无法确定输入数据的第6行(admin_area_level_1Type)是否实际属于第一个或第二个输出记录。

    OP中缺少的是有关Type值排序的输入数据中遵循的规则的信息 以及强制/可选类型的任何规则。在更明确地规定这些规则之前,在一般情况下,不可能自动实施解决方案。