typescript Office-JS能否触发VBA工作簿或工作表事件过程?

iyfjxgzm  于 2023-04-22  发布在  TypeScript
关注(0)|答案(2)|浏览(151)

我试图看看是否有一种方法可以在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代码的最后一块垫脚石(这将是非常好的)。

zaq34kh6

zaq34kh61#

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

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代码运行时及时更改。

jyztefdp

jyztefdp2#

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已经解决了大部分问题......

相关问题