首页 > 解决方案 > Office-JS 可以触发 VBA 工作簿或工作表事件过程吗?

问题描述

我正在尝试查看是否有办法在 Office-JS 中执行某些操作,以触发在 Excel VBA 中运行的事件过程,但看起来 VBA 事件在执行 JavaScript 代码期间被禁用。

例如,假设我有一个带有名为“Sheet1”的工作表的工作簿,并且在该工作表模块中我有以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value2 <> vbNullString Then
        MsgBox Target.Value2
    End If
End Sub

我期望的是,如果我更改单元格 A1 的内容,新内容将显示在消息框中,但是如果我在Script Lab中运行以下代码段(基于空白代码段),则事件不会得到即使单元格 A1 被成功编辑,也会触发:

$("#run").click(() => tryCatch(run));

async function run() {
  await Excel.run(async (context) => {

    const sheet = context.workbook.worksheets.getItem("Sheet1");
    sheet.getRange("A1").values = 'Hello from Office-JS';

    await context.sync();
  });
}

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
  try {
    await callback();
  } catch (error) {
    // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
    console.error(error);
  }
}

所以我的问题是:有没有办法进行设置,以便 JavaScript 代码可以触发 Worksheet_Change 事件,如果没有,是否可以触发另一个工作表或工作簿事件?

一点上下文:我试图找到这个问题的解决方案,并认为一个好的解决方法是使用 Office-JS 将 VBA 代码写入单元格,然后使用 Worksheet_Change 事件过程执行写入该单元格中的 VBA 代码.

不幸的是,到目前为止还没有奏效,但我认为值得提出这个更具体的问题,因为解决这个问题将是允许从 Office-JS 执行 VBA 代码的最后一步(这将非常好)。

标签: javascriptexcelvbatypescriptoffice-js

解决方案


change事件不会运行,但事件selectionchange会运行,因此您可以使用它来触发您的代码:填充特定单元格,然后选择它

sheet.getRange("A999").values = 'Hello from Office-JS';
sheet.getRange("A999").select();

工作表模块:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address(False, False) = "A999" Then
        MsgBox Target.Value
    End If
End Sub

编辑:在审查中,原始问题的 OP 已经解决了大部分问题......


推荐阅读