一说到Excel工作簿内容合并、多工作簿查询、外部数据源的查询引用的实现,那么很多人第一想法就是使用公式、VBA、Power query。没错,这几个确实可以。我本人是一个Power query重度依赖者,经常使用PP来做数据查询。可后来慢慢的发现,Power query问题真的很多,比如说占用内存太大、运行非常缓慢。另外,一些低版本的Excel不支持PP,同时WPS也是不支持PP的。这个让我非常头疼,于是不得不找其它办法。于是在不经意间发觉了以下这个一直被忽视的东西:Microsoft Query。于是,我就使用这玩意试着分别连接SQL Server做了一个动态财务的科目汇总表查询,和连接Access做了一个动态查询。效果如下:


以上,两个测试完全实现了使用参数的动态查询。以往,实现这种效果,要么使用VBA、要么使用power query。以下,我们来看一下怎么实现它呢。
1、打开菜单栏,找到Microsoft Query的

2、进入数据源配置界面

这里已经存在了常用的Excel、Access这两种数据源连接方式。但其他的,我们需要单独建立。在此以SQL Serve为例。


刚才建立的数据源就出现在了列表里面

接下来我们来看如何实施查询:
首先,选择一下数据库,然后添加一下需要用到的表


以上这个界面,作为使用过Foxpro的人应该不陌生,果然是上古的杰作。我们看到,从数据添加的表,自带了表间关系。这个非常省心,如果是Excel查询,那么就得自己建立表间关系了。
接下来,我们把需要用到的的字段全部添加到列表里面,因为有表间关系,会自动做数据参照。查询器里面的好多细节操作,在此就不过多描述了。
现在我们来看一下,查询器自己生成的 SQL语句

在使用过程中,因为需要做动态查询,因此加入了查询参数,然后这部分参数又被绑定到了工作表的单元格上。只要在这部分单元格就可以作为查询条件来使用,只要这部分单元格数值有变动,那么查询就会同步更新,根本不需要刷新或者添加按钮来执行查询。具体如下:

现在,让我们来看看,做出同样效果的东西,VBA和Power Query的工作量:
首先,来看VBA的工作量:
1、单独设计的查询界面

2、部分VBA代码

至于power query稍微好一些,在引入数据的时候一句SQL语句就能解决,但是这货对于使用参数做动态查询实在太麻烦,需要合并好几几次查询才行。
最后,对比Microsoft Query、VBA、Power query。可以说Power Query应该是Microsoft Query 的升级版,但是PQ使用的是M语言,在使用便利性和性能上不占优势,随便一个查询动辄就是几个G的内存占用,分分钟就死机。使用过多以后,感觉目前的PQ,还真只是一个玩具,它还有很大的改进空间。而VBA,这个看似无所不能,但正是无所不能才更加不那么好控制。至于Microsoft Query而言,并非没有缺点,最大的缺点我认为是多表连接查询时候没法使用左连接、右连接以及外部连接,只能使用内部或者说等值连接。所以,对于日常的合并工作表,还是建议使用MQ。
网友评论