我正在尝试查看是否有一种方法可以在Office-JS中执行某些操作,从而触发事件过程在Excel VBA中运行,但是似乎在执行JavaScript代码期间禁用了VBA事件。

例如,假设我有一个工作簿,其中有一个名为“ 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事件,否则,是否可以触发另一个工作表或工作簿事件?

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

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

#1楼 票数:1

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已经在大多数情况下有效了...

#2楼 票数:1

经过更多测试后,我设法通过使用Office-Js创建新工作表来触发工作簿对象的Workbook_NewSheet事件过程:

var sheets = context.workbook.worksheets;
var sheet = sheets.add("NewSheet");
sheet.getRange("A1").values = "Hello from Office-JS";

因此,可能在ThisWorkbook模块中具有以下代码以在该上下文中显示“消息”框:

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    If Sh.Name = "NewSheet" Then
        If Sh.Range("$A$1").Value2 <> vbNullString Then
            MsgBox Sh.Range("$A$1").Value2
        End If
    End If
End Sub

这里的好处是,即使Office-JS代码在创建工作表后写入工作表,VBA中的事件也只会在JavaScript代码完成后才运行,这意味着单元格A1中的值将及时更改。 VBA代码运行。

  ask by DecimalTurn translate from so

未解决问题?本站智能推荐:

2回复

使用Office-JS链接读写

我在解决如何在Office JS中链接同步时遇到问题-我想我必须先进行一次同步才能读取值,然后进行另一次同步才能将其写回-必须很简单,但我找不到链接示例。 基本上,我正在尝试编写与此VBA代码等效的代码,该代码通过数组进行读取和写入 甚至更简单
2回复

Excel JavaScript API 中是否存在在表名更改时触发的事件?

对于我正在开发的 Excel 加载项,我需要知道何时更改了表的名称。 Table的“Events”部分没有onNameChanged或类似的东西。 我已经尝试过onChanged是否也涵盖了名称更改,但在下面的代码段中,它不是由表的名称更改触发的。 代码段中的其他处理程序也不会触发。 我已经在 O
2回复

将 vba 转换为 Office-JS

我目前正在考虑将一些遗留的 vba 代码转换为 Office-js,我只是想就现有代码是否可以轻松传输以及它是否适用于客户端和 Web 版本的 Excel 提供一些建议。 如果那些比我更了解的人可以确认代码是多么容易转移到 office-js,那就太棒了(为
1回复

Excel 加载项:有时在单元格值更改后不会触发 Table OnChange 事件

我正在开发一个 Excel 插件,它允许使用 table onChanged将更改的表格单元格值与外部环境同步。 并注意到非常烦人的结果,如果用户高速更改值,某些值会被跳过。 我写了一个简单的片段,用于在表格单元格更改后更改颜色,如果您键入的速度太快,某些单元格不会更改颜色。 可以修复吗? 下面是
1回复

像 VBA 一样部署 Excel JavaScript 插件

我们一直通过直接向最终用户提供嵌入了 VBA 代码的 Excel 文件来向最终用户部署我们的最终产品。 我们现在已经使用 JavaScript Excel 插件完全迁移了相同的代码库。 现在,在使用 JavaScript 时,我们希望为最终用户提供相同的部署体验。 经验应该是这样的,他们只需要使用
2回复

如何在office-js的任务窗格[加载项]中列出所有工作簿表?

我想在任务窗格中列出工作簿的所有工作表。 这是一个office-js加载项。 最终我正在尝试创建一个目录,其中列出了工作表(可能稍后添加范围名称),并允许用户单击工作表并将其带到那里。 我很喜欢VBA,但不知道如何使用Office加载项。 经过几天的网络搜索,我希望能在这里找到帮助。
2回复

通过Excel API for Excel获取工作簿的所有VBA宏

在VBA中,我们可以使用例如Wb.VBProject.VBComponents来获取工作簿Wb所有VBA宏。 有谁知道Excel的JavaScript API是否提供任何对象或函数来访问它?
1回复

删除 Excel 工作簿 onSelectionChange 事件

我正在使用 Office.js 处理 Excel Web 加载项。 我为工作簿添加了 onSelectionChange 事件,后来尝试将其删除,但此事件仍然有效。 在这里您可以找到我使用 ScriptLab 创建的示例,该示例显示无法删除事件: https ://gist.github.com/s