Excel Power Query:从具有多个未修复工作表的多个未修复文件中获取数据

时间:2019-03-10 06:53:42

标签: excel vba powerquery

  1. 每个image1的文件夹中有不固定数量的excel文件。
    (路径可能会更改,正在从任何单元格中寻找解决方案作为动态路径)
  2. 每个文件中有不固定的张数(最多10张)。
  3. 每个工作表都有大约10到40个顶部行作为交易数据。
  4. 交易数据后有两个汇总-数量和金额(未固定的起始行)3a,3b,3c
    我正在寻找图像4a,4b的最终输出。使用电源查询。

Folder path of excel file; it may change.

Sample data sheets on file

Final output needed ( 2 separate sheets with two tables)

All pix in one

1 个答案:

答案 0 :(得分:0)

很抱歉,回复的时间很长,但是涉及很多步骤,我还提供了很多屏幕剪辑。我相信此解决方案可以满足您的需求。

我从文件夹中的文件开始:

enter image description here

Feb-19.xlsx包含两个标签:

1. DE: 2. CA:

Jan-19.xlsx包含三个标签:

1. US: 2. UK: 3. CH:

我打开一个新的Excel文件,然后单击“数据”>“新查询”>“从文件”>“从文件夹”,然后键入或使用“浏览”按钮导航到包含文件的文件夹的位置。 (当我导航到OneDrive文件夹时,我的路径中包含SkyDrive.old,但这是您在上面的第一张图片中看到的OneDrive文件夹。)然后单击“确定”:

enter image description here

然后单击“转换数据”:

enter image description here

出现:

enter image description here

我单击“主页”>“管理参数”(带有下拉箭头的单词)>“新参数”,然后像这样进行设置,然后单击“确定”。

enter image description here

单击“确定”后,将显示:

enter image description here

您可以看到我输入了包含文件的文件夹的路径。如果我想使用其他文件夹路径,可以稍后更改此参数值。

为此,我将在左窗格中单击enter image description here。单击它会将我带到同一位置,我可以在其中编辑值。

现在,我单击已经开始的查询。当前是左窗格中唯一的其他项目。单击它可以将其重新显示在屏幕上:

enter image description here

我在编辑栏中编辑文本,将"C:\Users\MARC_000\SkyDrive.old\Test"替换为FolderPath。结果是完全相同的表,但是编辑栏上有Folder.Files(FolderPath)。现在,查询使用的是参数值,而不是使用硬编码的引用。

然后,只是因为我想要,将查询的名称更改为“ Main Query”。您可以通过单击左窗格中的查询,然后在右窗格顶部的“属性”中更改名称来实现。

接下来,我同时选择 Content Name 列,然后依次选择Home> Remove Columns(带有下拉箭头的单词)> Remove Other Columns to得到这个:

enter image description here

然后,我单击enter image description here按钮以合并 Content 列中的文件,这将弹出此弹出窗口。然后,我仅单击文件夹,然后单击确定。

enter image description here

现在,左窗格中还有更多查询条目:

enter image description here

我点击新查询从Test转换样本文件,然后看到以下内容:

enter image description here

我选择 Data Item 列,然后依次选择Home> Remove Columns(带有下拉箭头的单词)> Remove Other Columns以获得以下内容:

enter image description here

---在下面的答案中查看答案的答案---

然后我单击enter image description here按钮以展开 Data 列中的表,这将弹出此弹出窗口。然后,我清除“使用原始列名作为前缀”旁边的复选框,然后单击“确定”。

enter image description here

---从答案底部的编辑返回到继续---

哪个产生这个:

enter image description here

然后我从 Column1 列中过滤出空值。 (单击列顶部的向下箭头,然后取消选择null。)

然后我单击添加列>条件列,并按如下所示进行设置,然后单击确定:

enter image description here

哪个产生这个:

enter image description here

然后,我选择新的 Custom 列,然后单击“转换”>“填充”>“向下”以获取此信息:

enter image description here

然后我从 Column1 列中过滤出“摘要(金额)”和“摘要(单位)”条目。 (单击列顶部的向下箭头,然后取消选择“汇总(金额)”和“汇总(单位)”。)这将产生以下结果:

