![c49dcb4e56789fee6f8f2897c98d6c39.png](https://i-blog.csdnimg.cn/blog_migrate/ac17f785b2496f43408a5009aa8fe12c.jpeg)
一说到Excel工作簿内容合并、多工作簿查询、外部数据源的查询引用的实现,那么很多人第一想法就是使用公式、VBA、Power query。没错,这几个确实可以。我本人是一个Power query重度依赖者,经常使用PP来做数据查询。可后来慢慢的发现,Power query问题真的很多,比如说占用内存太大、运行非常缓慢。另外,一些低版本的Excel不支持PP,同时WPS也是不支持PP的。这个让我非常头疼,于是不得不找其它办法。于是在不经意间发觉了以下这个一直被忽视的东西:Microsoft Query。于是,我就使用这玩意试着分别连接SQL Server做了一个动态财务的科目汇总表查询,和连接Access做了一个动态查询。效果如下:
![482e6ae7121b416bc25e01b6317bc05a.png](https://i-blog.csdnimg.cn/blog_migrate/546a14723948668c22b2342af12067fe.jpeg)
![faa583bd99c137e52cfc0e35b48123f5.png](https://i-blog.csdnimg.cn/blog_migrate/e46cc39640c5cc777cf208475ce4ae0b.jpeg)
以上,两个测试完全实现了使用参数的动态查询。以往,实现这种效果,要么使用VBA、要么使用power query。以下,我们来看一下怎么实现它呢。
1、打开菜单栏,找到Microsoft Query的
![d10bbbcfcb48c81b6e325406bc44da6c.png](https://i-blog.csdnimg.cn/blog_migrate/508383abe53ff07ceb9cd74a35241136.jpeg)
2、进入数据源配置界面
![0b1500a77d73a75e42db11a555f00d7c.png](https://i-blog.csdnimg.cn/blog_migrate/b5d9e9b72ab3f45906d9f03ae65f3a81.png)
这里已经存在了常用的Excel、Access这两种数据源连接方式。但其他的,我们需要单独建立。在此以SQL Serve为例。
![32419099c8ad015937ebc685043d6fed.png](https://i-blog.csdnimg.cn/blog_migrate/5fc746d204497ed7a19fe070764daddd.jpeg)
![56254529c50c4d956707b4224934a682.png](https://i-blog.csdnimg.cn/blog_migrate/4b253693204c83faf4199fb7ed1fa9af.png)
刚才建立的数据源就出现在了列表里面
![9565075449eeb03f5351b7e677e15bad.png](https://i-blog.csdnimg.cn/blog_migrate/ea427b9177ace2dcc300f8c5aab0f349.png)
接下来我们来看如何实施查询
首先,选择一下数据库,然后添加一下需要用到的表
![758341bb7b0ce35f8fd0346bc317fcce.png](https://i-blog.csdnimg.cn/blog_migrate/253af0445a46d4a07fe45e699950521d.jpeg)
![e856894f72fed9b11fc7cabffdc13e68.png](https://i-blog.csdnimg.cn/blog_migrate/f7fda0fa8af9e0a096d85a9bfe168dd2.jpeg)
以上这个界面,作为使用过Foxpro的人应该不陌生,果然是上古的杰作。我们看到,从数据添加的表,自带了表间关系。这个非常省心,如果是Excel查询,那么就得自己建立表间关系了。
接下来,我们把需要用到的的字段全部添加到列表里面,因为有表间关系,会自动做数据参照。查询器里面的好多细节操作,在此就不过多描述了。
现在我们来看一下,查询器自己生成的 SQL语句
![c1212da84b8cf3c5ca6a810a61b1c84c.png](https://i-blog.csdnimg.cn/blog_migrate/a5370ae0cbe904bebc0c90c6f8c7c5cc.jpeg)
在使用过程中,因为需要做动态查询,因此加入了查询参数,然后这部分参数又被绑定到了工作表的单元格上。只要在这部分单元格就可以作为查询条件来使用,只要这部分单元格数值有变动,那么查询就会同步更新,根本不需要刷新或者添加按钮来执行查询。具体如下:
![1f3e3ca47a60fdd437567bbcca8871b3.png](https://i-blog.csdnimg.cn/blog_migrate/3954e760e3d1591479f20669715be9f1.jpeg)
现在,让我们来看看,做出同样效果的东西,VBA和Power Query的工作量:
首先,来看VBA的工作量:
1、单独设计的查询界面
![bf1dc829e72fbac1510bbd2a53b03404.png](https://i-blog.csdnimg.cn/blog_migrate/6c761b8b570e37841c8f39f3eca12f0f.jpeg)
2、部分VBA代码
![fead60a4959cf502bea5aa664fcbd671.png](https://i-blog.csdnimg.cn/blog_migrate/de7201011aac649b58edc3eebeac81a7.jpeg)
至于power query稍微好一些,在引入数据的时候一句SQL语句就能解决,但是这货对于使用参数做动态查询实在太麻烦,需要合并好几几次查询才行。
最后,对比Microsoft Query、VBA、Power query。可以说Power Query应该是Microsoft Query 的升级版,但是PQ使用的是M语言,在使用便利性和性能上不占优势,随便一个查询动辄就是几个G的内存占用,分分钟就死机。使用过多以后,感觉目前的PQ,还真只是一个玩具,它还有很大的改进空间。而VBA,这个看似无所不能,但正是无所不能才更加不那么好控制。至于Microsoft Query而言,并非没有缺点,最大的缺点我认为是多表连接查询时候没法使用左连接、右连接以及外部连接,只能使用内部或者说等值连接。所以,对于日常的合并工作表,还是建议使用MQ。