我试图看看是否有一种方法可以在Office-JS中执行一些操作,从而触发Excel VBA中运行的事件过程,但看起来在JavaScript代码执行期间禁用了VBA事件。
例如,我有一个工作簿,其中工作表名为“Sheet 1”,在该工作表模块中,我有以下代码:
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代码的最后一块垫脚石(这将是非常好的)。
2条答案
按热度按时间zaq34kh61#
经过更多的测试,我发现工作簿对象的
Workbook_NewSheet
事件过程会通过使用Office-Js创建新工作表来触发:因此,可以在
ThisWorkbook
模块中使用以下代码来显示该上下文中的消息框:这里的好处是,即使Office-JS代码在创建工作表后写入工作表,VBA中的事件也只能在JavaScript代码完成后运行,这意味着单元格A1中的值将在VBA代码运行时及时更改。
jyztefdp2#
change
事件不会运行,但selectionchange
事件会运行,因此您可以使用它来触发代码:填充特定单元格,然后选择它板材模块:
编辑:回顾一下,原问题的OP已经解决了大部分问题......