enter image description here

现在,我回到主查询。换句话说,单击左侧窗格中的Main Query。会有一个“问题”。我需要做的就是删除右窗格中的最后一个“应用的步骤”:“更改的类型”。一旦删除,一切都很好,我看到了:

enter image description here

但是我也想要文件名,因此我单击了当前选定的步骤之前的“应用的步骤”,选择了“从测试扩展的转换文件”,因此我单击了“删除其他列1”,然后在编辑栏,我将代码从Table.SelectColumns(#"Filtered Hidden Files1", {"Transform File from Test"})更改为Table.SelectColumns(#"Filtered Hidden Files1", {"Transform File from Test", "Name"})。这会添加 Name 列,我看到了:

enter image description here

然后,我回到最后一个应用步骤,即“来自测试的扩展转换文件”,现在我看到了:

enter image description here

然后单击“变换”>“将第一行用作标题”并获得此信息:

enter image description here

然后我将 DE 列重命名为 Sheet ,将 Feb-19.xlsx 列重命名为 File Name

然后我从客户名称列中过滤掉“客户名称”条目。 (单击列顶部的向下箭头,然后取消选择“客户名称”。)这将产生以下结果:

enter image description here

然后我对各列重新排序以获取此信息:

enter image description here

然后,选择摘要类型列,然后单击“变换”>“分组依据”,并填写如下弹出框,然后单击“确定”:

enter image description here

产生以下内容(这是您的两个表):

enter image description here

因此,然后我在左窗格中的Main Query上单击鼠标右键,然后选择Reference。这给了我一个名为Main Query(2)的新查询,该查询的表看起来像上面的最后一个图像。现在,我单击“摘要(单位)”行中的表,并获取以下信息:

enter image description here

然后,我对“摘要(金额)”重复该过程:右键单击左窗格中的“主查询”,选择“引用”,然后单击新查询的“摘要(金额)”行中的表以获取此信息: / p>

enter image description here

最后,我将两个最新的查询重命名为“摘要(单位)”和“摘要(金额)”

关闭并加载时,这将为您提供三个新的工作表。每个查询一个。如果您不想要用于主查询的工作表(如果您只想要摘要(单位)和摘要(金额)),则在关闭并加载并返回Excel后,,单击“数据”。 >显示查询。然后在右窗格中右键单击“主查询”,然后单击“加载到”,然后选择“仅创建连接”,然后单击“加载”。当您收到数据丢失警告时,请单击“继续”。

最后一件事:不要将具有此查询的Excel工作簿及其从中获取信息的文件放在源文件夹中。分开放置。

---编辑以容纳具有交易信息的顶部行---

我要添加以下内容来处理汇总表上方可能包含信息行的工作表。这是我想出的:

在上面的答案中,我说了以下步骤之后,立即开始:选择 Data Item 列,然后选择主页>删除列(下拉箭头)>删除其他列以获取此信息:

enter image description here

我现在添加另一列(“添加列”>“自定义列”),并按如下所示进行设置:

enter image description here

这会复制 Data 列,但会在每个嵌套表中添加一个索引,如下所示:

enter image description here

然后我添加另一列以确定与每个嵌套表中每个摘要的开头相关的索引号:

enter image description here您可能要搜索“摘要(”或“摘要(单位)”,而不是“摘要”

请注意,它的结构与上一列相似,因为它基本上是 Indexed 列的重复,只是在每个嵌套中添加了 Summary Index 列桌子。

enter image description here

然后,我再添加一个类似的列,以确定每个嵌套表的第一个Summary表的第一行的索引位置:

enter image description here

得到这个:

enter image description here

然后我再添加一列这样的内容,以删除每个嵌套表中不需要的顶部行:

enter image description here

哪个给我这个:

enter image description here此图中选择的表是顶部具有额外信息的表。该信息现在消失了。。)

然后,我选择 TopRowsRemoved Item 列,然后选择“首页”>“删除列”(带有下拉箭头的单词)>“删除其他列”以获取此信息:

enter image description here

然后,我单击enter image description here按钮以展开 TopRowsRemoved 列中的表(而不是我们之前做过的 Data 列),弹出的弹出窗口看起来与我们使用 Data 列时的弹出窗口完全相同。然后,我清除“使用原始列名作为前缀”旁边的复选框,然后单击“确定”。

enter image description here

然后,我删除右侧窗格中“应用的步骤”下的旧的“扩展数据”步骤。如果我不删除扩展数据步骤,则会收到一条错误消息,因为它正在寻找 Data 列,该列不存在。这次我没有使用 Data 列。相反,我使用了 TopRowsRemoved 列。

在这一点上,我之前回答的其余部分仍然适用,因此请回到上面我写的地方---从答案底部的编辑返回到继续---。

这是我的“主查询”查询的M代码:

let
Source = Folder.Files(FolderPath),
#"Removed Other Columns" = Table.SelectColumns(Source,{"Content", "Name"}),
#"Invoke Custom Function1" = Table.AddColumn(#"Removed Other Columns", "Transform File from Test", each #"Transform File from Test"([Content])),
#"Filtered Hidden Files1" = Table.SelectRows(#"Invoke Custom Function1", each [Attributes]?[Hidden]? <> true),
#"Removed Other Columns1" = Table.SelectColumns(#"Filtered Hidden Files1", {"Transform File from Test", "Name"}),
#"Expanded Transform File from Test" = Table.ExpandTableColumn(#"Removed Other Columns1", "Transform File from Test", {"Column1", "Column2", "Column3", "Column4", "Column5", "Item", "Custom"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Item", "Custom"}),
#"Promoted Headers" = Table.PromoteHeaders(#"Expanded Transform File from Test", [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"CustName", type text}, {"Opening", type any}, {"In", type any}, {"Out", type any}, {"Closing", type any}, {"DE", type text}, {"Summary (Units)", type text}, {"Feb-19.xlsx", type text}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"DE", "Sheet"}, {"Feb-19.xlsx", "File Name"}, {"Summary (Units)", "Summary Type"}}),
#"Filtered Rows" = Table.SelectRows(#"Renamed Columns", each ([CustName] <> "CustName")),
#"Reordered Columns" = Table.ReorderColumns(#"Filtered Rows",{"File Name", "Sheet", "CustName", "Opening", "In", "Out", "Closing", "Summary Type"}),
#"Grouped Rows" = Table.Group(#"Reordered Columns", {"Summary Type"}, {{"AllData", each _, type table}})
in
#"Grouped Rows"

这是我的“从测试转换样本文件”查询的M代码,所做的更改是为了容纳具有事务信息的顶部行:

let
Source = Excel.Workbook(#"Sample File Parameter1", null, true),
#"Removed Other Columns" = Table.SelectColumns(Source,{"Data","Item"}),
#"Added Index" = Table.AddColumn(#"Removed Other Columns", "Indexed", each Table.AddIndexColumn([Data],"Index", 0, 1)),
#"Added Custom1" = Table.AddColumn(#"Added Index", "SummaryIndexed", each Table.AddColumn([Indexed],"Summary Index", each try if Text.StartsWith([Column1],"Summary") then [Index] else null otherwise null)),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "IndexMins", each List.Min([SummaryIndexed][Summary Index])),
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "TopRowsRemoved", each Table.RemoveFirstN([SummaryIndexed],[IndexMins])),
#"Removed Other Columns1" = Table.SelectColumns(#"Added Custom3",{"TopRowsRemoved", "Item"}),
#"Expanded TopRowsRemoved" = Table.ExpandTableColumn(#"Removed Other Columns1", "TopRowsRemoved", {"Column1", "Column2", "Column3", "Column4", "Column5", "Index", "Summary Index"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Index", "Summary Index"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded TopRowsRemoved", each ([Column1] <> null)),
#"Added Custom" = Table.AddColumn(#"Filtered Rows", "Custom", each if Text.StartsWith([Column1],"Summary") then [Column1] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Filtered Rows1" = Table.SelectRows(#"Filled Down", each ([Column1] <> "Summary (Amount)" and [Column1] <> "Summary (Units)"))
in
#"Filtered Rows1"