比较两张不同表格中的列,并附加匹配的数据

问题描述 投票:0回答:1

我有两个数据源,我希望将其合并。

数据源1

Sheet1的数据源包含2列。AccountID和Cost.数据源在A3:B3单元格(数据行从A4开始)。数据源在A3:B3单元格中(数据行从A4开始)。数据延续1至N行。一个辅助单元格包含了所有记录的年份值,以用于该源。它在单元格D1中。

来源2

Sheet2的数据源包含6列,范围为A1:F1(数据从第2行开始)。年份,账户ID,地点,电话号码,电子邮件类型,& 成本。数据持续1到N行。

我希望根据每个数据范围(Sheet1列A,Sheet2列B)的AccountID来连接两个表的记录,其中年份(来源于Sheet1!D1)被添加到Sheet2数据的所有记录中,通过AccountID匹配的记录在连接数据时包含包含的信息。

示例#1

AccountID "1234 "在Sheet1上,但在Sheet2上没有。年值(Sheet1!D1)包含2020年。最终的结果是在Sheet2中添加了一条新行,其中的账户ID为 "1234",相关的成本值,以及2020年。

例子#2

AccountID "1234 "在Sheet1上,也在Sheet2上。Sheet2上的记录的年值为2019年。Sheet1上的记录与2020年相关联(Sheet1!D1单元格值)。最终的结果是Sheet2中的AccountID为 "1234 "的数据有两行,一行是2019年的记录,一行是2020年的记录,在Sheet1数据源上找到。后者将不包括位置、电话号码或电子邮件类型值,因为它们没有在任何地方指定。

图片

第一张:

Sheet 1

Sheet 2:

Sheet 2

Sheet1数据填充后的Sheet2。

Sheet 2 after data is populated from sheet 1

excel vba append compare powerquery
1个回答
1
投票

这可以通过Power Query来完成。下面的查询假设你已经用你的数据创建了表,在Sheet1上命名为 "Table1",在Sheet2上命名为 "Table2"。这将需要5个单独的查询:2个数据的Tables,一个函数,一个合并表,和一个最后的查询来合并数据。对于所有这些,添加一个新的空白查询(数据选项卡> Get Data > From Other Sources > Blank Query)。你还需要为Sheet1上的单元格D1创建一个名为 "YearValue "的命名范围。

YearValue函数

将以下代码粘贴到高级编辑器中(Power Query > View > Advanced Editor)。将名称(在右边)改为 "YearValue"。

let
    Source = Excel.CurrentWorkbook(){[Name="YearValue"]}[Content]{0}[Column1]
in
    Source

关闭&只加载到连接。

表1查询

将以下代码粘贴到高级编辑器中(Power Query > View > Advanced Editor)。将名称(在右边)改为 "Table1"。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    TypeColumns = Table.TransformColumnTypes(Source,{{"AccountID", Int64.Type}, {"Cost", Int64.Type}}),
    AddYearColumn = Table.AddColumn(TypeColumns, "Year", each YearValue)
in
    AddYearColumn

关闭&只加载到连接。

表2查询

将以下代码粘贴到高级编辑器中(Power Query > View > Advanced Editor)。将名称(在右边)改为 "Table2"。

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    TypeColumns = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}, {"AccountID", Int64.Type}, {"Location", type text}, {"Phone#", type text}, {"Email type", type text}, {"Cost", Int64.Type}})
in
    TypeColumns

关闭&只加载到连接。

合并表查询

将以下代码粘贴到高级编辑器中(Power Query > View > Advanced Editor)。将名称(在右边)改为 "MergeTable"。

let
    Source = Table.FromColumns({List.Distinct(List.Select(Table1[AccountID]&Table2[AccountID],each _ <> null))},type table[AccountID = text]),
    MergeQueries = Table.NestedJoin(Source,{"AccountID"},Table1,{"AccountID"},"Table1",JoinKind.LeftOuter),
    ExpandedTable1 = Table.ExpandTableColumn(MergeQueries, "Table1", {"AccountID", "Cost", "Year"}, {"Table1.AccountID", "Table1.Cost", "Table1.Year"}),
    MergeQueries2 = Table.NestedJoin(ExpandedTable1,{"AccountID"},Table2,{"AccountID"},"Table2",JoinKind.LeftOuter),
    ExpandedTable2 = Table.ExpandTableColumn(MergeQueries2, "Table2", {"Year", "AccountID", "Location", "Phone#", "Email type", "Cost"}, {"Table2.Year", "Table2.AccountID", "Table2.Location", "Table2.Phone#", "Table2.Email type", "Table2.Cost"}),
    RemoveColumns = Table.RemoveColumns(ExpandedTable2,{"AccountID", "Table2.Year", "Table2.AccountID", "Table2.Cost"}),
    ReorderColumns = Table.ReorderColumns(RemoveColumns,{"Table1.Year", "Table1.AccountID", "Table2.Location", "Table2.Phone#", "Table2.Email type", "Table1.Cost"}),
    RenameColumns = Table.RenameColumns(ReorderColumns,{{"Table1.Year", "Year"}, {"Table1.AccountID", "AccountID"}, {"Table2.Location", "Location"}, {"Table2.Phone#", "Phone#"}, {"Table2.Email type", "Email type"}, {"Table1.Cost", "Cost"}})
in
    RenameColumns   

关闭&只加载到连接。

合并表查询

将以下代码粘贴到高级编辑器中(Power Query > View > Advanced Editor)。将名称(在右边)改为 "CombineTables"。

let
    Source = Table.Combine({Table2, MergeTable}),
    FilterRows = Table.SelectRows(Source, each ([Year] <> null)),
    SortRows = Table.Sort(FilterRows,{{"AccountID", Order.Ascending}})
in
    SortRows

关闭&amp;加载工作表(根据需要)。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.