Excel 比较两个不同工作表中的列并附加匹配的数据
我希望合并两个数据源 来源1 Sheet1上的数据源包含两列:AccountID和Cost。源位于单元格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”在表1中,但不在表2中。年份值(表1!D1)包含2020年。最终结果将在Sheet2中添加一个新的行,其中AccountID为“1234”,相关成本值为2020年 示例#2 AccountID“1234”在第1页和第2页上。表2中记录的年份值为2019年。表1上的记录与2020年相关(表1!D1单元格值)。最终结果将有两行表2中AccountID为“1234”的数据,一行用于2019年记录,另一行用于2020年记录,如表1数据源中所示。后者不包括位置、电话或电子邮件类型值,因为它们没有在任何地方指定 图像 第1页: 第2页: 表2从表1填充数据后:Excel 比较两个不同工作表中的列并附加匹配的数据,excel,vba,append,compare,powerquery,Excel,Vba,Append,Compare,Powerquery,我希望合并两个数据源 来源1 Sheet1上的数据源包含两列:AccountID和Cost。源位于单元格A3:B3中(数据行从A4开始)。数据持续1到N行。辅助单元格包含要在此源中使用的所有记录的年份值。它在D1单元 来源2 Sheet2上的数据源包含6列,范围为A1:F1(数据从第2行开始):年份、帐户ID、位置、电话、电子邮件类型和成本。数据持续1到N行 我希望根据每个数据范围(Sheet1列A,Sheet2列B)的AccountID连接两个表的记录,其中年份(来源于Sheet1!D1)添加
这可以通过电源查询来实现。以下查询假设您已使用数据创建了表,在Sheet1上命名为“Table1”,在Sheet2上命名为“Table2”。这将需要5个单独的查询:2个用于数据表,一个函数,一个合并表,以及一个用于组合数据的最终查询。对于所有这些,添加一个新的空白查询(数据选项卡>获取数据>来自其他源>空白查询)。您还需要为Sheet1上标题为“YearValue”的单元格D1创建命名范围 年值函数 将以下代码粘贴到高级编辑器中(Power Query>View>Advanced Editor)。将名称(右侧)更改为“YearValue” 仅关闭并加载到连接 表1查询 将以下代码粘贴到高级编辑器中(Power Query>View>Advanced Editor)。将名称(右侧)更改为“Table1” 仅关闭并加载到连接 表2查询 将以下代码粘贴到高级编辑器中(Power Query>View>Advanced Editor)。将名称(右侧)更改为“Table2” 仅关闭并加载到连接 合并表查询 将以下代码粘贴到高级编辑器中(Power Query>View>Advanced Editor)。将名称(右侧)更改为“MergeTable”
let
Source=Table.FromColumns({List.Distinct(List.Select(Table1[AccountID]&Table2[AccountID],每个unull))),键入Table[AccountID=text],
MergeQueries=Table.NestedJoin(源,{“AccountID”},表1,{“AccountID”},表1,JoinKind.LeftOuter),
ExpandedTable1=Table.ExpandTableColumn(合并查询,“Table1”,“AccountID”,“Cost”,“Year”},{“Table1.AccountID”,“Table1.Cost”,“Table1.Year”}),
MergeQueries2=Table.NestedJoin(ExpandedTable1,{“AccountID”},Table2,{“AccountID”},Table2,JoinKind.LeftOuter),
ExpandedTable2=Table.ExpandTableColumn(合并查询2,“表2”,“年”,“帐户ID”,“位置”,“电话#”,“电子邮件类型”,“成本”},{“表2.Year”,“表2.AccountID”,“表2.Location”,“表2.Phone#”,“表2.Email类型”,“表2.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”})
在里面
重命名列
仅关闭并加载到连接
合并表查询
将以下代码粘贴到高级编辑器中(Power Query>View>Advanced Editor)。将名称(右侧)更改为“CombineTables”
let
Source=Table.Combine({Table2,MergeTable}),
FilterRows=Table.SelectRows(源,每个([Year]null)),
SortRows=Table.Sort(FilterRows,{{“AccountID”,Order.升序})
在里面
索特罗斯
关闭并加载工作表(根据需要)
HTHDavid,我有一个解决方案,但问题因推理而结束,我不明白。我还没来得及在这个论坛上回答问题,不知道还能做些什么。
let
Source = Excel.CurrentWorkbook(){[Name="YearValue"]}[Content]{0}[Column1]
in
Source
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
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
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
let
Source = Table.Combine({Table2, MergeTable}),
FilterRows = Table.SelectRows(Source, each ([Year] <> null)),
SortRows = Table.Sort(FilterRows,{{"AccountID", Order.Ascending}})
in
SortRows