[TOC] > Sun Apr 25 2021 19:08:31 GMT+0800 (GMT+08:00) 这里给大家说点表格宏中,Excel 和 WPS 表格之间的一些差别: ## 可部署宏位置差异 在 VBA for Excel 中,宏是可以在不同工作表中单独定义的,即你可以在每个工作表里面部署宏。它们彼此之间独立,你在 `Sheet1` 部署的宏就只会在 `Sheet1` 上生效,不会影响到其他工作表。 > 这里说的是那些不加全局、他表对象描述符的写法,比如: > > ```VB > Range("A1") = 100 > ``` > > 这类不加工作表对象描述的写法,它默认只会影响所在的工作表(在 ThisWorkbook 部署的除外),当然了,会不会影响到其他工作表取决于整个宏的逻辑。但默认地单独部署到具体工作表的宏只能在其工作表上生效。 而 WPS JS宏 不一样,它的宏是面对全局的。一个宏,如果你没有在宏逻辑中声明生效的范围,则这个宏能在所有处于激活状态的工作表上生效。而且 WPS 表格的 JS 宏不能给单个工作表单独部署宏,它的宏是按工作簿划分生效范围的,即同一个工作簿文件下的宏可以适用于所有的工作表(如果你不限制的话),跨工作表不影响宏的执行权限,只有跨工作簿时执行权限才会受限。 > 在工作簿 A 部署的宏,在工作簿 B 上是看不到的(跨工作簿了)。 也就是说: 在 WPS 表格工作簿中写的宏(没有声明具体的工作表对象),适用于这个工作簿下的全部工作表。 相比于 Excel ,宏的执行权限很大。因此,在 WPS 表格中部署宏要特别小心。 ## 模块差异 1. Excel 中,宏可以部署到具体的工作表也可以部署 ThisWorkbook 以及模块(mod)中。 ![](https://img.kancloud.cn/1b/52/1b522c73646fcc0ff12c4866c836cbf7_638x448.png) 2. WPS 表格的 JS 宏,只能部署到模块(Module)中(权限和生效作用域与 Excel VBA工程的 `ThisWorkbook`、模块相似) ![](https://img.kancloud.cn/fe/ed/feedde2ba10f15f1b283c33196952bac_422x357.png) > 其实,就宏的执行权限和生效范围而言,与 Excel 相比,WPS 表格的 JS 宏相当于部署到了Excel的`ThisWorkbook` 和"模块"层,权限和生效作用域很高。JS宏虽有多个 Module ,但形同虚设,JS宏的模块(Module)作用域限制不像 VBA 那样严格。 ## 用户窗体模块差异 WPS JS宏 毕竟才出来不久,用户窗体这块在编辑器中能看到也能建起来,但API文档还没看到,大家可以参照 Excel 中的用户窗体部分的开发文档。应该差别不大(整个功能设计、开发流程、对象及对象属性、方法、事件方面大同小异),具体枚举值可能会有所不同。总之,这一块可能还要等一段时间吧,毕竟 MsgBox都还没能正常获取返回值呢。 > MsgBox,我试过,都是 undefined,知道怎么弄的话跟我讲讲。 ## 严格的分类和一切皆 "function" 的差异 在 VBA 中,有明确的 `Sub` 和 `Function` 的区分,以及加了 Private 命令便不会混入公式中。 但到了 WPS JS宏,便不会有这些区分了,不管是宏还是 UDF 都是 function,也没有什么 Public 和 Private 之分(这可不是用了`var`就能解决的!)。 > UDF:用户自定义函数(公式),可以在表格中用于公式。 反正,一切皆 function 之后,你得想办法自己区分它们。 ## 总结 总的来说,相比于 VBA For Excel,WPS 表格 JS宏,没有繁琐的私有“锁”,宏有更高的执行权限和生效作用域,JS宏有更高的灵活性,部署宏比较简单、直接。但这也要求在写宏时要更细心、执行宏的时候更谨慎。宏编写者要: 1. 明确哪些宏是所有工作表都能用的;哪些是只针对某个工作表的。 2. 该加上对象描述符的,一定要加上。例如: `Range("A1")`尽量写成 `Range("Sheet1!A1")`、`Worksheets.Item("Sheet1").Range("A1")`这类或者预先激活`Sheet1`,当然,方法很多,能指向具体对象即可,以避免不必要的麻烦。 3. 宏变多的时候,可能很混乱,能用多个 Module 的就尽量分开写。能藏起来的函数都给它藏起来,函数名该分类、语义化处理的尽量做。该加注释的也不要偷懒,就怕连自己都不知道某个function是干嘛用的……