我正在开发一个输入表,它将在同一张表中的多行上使用相同的数据验证和依赖数据验证。 我目前至少有 4 个 Power Queries,我想知道这是否是结合使用 Power Query 和 Excel 公式的最佳方法。
我已经替换了实际数据以保护有罪者。
查询 1 和 2 使用工作簿 1 中的数据,查询 3 和 4 使用工作簿 2 中的数据。 查询 3 和 4 是一个类似的过程,但针对不同的数据,因此我将它们排除在外,并将使用从如何正确执行查询 1 和 2 中获得的信息并进行相应调整。
我知道这是一张图片,而不是发布的数据。 我将在最后查看添加的基于文本的源数据。
我的所有源信息都排列在表格中,如下所示:
我使用内置功能区命令对上述信息执行组合电源查询,以在电源查询编辑器中生成以下内容:
然后我继续进行一些强大的查询操作来组合列并消除多余的列
然后为了促进一级依赖下拉列表,我旋转了一列,并提出了这个作为我在工作簿中生成的最终表,我可以使用间接函数、一些串联和之前的数据验证来引用相邻单元格的列。
为了获取项目列表,我基本上重复步骤 1-3,在步骤 4 中,我删除任务列并在工作簿中生成一个名为 Project_List 的表。 通过数据验证和间接,我只是做了一些类似的事情:
=indirect("Project_List")
我使用数据验证的输入表看起来像这样:
因此,排序和思考过程目前有效,但我认为应该有一种更好的方法,然后重复查询以格式化您已经提取过的信息。 怎么又拉了? 有没有办法吐出一个表,退到处理列表中,然后转身吐出另一个表? 这样就只拉取一次数据?
根据我的实际数据,我认为项目编号和任务编号的组合约为 16K 行。 我认为我的第一次尝试是 270K 行,但我制作了自己的工作簿并将该信息削减到 16K 行。 我还将感兴趣的独特项目编号列表减少到大约 500 个。
Project No | Project Name | Project Manager | Office
1 | ACME | Wyle E. Coyote | Arizona
2 | Hunting Season | Bugs Bunny | Albuquerque
3 | Earth Shatter Kaboom |Marvin The Martian | Mars
Project No | Task No | Task Name | Note
1 | A | Planning | uua
1 | B | Shipping | ytb
1 | C | Deployment | ccc
2 | A | Carrot Supply | aah
2 | D | Avoiding Elmer | yes
3 | B | Planning | kib
3 | C | Preparation | chh
3 | G | Implementation | kgi
3 | T | Detonation | tkt
Power Query M 生成Task_List
let
Source = Excel.Workbook(File.Contents("X:\Big Project List.xlsx"), null, true),
Projects_Tasks_Table = Source{[Item="Projects_Tasks",Kind="Table"]}[Data],
#"Changed Type" = Table.TransformColumnTypes(Projects_Tasks_Table,{{"Project Number", type text}, {"Project Name", type text}, {"Task Number", type text}, {"Task Name", type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Project Name"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "Custom", each [Task Number]&" - "&[Task Name]),
#"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Custom", type text}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Custom", "Task Np and Name"}}),
#"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns",{"Task Name"}),
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Columns1", {{"Project Number", type text}}, "en-CA"), List.Distinct(Table.TransformColumnTypes(#"Removed Columns1", {{"Project Number", type text}}, "en-CA")[#"Project Number"]), "Project Number", "Task Np and Name")
in
#"Pivoted Column"
Power Query M 生成Project_List
let
Source = Excel.Workbook(File.Contents("X:\ Big Project List.xlsx"), null, true),
Projects_Tasks_Table = Source{[Item="Projects_Tasks",Kind="Table"]}[Data],
#"Changed Type" = Table.TransformColumnTypes(Projects_Tasks_Table,{{"Project Number", type text}, {"Project Name", type text}, {"Task Number", type text}, {"Task Name", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each [Project Number]&" - "&[Project Name]),
#"Reordered Columns" = Table.ReorderColumns(#"Added Custom",{"Project Number", "Project Name", "Custom", "Task Number", "Task Name"}),
#"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Custom", "Project Number and Name"}}),
#"Removed Other Columns" = Table.SelectColumns(#"Renamed Columns",{"Project Number and Name", "Task Number", "Task Name"}),
#"Sorted Rows" = Table.Sort(#"Removed Other Columns",{{"Project Number and Name", Order.Descending}})
in
#"Sorted Rows"
我已将所有查询设置为在关闭时删除其数据并禁止后台刷新。
这里有一个使用公式和命名动态范围的快速建议:
XLOOKUP
代替 INDIRECT
OFFSET
省略空格,所以最后会有空格Project_List
在 K3
=tbProjects[Project No] & " - " & tbProjects[Project Name]
Task_List
在 L3
=IFNA(DROP(REDUCE("Task List",
tbProjects[Project No], LAMBDA(acc,cur,
VSTACK(acc, TRANSPOSE(
FILTER(tbProjectTasks[Task No] & " - " & tbProjectTasks[Task Name],
tbProjectTasks[Project No] = cur))))), 1), "")
数据验证
对于
B14
-
=Project_List
对于
C14
- 选择 C14
,固定列 B
和相对行 14
:
=XLOOKUP($B14,Project_List,Task_List)