проблема со связанными сабами - PullRequest
0 голосов
/ 09 октября 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не разработчик, просто обычный парень, пытающийся использовать VBA в своем собственном проекте. В первый раз, когда я пишу в стеке, я прошу прощения, если я нарушаю какое-либо неписанное правило сообщества.

Привет всем, я пытаюсь запустить несколько подпрограмм, поэтому следующая начинается только тогда, когдапредыдущий закончен.

Проблема в том, что во время выполнения Excel продолжает сбой, а если я запускаю каждую подпрограмму вручную, у них вообще не возникает проблем.

До сих пор я использовал этот метод: сначала у меня естьмини-подпрограмма, которая присваивает значение = 1 глобальной переменной "oneclick", а затем вызывает первый макрос цепочки

, затем в каждом подпрограмме есть крошечный кусочек непосредственно перед концом:

sub macro1()

...macro code...

if oneclick=1 then
  call macro2
end if

end sub

и т. Д. Для всех сабвуферов, пока последний сабвуфер не сбросит переменную oneclick в ноль.

Я понятия не имею, почему происходит сбой. Я вижу, что на самом деле ни одна из этих подпрограмм действительно не закрывается до самого конца последней, будет ли это нарушать какие-либо ограничения кода? Я был бы на самом деле счастливее иметь один основной саб, который направляет процесс, а не полагаться на подобный кладж! Любое предложение?

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

1) сбой действительно является чем-то внезапным, даже не сообщением об ошибке, просто Excel завершает работу и снова открывается, в том же состоянии, в котором он был при первом запуске цепочки макросов.

2) Я согласен с вами, ребята, что должен быть мастер-саб, вызывающий меньшие, однако в прошлый раз, когда я пытался, у меня возник ряд проблем, потому что один макрос должен работать с результатами предыдущего искоро. Как вы говорите VBA ждать, пока предыдущий саб закончился?

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Лучше, если вы не будете связывать макросы, а вместо этого вызывать их из другого подпрограммы. Таким образом, у вас будет четкое представление о том, что вы делаете и в каком порядке.

Sub AllOfIt()
    macro1
    DoEvents

    macro2
    DoEvents

    macro3
End Sub

Sub macro1
    ...
End Sub

Sub macro2
    ...
End Sub

Sub macro3
    ...
End Sub

Как правило, не нужно беспокоиться о том, что что-то начинается до завершения предыдущего макроса. Этого не произойдет, если вы не сделаете что-то вроде Application.OnTime

0 голосов
/ 09 октября 2019

Что, вероятно, происходит, так это то, что oneclick не определен с помощью оператора Dim, поэтому по умолчанию он определен на уровне процедуры, то есть, если вы установите oneclick в 0 в другой Sub, ваша установка будет другойпеременная локального уровня / уровня процедуры, и ваша переменная в macro1 не изменяется, поэтому ваша цепочка макросов никогда не останавливается, что приводит к переполнению / аварийному завершению стека, как указано в одном из комментариев выше.

Так что либо определитеoneclick как общедоступная переменная (я рекомендую определить ее как Boolean, поскольку она в основном является переключателем .... True / False) или вы передаете переменную в качестве аргумента в цепочку макросов (Sub Macro2(ByRef oneclick as Boolean)).

Все вышесказанное, как сказано в одном из приведенных выше комментариев, вы можете иметь все свои цепочечные сабы в главном сабвуфере (macro1), так как они будут выполняться только один за другим, например

Sub macro1()
    Dim oneclick As Boolean

    oneclick = True         'Need to get set to true to start

    If oneclick Then Call macro2(oneclick)

    If oneclick Then Call macro3(oneclick)

    ........


End Sub

Sub macro2(ByRef oneclick As Boolean)

    oneclick = False            'One of your macros has to set oneclick to false to stop the chain/execution, probably under acondition

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