当我们使用 powerquery 获取外部的 excel 文件时,传递进去的是绝对路径。
如下图,我们导入 excel 文件之后,进入 pq 编辑器中,可以看到外部的 excel 文件是个绝对路径。
一旦我们导入的文件的位置发生改变,打开刷新后,会有弹窗错误提示。
虽然单击编辑错误栏中的 【编辑设置】,单击 【浏览】按钮,重新选定指定路径,就可以更新好路径。
但是,如果导入外部文件的工作表太多,就要一个个更改路径,非常麻烦。
① 名称:路径。
② 类型:文本。
③ 建议的值:值列表(如果常用的路径有多个,就可以采用值列表类型。只有一个就采用文本类型)。
④ 输入值列表信息,默认值,当前值。
⑤单击【确定】按钮,此时路径参数就新建好啦!
新建好参数之后,我们就需要把参数引用在数据源中。
❷ 路径字符串改成参数
这里可以用两种方式。
一种是更改数据源。
在【d88尊龙官网手机app主页】选项卡下,单击【数据源设置】;
在数据源设置中,
① 单击【更改源】。
② 参数名称为:路径。
③ 类型:参数。
④ 单击【确定】按钮,关闭。
另一种方法是直接更改 m 函数公式。
将使用到文件路径的查询,分别改成参数名称(路径)即可。
上面我们已经把路径参数化了。后面一旦外部文件位置发生改变时,我们只需要更改路径参数即可,并不需要一个个去更改查询的路径。
到这里,路径参数就搞定啦~
不过,前面更改路径的参数值是针对有 pq 基础的小伙伴,那么有没有办法,可以让我们自行选择指定路径,将路径的信息传递给参数呢?
要想实现这个效果,我们得用上 vba。
2、交互式获取路径
首先我们先新建一个参数看看,里面的 m 函数是怎么写的。
由于这里是让用户自行选择路径,所以参数的类型选文本就可以。
接着,来看一下该参数对应的 m 函数是怎么写的。
选择查询 【路径】,单击【高级编辑器】。
从图中可以看到,参数对应 m 语言如下 :
"c:\users\80522\desktop\小爽鸭xlsx" meta [isparameterquery=true, type="text", isparameterqueryrequired=true]
通过观察,我们可以构造出如下形式。
1 | 路径 "meta [isparameterquery=true, type="text", isparameterqueryrequired=true]" |
那么下面,就是利用 vba 执行新建路径参数的操作。
主要有如下思路 :
通过 filedialog 对象,让用户选择指定的文件,将获取到的路径字符串,进行构造路径参数的 m 函数公式,利用 vba 添加 pq 查询(add 方法),让代码执行 在 pq 编辑器中新建 以 m 函数公式的路径参数的查询。如果路径参数查询已经存在则先删除。
新建一个模块,输入我按照思路编写的 vba 代码。
sub 选择参数() dim dig, path set dig = application.filedialog(msofiledialogfilepicker) with dig .filters.add "excel 文件", "*.xls*", 1 .initialfilename = thisworkbook.fullname if .show <> 0 then path = dig.selecteditems(1) on error resume next thisworkbook.queries("路径").delete thisworkbook.queries.add name:="路径", formula:= _ """" & path & """" & " meta [isparameterquery=true, type=""text"", isparameterqueryrequired=true]" thisworkbook.queries("路径").refresh end if end with end sub
最后,我们插入一个图片,指定一下上述宏代码。
单击【图片】,鼠标右键,选择【指定宏】,位置【当前工作簿】,【选择参数】,单击【确定】按钮。
3、效果展示
现在,我们来做一个测试,案例中我已经事先导入测试文件夹中小爽鸭的 excel 文件,文件路径都引用了路径参数(此时数据源路径是存在的)。
然后,我把「测试」文件夹中的「小爽鸭」文件移到「路径变了」文件夹中。小爽鸭工作簿位置发生改变。
这时,更新一下数据源后,我们可以看到,错误信息中显示【未找到文件】。
接着,我们单击一下图片,执行宏操作,选择移动后的文件,确定。
这时候,就看到查询中的链接没有提示错误了。同时,路径的参数也改成我们刚刚所选择的文件路径。
到这里,大家 get 到了嘛?
本文可能有点难度,不过比较实用。目前还没完全懂的小伙伴可以先收藏。
4、写在最后
因为我们知道 powerquery 引用外部文件,是个绝对路径,不是相对路径。
所以我们就想到把路径作为一个参数,引用到查询中,于是就有了新建参数的想法。
但是,还是不方便。这时我们就开始思考:对于不会使用 powerquery 更改路径的小伙伴,能不能通过外部自己选择路径呢? 于是就有了 vba 代码的想法。
因为使用到 vba,所以文件后缀名,小伙伴们记得保存为 xlsm 格式!
这就是本篇文章的整体思路。
对了,本文使用版本是 office 365 最新版本,不同版本的提示可能有些不一样,大家也注意一下哦。