克服 VBA 过时:使用运行时脚本框架实现 Office 自动化现代化

发布: (2025年12月27日 GMT+8 23:07)
9 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我会按照要求将其译成简体中文并保留原有的格式。

简介

在快速发展的编程世界中,Visual Basic for Applications(VBA)常常给人一种陈旧的感觉——语法冗长、函数式范式受限,且缺乏 JavaScript 或 Python 开发者理所当然拥有的现代化人机交互。截止 2025年12月27日,微软持续推动基于云的替代方案,如 Office Scripts 和 Excel 中的 Python,进一步凸显了 VBA 被视为过时的现象,使得使用传统 Office 桌面版的用户陷入困境。

但如果可以在不抛弃 VBA 的前提下让它焕发活力呢?

这时 Advanced Scripting Framework (ASF) 登场——它是一个纯 VBA 可嵌入的脚本引擎,通过在 VBA 基础之上叠加简洁的、受 JavaScript/C 启发的语法,现代化编程的人体工学。本篇文章提供对 VBA 痛点的技术洞察,演示 ASF 如何克服这些问题,并为您提供将其集成到工作流中的实用步骤。

ASF 不仅仅是一个工具;它是巧妙工程的见证,能够将笨拙的宏转化为优雅且高效的脚本。

VBA 痛点

VBA 于 1990 年代推出,擅长 Office 对象模型的集成,但在现代的人体工学方面表现不足:

问题描述
冗长语法Dim arr(1 To 3) As Variant 这样的声明以及多行的 If…Then…End If 会使代码臃肿,降低可读性并增加错误。
函数式编程受限缺乏一等函数、闭包或方法链(在 JavaScript 中常见),迫使使用过程式的变通方案。
字符串与数据处理缺口基本的字符串拼接且缺少模板字面量,使得动态字符串处理繁琐;数组操作需要自行编写循环。
正则表达式与文本处理依赖已废弃的 VBScript.RegExp(现为原生 VBA 对象),缺少现代高级字符串操作功能。

这些问题阻碍了企业环境中的生产力,尤其是在桌面版 Office 主导的场景下(例如财务报表、数据流水线)。

ASF 概览

ASF 将 VBA 重新构想为动态、符合人体工学的脚本宿主。

  • Pure‑VBA implementation – 无 COM 或 DLL 依赖;可在所有 Office 应用中移植。
  • JS‑like syntax – 简洁、直观且易于维护。
  • MIT‑licensed on GitHubECP‑Solutions/ASFv1.0.6(2025 年 12 月 27 日发布)引入原生正则表达式。

该引擎将现代脚本编译为抽象语法树(AST),并通过基于 VBA 的虚拟机执行,从而提升人体工学体验,无需迁移。

一等函数与闭包

ASF 引入了匿名函数和闭包,捕获变量以实现有状态的逻辑——远远优于 VBA 那种僵硬的 Sub / Function

' Mapping with a closure for data transformation in an Excel macro:
a = [1, "x", [2, "y", [3]]];
b = a.map(fun(x) {
    if (IsArray(x)) {
        return x;
    } elseif (IsNumeric(x)) {
        return x * 3;
    } else {
        return x;
    }
});
print(b); // → [3, "x", [6, "y", [9]]]

这减少了 VBA 的样板循环,提高了可读性和复用性。

数组/对象字面量与方法链

抛弃 VBA 数组,改用字面量,并像在 JS 中一样链式调用方法——对人性化的数据处理极为便利。

' Filtering and reducing an array for summary stats:
a = [1, 2, 3, 4, 5];
result = a
    .filter(fun(x) { return x > 2; })
    .reduce(fun(acc, x) { return acc + x; }, 0);
// result: 12 (3 + 4 + 5)

ASF 完备的方法(filtermapreducetoSorted,……)使操作流畅,显著缩短开发时间。

模板字面量与字符串易用性

反引号与插值简化了动态字符串,远比 VBA 的 & 更易用。

