在Excel VBA里折腾SQL
又花了几乎一天的时间去研究在VBA里使用SQL。上午我主要卡在为什么我运行不了SQL这个东西。最主要的原因是我贴过去的那个例子是2014年的,那个时候的office跟现在的很不一样,所以是不是代码里的某些参数要改过来?4跟8改成12,我的确改了,但还是不行。吃过午饭以后我我把ExcelHome论坛前天大家才写出来的SQL查询复制过去,发现果然就可以了,因为除了12要都改以外,还得改一个Microsoft之后的单词…… 为了这个运行不了我还折腾的一番到底我需不需要装32位的AccessDatabaseEngine.exe,因为我发现自己的电脑是默认的那个是64位的。一开始我还以为自己的Microsoft 365是32位的,因为以前自动安装的的确是32位的,但是当我安装了32位的AccessDatabaseEngine.exe以后,发现还是不行,接着我就去看自己的office,原来已经是对64位了。因为据说64位要比32位快那么一点点,我已经不记得自己到底什么时候换了。换一个office对我来说毫无难度,因为只要登录我的账号,随时都能把那个离线文件下载回来。
总算可以在Excel里运行有SQL语句的VBA。据说要在Excel里运行SQL有三个方法,第1个是用远古的MS Query,这种方案在我用Office 2003的时候尝试过。接着是在新建连接那里输入一大串的SQL语句,这种事情我好像也干过。最后也就是现在主流推荐得最多的在VBA+ADO+SQL。这是我之前完全没有接触过的。你说我完全不懂SQL吧,也不是,实际上我也是有一点点懂的,因为高中的电脑课程里面就有Access,那就是一门电脑课,因为用得不多,所以印象不深刻。相对于其它编程语言,我觉得SQL的单词算是非常简洁了。入门是简单的,但是你要把它玩得很溜,一点都不简单。
从别人的代码语句构造来说,我觉得SQL要比VBA的数组好理解一些,但是当我自己要写的时候发现哪哪都不对。主要是虽然是SQL,但是不同软件里面的限制可以称得上是五花八门。当你搜索出一种SQL写法以后,发现在Excel里面无论如何都不行,最后发现原来是Excel不支持这种玩法。比如我要做一个多条件判断,我肯定毫不犹豫会想到用switch的方法,SQL里面都有case解决方案,但问题是Excel里不行,所以如果是多条件的,你只能不断地嵌套if。因为我多条件最终实现的是一个文本替换,所以我就足足套叠了5层replace才实现了我的功能。
用过VSCode你肯定会觉得Excel VBA最让人吐槽的就是VBE的各种奇奇怪怪的限制。如果你要在VBA里面用SQL语句,你就得用双引号把那圈起来,而且在双引号里面是不允许换行的。这就很让人抓狂了,不能硬换行可以,但编辑器为什么就不能给我一个软的自动换行?视觉上给我换一下行有什么问题吗?当你不得不把那串SQL圈起来,就意味着里面所有成对的符号自动识别一律失效,全部变成了白开水字符串。本来那就是很大串的东西,还没有方法帮你自动确认格式有没有错误。如果可以换行可以缩进,你可能一眼就看出自己在哪里出毛病了,有些配对没配对上,但是因为你只能一笔写到底,所以你怎么可能不犯错呢?犯的这些错误有可能是你不知道规则原来是不允许的。比如如果你只有一层select,字段里有别名,那么group by的时候你就不能用别名,因为group by比select先执行。在某些软件的SQL里,是允许加having语句,从而改变 group by和select的先后顺序,但在Excel里面加having是没有用的。如果你非得要在group by的时候使用别名,那么你就得嵌套select。内层select先别名,外层用group by。这些神神经经的限制实在让人抓狂死了。同样是分组,如果我是在PQ里进行,重命名列这种事情放前面放后面都无所谓,变形改造列这种事情放前面放后面也无所谓。因为重命名、变形、分组这件事情全部可以分步。但是在Excel的这个SQL里面,所有东西都得一次到位。明明可以短句实现的功能不得不写一大串。实际上在Excel以外的SQL写法里,是不是也非得这样?VBA的古板是显而易见的,但是当你见识过他们把SQL阉割限制成这个模样。你就会立马觉得python的自由奔放实在太好了。
死磕得越多,我越发现自己喜欢VSCode+pyhon。