Я написал что-то вроде этого некоторое время назад и не могу найти его, и мне это снова понадобилось. Поэтому я просто написал это снова и думаю, что понял правильно:
Public Function IsRunningInIde() As Boolean
Static bFlag As Boolean
bFlag = Not bFlag
If bFlag Then Debug.Assert IsRunningInIde()
IsRunningInIde = Not bFlag
bFlag = False
End Function
Никаких ошибок не возникает.
Нет сброса ошибки.
Всего одна функция.
Строка 1: «Статическое» объявление «bFlag» приводит к тому, что значение bFlag прилипает к нескольким вызовам «IsRunningInIde». Мы хотим этого, потому что я вызываю эту функцию внутри себя, и я не хотел засорять функцию входными параметрами, которые не нужны пользователю.
Строка 3: «Debug.Assert» не вызывается, когда не работает в IDE. Таким образом, только когда в IDE IsrunningInIde вызывается рекурсивно.
Строка 2: если не в рекурсивном вызове, bFlag начинает false и получает значение true. Если в рекурсивном вызове (происходит только при запуске в IDE), он начинается как true и возвращается в false.
Строка 3: вызывать «IsRunningInIde» только в том случае, если его рекурсивно еще нет в этой функции, проверяя, имеет ли значение bFlag значение true.
Строка 4: при рекурсивном вызове всегда возвращает True, что на самом деле не имеет значения, но не приводит к сбою Assert. Если не в рекурсивном вызове, то возвращает «Not bFlag», который bFlag теперь «False», если IsRunningInIde вызывался рекурсивно, и bFlag «True», если не вызывается рекурсивно. Таким образом, Not bFlag возвращает «True», если он работает в IDE.
Строка 5: очищает bFlag, чтобы он всегда был «ложным» в начале следующего вызова этой функции.
Трудно объяснить, лучше обдумать это в обоих сценариях.
Если вы хотите, чтобы код был проще для понимания, не используйте его.
Если есть проблема с этим кодом, я прошу прощения и сообщите мне, чтобы я мог это исправить.