Может ли Office-JS инициировать процедуру события VBA Workbook или Worksheet? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь выяснить, есть ли способ сделать что-то в Office-JS, которое бы инициировало процедуру обработки события в Excel VBA, но похоже, что события VBA отключены во время выполнения кода JavaScript.

Допустим, например, что у меня есть книга с рабочим листом с именем «Лист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, а если нет, есть ли другое событие рабочего листа или рабочей книгичто может быть вызвано?

Немного контекста : Я пытался найти решение этого вопроса и подумалчто хорошим обходным путем было бы написать код VBA в ячейку с Office-JS, а затем использовать процедуру события Worksheet_Change для выполнения кода VBA, написанного в этой ячейке.

К сожалению, пока это не сработало,но я думаю, что стоит задать этот более конкретный вопрос, поскольку решение этой проблемы станет последним шагом к тому, чтобы позволить выполнять код VBA из Office-JS (что было бы неплохо).

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

После еще одного тестирования мне удалось обнаружить, что процедура события 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.

1 голос
/ 19 сентября 2019

Событие 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

РЕДАКТИРОВАТЬ : при рассмотрении ОП для исходного вопроса уже сработало большинство из этого ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...