a = "Happy! ";
print(`I feel ${a.repeat(3)}`); // → "I feel Happy! Happy! Happy! "

Source:

本机正则 – 人体工学的皇冠瑰宝

ASF 的纯 VBA 正则引擎(在 v1.0.6 中新增)行为类似 JavaScript 的 RegExp,支持斜杠字面量、标志(gims)、前后查找、原子组,以及与字符串方法的无缝集成。

不区分大小写的替换

'I think my Dog is cuter than your dog!'
    .replace(`/dog/i`, "cat")
// → "I think my cat is cuter than your dog!"

自定义替换函数(捕获组 & 偏移量)

fun replacer(match, p1, p2, p3, offset, string) {
    return [p1, p2, p3].join(" - ");
};

'abc12345#$*%'.replace(`/(\D*)(\d*)(\W*)/`, replacer)
// → "abc - 12345 - #$*%"

用占位符进行交换

'Maria Cruz'.replace(`/(\w+)\s(\w+)/`, "$2, $1")
// → "Cruz, Maria"

带偏移量的条件编辑

fun styleHyphenFormat(propertyName) {
    upperToHyphenLower = fun(match, offset, string) {
        return (offset > 0 ? " - " : "") + match.toLowercase();
    };
    return propertyName.replace(`/[A-Z]/g`, upperToHyphenLower);
};

styleHyphenFormat("borderTop")
// → "border - top"

使用转义的安全脱敏(防注入)

fun superSafeRedactName(text, name) {
    return text.replaceAll(`/${regex().escape(name)}/g`, "[REDACTED]");
};

superSafeRedactName(
    "A hacker called acke breached the system.",
    "acke"
)
// → "A h[REDACTED]r called [REDACTED] breached the system."

带捕获的全局 matchAll

'test1test2'.matchAll(`/t(e)(st(\d?))/g`)
// → [ ["test1","e","st1","1"], ["test2","e","st2","2"] ]

这些示例展示了 ASF 在人体工学方面的优势:带上下文(偏移量/字符串)的函数替换器能够实现原生 VBA 无法做到的智能、简洁逻辑。

VBA 互操作用于混合人体工学

使用 @(VBAExpression) 从 ASF 脚本调用本机 VBA 函数:

result = @(MyVBAFunction(1, 2, 3));

VBA 外部函数接收一个包含所有已求值参数的 Variant 字符串数组。

人体工学的生产力提升

  • 2–3× 更短的代码 – 减少认知负担。
  • 方法链和字面量 – 让重构轻而易举。

可移植性

  • 无依赖 – 可在任何 Office 环境中运行。

增强功能

  • 原生正则表达式和函数式模式以人体工学方式处理现代任务(数据验证、解析)。

调试与测试

  • 内置 AST 检查、print() 和逐步调试,为脚本执行提供可视化。

概览

  • Pretty‑printing200+ tests 确保 VM 与正则表达式引擎的可靠性。
  • Enterprise Fit: ASF 在不进行云迁移的情况下实现现代化,延长 VBA 的寿命。

入门

  1. 下载 最新版本(可从 GitHub 获取)或从仓库的 /test/ 文件夹中获取示例工作簿。
  2. 导入 所需的模块/类到你的 VBA 项目中。

基本设置

Dim engine As New ASF
scriptIndex = engine.Compile("your ASF script here")
engine.Run scriptIndex

Experiment

在 Excel 宏中嵌入正则表达式示例,以处理单元格数据。

扩展

将 ASF 与 VBA‑Expressions 结合,用于数学/统计互操作。

结束语

ASF 体现了卓越的现代化——将 VBA 的淘汰转化为机遇。
如果您准备以出色的人体工学提升 Office 自动化,ASF 是前进的方向。立即深入探索,改造您的代码库吧!

Back to Blog

相关文章

阅读更多 »

通过 ODBC 访问关系型数据库

介绍:对于几乎每种 file format,都有不同的 function,通常还需要不同的 package,这很容易让人感到不知所措——尤其是在 juggling multi...