PowerQuery 相对路径解决方案

本文讲解PowerQuery动态路径

几乎所有Power BI用户都知道,在Power BI Desktop里,如何从文件或文件夹获取数据, 但这里我提出一个你们不了解但也许会遇到的一个需求,如果文件或文件夹是相对路径而非绝对路径,要怎么办呢?

一个例子,报表需要从以下路径获取指定数据(假设我们不能使用Onedrive):

C:\Users\<your account name>\Documents

且该报表需要分享给其他报表开发者进行二次开发,按照常规做法,我们会使用:

File.Contents(<文件路径>)

来连接数据源,但该路径是静态的,当我们分享给同事后,报表应该从同事的文件夹中获取数据源,如果此时还需要同事手动修改路径,就会很麻烦,特别是当这样的数据源足够多的时候。因此,有没有办法可以使路径实现动态效果呢?无论我们分享给任何人,报表都可以自动地从对方的文件夹内获取指定数据。

事实上,该需求在Power BI官方社区早已有人提及,但截至目前却没有较好的解决办法, 因此我将在下文讲解该问题的解决方法,而且是多种解决办法。

方法一: 路径参数化

以上文为例,如果不同的用户使得路径中username的部分不同,那么只需把AD域中,或者本机中的所有计算机用户名整理好,然后在新建参数时录入它们,比如命名为username, 那么就可以利用M语句新建一个自定义函数,其中路径部分为:

File.Contents("C:\Users\" & username & "\Documents")

在参数中输入任意用户名,比如Jack,然后Invoke,就可以拼凑出该用户的路径。

在这里插入图片描述
最后,我们就可以另存为PBIT分享给同事。用户只需要在打开PBIT时输入路径参数,即可加载指定数据。

方法二:使用Text.Contains

如果不想使用参数,并且不同的路径拥有相同的部分,就可以使用此方法。比如,针对于一个文件路径,它可能位于:

C:\AAA\File\Project

也可能位于:

C:\BBB\File\Project

也许你会想到完全可以使用方法一,通过使用户传参来确定路径,但此处我们C盘目录下的那个文件夹名称是不确定的,具有随机性和不规律性,或者说参数列表是手动难以维护的,此情况下,要如何做?

我们知道PowerQuery要做到像其他编程一样使用for循环遍历所有路径返回对应结果很麻烦,但我们可以使用Text.Contains函数,让该函数筛选出C盘所有包含"File\Project"路径的文件,如下:

= Table.SelectRows(Source, each Text.Contains([Folder Path], "File\Project"))

这样我们就可以获取所有相关列表,再进行下一步筛选,此时无论何人打开此报表,皆可以获取他们想要的数据。

其他

此需求的另一种场景是获取某文件夹下最新的文件的数据。假设我们有一个文件夹,里面有命名不同的csv文件,我们需要取最近一次修改的csv文件,而不清楚哪个名称的csv文件是我们需要获取的,那么此时我们不能写出一个固定不变的绝对路径来,但我们可以使用Folder.Files函数获取路径下所有文件,然后再使用Table.FirstN把Date created或Date modified字段里日期最大的过滤出来,这样就能完美解决问题。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Power Query是一种数据处理工具,可用于将不同的数据源聚合并进行转换和筛选。而VBA则是一种微软的编程语言,可用于自动化执行Excel任务。那么,如何使用VBA来实现Power Query的高级筛选呢? 在VBA中,我们可以通过连接到Power Query并使用Power Query的筛选方法来实现高级筛选。首先,我们需要添加Power Query的引用,然后可以使用以下代码示例来实现: ``` Sub PowerQueryAdvancedFilter() '连接到Power Query Dim conn As WorkbookConnection Set conn = ThisWorkbook.Connections.Add2(Name:="Power Query", Description:="Connection to Power Query", _ ConnectionString:="OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=queryName") conn.Name = "Power Query" conn.Refresh '执行高级筛选 Dim ws As Worksheet Set ws = ThisWorkbook.Sheets.Add With ws.QueryTables.Add(Connection:=conn, Destination:=ws.Range("A1")) .CommandType = xlCmdSql .CommandText = "SELECT * FROM [queryName] WHERE columnName = 'filterValue'" .Refresh BackgroundQuery:=False End With '关闭并删除Power Query连接 conn.Delete End Sub ``` 在上述代码中,我们首先连接到Power Query,并执行高级筛选。我们可以使用SQL语句来指定筛选的条件,例如`SELECT * FROM [queryName] WHERE columnName = 'filterValue'`,其中`queryName`是Power Query的查询名称,`columnName`是要筛选的列名,`filterValue`是筛选的值。 最后,我们关闭并删除Power Query连接。这段代码可以根据实际情况进行修改和扩展,以满足不同的数据处理需求。 总之,通过使用VBA连接到Power Query,并使用Power Query的高级筛选方法,我们可以实现自动化地在Excel中进行数据筛选和转换。这样,我们可以节省大量的时间和人力成本,并提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DAVIS-BI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值