跳到主要内容

转换 VBA 宏

ONLYOFFICE 宏与 Microsoft 宏不同,因为后者使用 Visual Basic for Applications (VBA) 脚本语言。JavaScript 更加灵活,可在任何平台上使用(这一点很重要,因为 ONLYOFFICE 编辑器支持 Windows、Linux 和 macOS)。

这意味着在 Microsoft Office 中创建的宏与 ONLYOFFICE 宏不兼容。您可以通过以下两种方式将其转换以在 ONLYOFFICE 中使用:

使用 AI 插件自动转换

从 9.0 版本开始,您可以使用 ONLYOFFICE 内置的 AI 插件,自动将 VBA 代码转换为与 ONLYOFFICE 宏兼容的 JavaScript 代码:

  1. 配置 AI 插件。详情请参见 配置 AI 插件

  2. 打开 视图 选项卡,点击

  3. 窗口中点击 AI 图标,选择 从 VBA 转换

    AI pluginAI plugin

  4. 从 VBA 转换宏 窗口中插入 VBA 代码,点击 创建。生成的宏示例将插入到 窗口中。

    Convert VBAConvert VBA

  5. 检查代码,并根据需要进行调整。

    虽然 AI 插件可以生成完整且可运行的宏,但并不总是完美无误。请务必仔细检查输出结果并进行充分测试,尤其是对于复杂的宏。

  6. 点击 Play icon 测试脚本。

例如,以下 VBA 宏可取消合并活动工作表中所有已合并的单元格:

Sub UnmergeAllCells()
ActiveSheet.Cells.UnMerge
End Sub

您可以将此 VBA 代码粘贴到 AI 插件转换器中。插件将返回以下 JavaScript 宏:

(function(){
// This code will unmerge all the merged cells in the active worksheet

// Get the active sheet
var oWorksheet = Api.GetActiveSheet();

// Get all cells in the worksheet by getting the used range
var oUsedRange = oWorksheet.GetUsedRange();

// Check if there is any used range
if (oUsedRange) {
// Unmerge all cells in the used range
oUsedRange.UnMerge();
}

// Alternative approach: Get the entire sheet range and unmerge
// This ensures all possible merged cells are unmerged
var oRange = oWorksheet.GetRange("A1:XFD1048576");
oRange.UnMerge();
})();

运行此宏,验证它是否成功取消合并工作表中所有已合并的单元格。

请求处理流程

当 AI 插件处理 VBA 转换请求时,将按照以下执行流程进行:

  1. VBA 输入分析: 解析所提供的 VBA 代码,检测其逻辑(范围、公式、循环、条件和操作)。
  2. Office API 映射: 将 VBA 操作映射到等效的 ONLYOFFICE Office API 方法。
  3. JavaScript 宏生成: 生成与 ONLYOFFICE 宏兼容的 JavaScript 宏。
  4. 结果插入: 将生成的脚本插入到 窗口中供审查。
  5. 验证与调整: 您对脚本进行审查、测试并根据需要进行调整,尤其是对于复杂或 VBA 特有的行为。

如果 VBA 转换失败,插件将输出错误信息,或生成一个带有注释说明失败原因的宏。

手动转换 VBA 宏

如果 AI 生成的版本无法正常工作,或者您希望完全理解和控制宏的行为,可以手动转换 VBA 宏:

  1. 分析原始 VBA 宏的逻辑。
  2. ONLYOFFICE Office API 中查找等效的方法和事件。
  3. 用 JavaScript 重写宏。
  4. 直接在 ONLYOFFICE 编辑器中进行测试。

例如:

Sub Example()
Dim myRange
Dim result
Dim Run As Long

For Run = 1 To 3
Select Case Run
Case 1
result = "=SUM(A1:A100)"
Case 2
result = "=SUM(A1:A300)"
Case 3
result = "=SUM(A1:A25)"
End Select
ActiveSheet.range("B" & Run) = result
Next Run
End Sub

该宏计算 A 列三个单元格区域中的值之和,并将结果写入 B 列的三个单元格中。

使用 ONLYOFFICE 宏可以实现相同的结果。如果您同时了解 VBA 和 JavaScript,代码几乎完全相同:

(function()
{
for (let run = 1; run <= 3; run += 1) {
let result = "";
switch (run) {
case 1:
result = "=SUM(A1:A100)";
break;
case 2:
result = "=SUM(A1:A300)";
break;
case 3:
result = "=SUM(A1:A25)";
break;
default:
break;
}
Api.GetActiveSheet().GetRange(`B${run}`).Value = result;
}
})();

同样的方法适用于任何其他 VBA 宏。