Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 比较两个不同工作表中的列并附加匹配的数据_Excel_Vba_Append_Compare_Powerquery - Fatal编程技术网

Excel 比较两个不同工作表中的列并附加匹配的数据

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)添加

我希望合并两个数据源

来源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填充数据后:


这可以通过电源查询来实现。以下查询假设您已使用数据创建了表,在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.升序})
在里面
索特罗斯
关闭并加载工作表(根据需要)


HTH

David,我有一个解决方案,但问题因推理而结束,我不明白。我还没来得及在这个论坛上回答问题,不知道还能做些什么。
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