Макрос "Не работает" из вызова на отдельном листе - PullRequest
0 голосов
/ 10 февраля 2020

Этот макрос работает по назначению с помощью кнопки на листе пакетного ввода:

Sub BatchTriggerOFF()

    Sheets("Batch Input").Unprotect
    Sheets("Batch Input").Range("G3:J3").Value = "Off"
    Sheets("SQL LOGIC").Calculate
    Sheets("Batch Input").Range("A12").Select
    Sheets("Batch Input").Shapes.Range(Array("Group 12")).ZOrder msoSendToBack
    Sheets("Batch Input").Protect

End Sub

Однако, когда BatchTriggerOFF вызывается из другого листа в той же книге, макрос также не изменяет диапазон (" G3: J3 "). Значение, ни Shapes.Range (Array (" Группа 12 ")). ZOrder msoSendToBack. Нет сообщения об ошибке.

If Sheets("SQL LOGIC").Range("B1") = "On" Then Call BatchTriggerOFF

Я пытался снять защиту листа пакетного ввода заранее, возиться с листами («Пакетный ввод»). Активировать, Листы («Пакетный ввод»). Выбрать и даже попытался вставить строку BatchTriggerOFF строка за строкой VBA непосредственно во второй макрос, но безрезультатно.

Что, по-видимому, приводит к тому, что BatchTriggerOFF не запускается при вызове из второго макроса / листа?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

[...] что-то не так со вторым предоставленным мною кодом, вероятно, не работает активно при изменении значения в Range ("B1")?

Точно. Процедуре, которая находится в стандартном модуле, нужно что-то, где-то , чтобы вызвать его. Может быть форма или кнопка на листе, может быть другой код VBA, но что-то должно вызвать его как-то .

Ни одна процедура не будет знать запускается при изменении Range("B1") на Sheets("SQL LOGIC"): вам нужно иметь код, который «срабатывает» при изменении ячейки на этом листе.

Способ сделать это - обработать * 1019 модуля рабочего листа * событие. Найдите свой лист SQL LOGI C в VBE Project Explorer (Ctrl + R), дважды щелкните по нему. В модуле code-behind для этой указанной таблицы c выберите Worksheet в раскрывающемся меню слева вверху панели кода; в раскрывающемся списке справа должно быть указано SelectionChange, а VBE должен был добавить закрытую процедуру, которая выглядит следующим образом:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Выберите Change из раскрывающегося списка справа; VBE создает приватную процедуру, которая выглядит следующим образом:

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

Теперь удалите обработчик SelectionChange, он вам не нужен, если вам не нужно отслеживать ячейки, которые пользователь выбрал . Поскольку мы хотим отслеживать ячейки, у которых изменилось , мы будем использовать событие Change листа. Эта процедура будет вызываться всякий раз, когда пользователь или ваш код изменяет что-либо на этом листе.

Поскольку мы хотим запускать код только тогда, когда специфицируется c ячейка изменилось, нам нужно условие, включающее параметр Target. Используя функцию Application.Intersect, мы можем получить ссылку на объект Range, равную Nothing, если два указанных диапазона не пересекаются; мы можем использовать эту информацию для спасения, если изменился не B1:

If Application.Intersect(Me.Range("B1"), Target) Is Nothing Then Exit Sub

Любой код, написанный после этого условия в процедуре обработчика события Worksheet.Change, будет работать только после изменения значения ячейки B1 - либо пользователем, набирающим значение, либо любым другим кодом, записывающим в эту ячейку (вам нужно отключить Application.EnableEvents, если вам нужно предотвратить запуск этого события, когда код вносит изменения, и вам не нужен обработчик для запуска).

Теперь, похоже, что ячейка B1 не собирается изменять , скорее, похоже, что она содержит формулу, результат которой может измениться после внесения изменений в "Пакет" Input "sheet.

Если это так, то событие Change не будет запущено, когда B1 пересчитает и теперь оценивает новое значение, потому что ячейка не изменила 1061 *, только его результат.

Если это ваш сценарий, то вы хотите обработать событие Calculate листа и иметь , который будет вашим триггером:

Private Sub Worksheet_Calculate()
    If Me.Range("B1").Value = "On" Then BatchTriggerOFF
End Sub
1 голос
/ 10 февраля 2020

Если вам нужно, чтобы ваш саб вызывался из любого (листового) модуля, переместите его в модуль! Функция / подпрограмма в модуле листа не может быть вызвана без указания имени модуля, которому она принадлежит, как вы можете сделать в модуле.

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