WPS JS 宏教程(二)-从VBA到JS宏

前置知识

VBA的全称叫做Visual Basic for Application. 相当于在VB的基础上做了一点点的减法,比如说文件读取功能、标准库等。

从VBA到JS宏

可能会有各类用户看到这篇文章,在犹豫着是否该入门编写JS宏。

对于有VB(A)经验的,建议先看WPS开放平台 中的 从Visual Basic转到 JavaScript 一文。内置宏语言的区别,表面上来看,只影响了一些软件自动化的内容(过去一些VBA函数)。

对于刚刚下载了WPS,想要去学写宏代码,网上铺天盖地的还只是VBA资料,不禁要问,我该入WPS JS宏的坑吗?毕竟,JavaScipt不是微软钦定的宏内置语言。我觉得无妨尝鲜。理由如下:第一,VB已老,基本上失去了微软自己的支持。第二,尽管在宏方面微软没有亲自下场将JavaScript加入为内置宏语言,但是Office的加载项就支持通过JavaScript等web技术创建。第三,微软有个插件叫做Script Lab(属于微软的garage项目),也有跟JS宏类似的功能(但由于网络原因,似乎它跑不起来。 Script Lab链接)。第四,可以配合node.js,实现以node.js为核心的办公软件操作。这样就能在一定程度上弥补JS作为非官方内置宏语言的缺点。

VBA vs. JavaScript

  1. 通用性。MS Office不支持JS宏,WPS官方文档表明“VBA宏功能仅限购买了商业标准版或者商业高级版的企业用户使用”。MS Office在大众用户中的市场份额更高,WPS在政府国企事业单位中的市场份额更高。
  2. 应用场景影响宏语言的选择。应用场景可以分为两类,
  3. 一类是软件自动化。反应在代码中,主要表现为调用一些操作软件的函数。自动化场景对于语言的要求不是很高,比如,我原来用Python + win32com库写将doc文件批量转换为docx。此类应用场景,是VB、JS,抑或Python没多大的关系。毕竟无论是哪种语言,本质上都是在操纵相同的对象模型。提示:如果是自动化相关的操作函数,很多都可以直接参考VBA文档。而且建议直接用必应搜索。
  4. 第二类是功能增强。比如我要写一些复杂的自定义函数的时候,用JavaScript通常会比VB好一些。WPS内置的JavaScript V8引擎,已经支持很多ES6的语法了,就导致JavaScript的语言表达能力比VBA强。
  5. 第三方资源。Javascript第三方库多,配套工具链全,上限较高。结合nodejs, babel, jest库等可以干出很多高质量的代码出来。反过来讲,如果用了nodejs、babel、jest之类去工程化相关宏代码,就将宏弄的很重,很不灵巧。
  6. VBA和Windows系统结合的更加紧密,比如,WPS中,没找到表格跟文字互通的方法。原来VBA可以用createobject……而 Interaction between Office applications 是微软文档中描述VBA的重要功能之一。

同时JavaScript自身的缺点,也会带到写宏代码的过程中来。例如:

  1. JavaScript天生的没有标准库,又由于历史原因,有些东西就很难受。比如每当遇到日期场景,首先是立刻给自己写个小型datetime类。
  2. 为了与VBA函数保持命名上的一致,命名规则很不JS风。比如used_range.Cells.Item(i+1,j+1) 。大写并不一定表达属性,也有可能是方法。

此外,官网上WPS的JS宏资料较少,文档版本管理很乱。很多功能还是在更新中,你甚至可能不知道你装的这个版本到底支持多少功能。这算是一个小公司的痛。所以很多时候,我宁愿先查VBA文档,如果有问题的,再对照下WPS自己的文档。

所谓的查VBA文档不是指查看VBA语言的详细情况,而是指看VBA如何与Excel交互,一图胜千言

注:比较下Excel Range的VBA表述和WPS表格中的Range,前者更详实。但如果照抄VBA代码会发现,WPS表格的Range对象没有Value的属性,只有一个叫做Value2的同类属性,而且它文档中的例子就是通篇Value2。

避坑指南

可能有用户不经意点进VBA Reference中的Statements或Functions中去,然后发现了一些宝藏。比如,像我一样偶然发现WPS中的JS宏支持Dir和GetAttr函数了,意味着用JS宏同样可以遍历文件了!

注:由于许多宏编程开发者都是非计算机科班出生,如果行文中硬把Statement翻译成语句其实理解起来怪怪的。简单来说,可以将其理解为一个vb中的过程(sub)或者其他语言中不返回值的函数。但在调用上,运行statement不用括号。

很多非必要的Statements表明了Basic这个上古语言的年纪。如果有Python2经历的同学可能会知道,在那个时候print也是一个statement而不是一个函数。看看里面的ChDir等等都是statement而不是function,这与现代一点的语言格格不入。

可能WPS会为了与VBA之间的兼容性,会持续增加相关函数,以此保持与VBA语言中的Statements和Functions一致性。但是,我稍微试用了下,坑还有很多。一个粗略的建议就是,能不用就不用。除非你清醒的知道后果是啥,否则就别用。(比如我用Dir和GetAttr实现文件夹遍历,是因为我还有一手准备,它出问题的时候,我就用Python遍历,然后生成JSON供WPS宏调用。)

不推荐使用的理由:首先,WPS的官方文档没有介绍,你不知道官方支持度。一家商业公司静悄悄退出一些功能,只能说明这本就不是受到重视的功能。其次,存在函数在不同的平台(可能也包括不同的版本)返回的值不一致的情形。最后,有些函数的设计其实过于古早,现在来看早就不合时宜了。比如Open不支持指定的编码,默认还在使用ANSI编码。

参考资料:

Getting started with VBA in Office 这个链接中,微软花了大力气说你为什么应该学习VBA。

发表回复

相关推荐

進口咖啡品牌排行榜前十名

作為上班族,咖啡簡直就是必備飲品。 早上上班,坐在辦公桌前做的第一件事就是給自己泡杯咖啡。 咖啡特有的香氣彌漫在空氣中...

· 26分钟前

大一工程化学复习

标准状态:系统中每种气体的分压为101.325kpa

· 28分钟前

给故人烧头七的意义

最近可能由于回答了一些关于生死的问题,于是很多人在后台都咨询了我相关烧头七以及能为故人做什么的问题。

· 32分钟前

藏族文化——紮西德勒

一、引言紮西德勒,吉祥如意之意,是藏族人民表示歡迎、問候、祝福等意的日常用語;紮西德勒,是藏語裡最吉祥、最能表達祝福...

· 37分钟前

晚上能喝茶嗎?看這裡

許多人都說,晚上不能喝茶,喝瞭會失眠。在晚上的時候喝茶,一定會影響睡眠嗎?其實未必。茶有提神的作用,這是毋庸置疑的,但...

· 49分钟前