Я пытаюсь импровизировать подобный Drupal механизм хука в VBA (продолжайте критиковать, я знаю, это звучит глупо). Причина моих усилий заключается в том, что я не нашел другого способа правильно распределить работу между командами, поэтому с этим механизмом я надеюсь привнести немного проверенной системы вызова крючков в Drupal. Я сделал это, все работает хорошо, но у меня есть небольшой недостаток.
Вот что я сделал: модуль диспетчера, который в основном перебирает все модули в моем проекте и проверяет, начинаются ли они с определенного префикса (подсказка, что они являются подключаемыми модулями) и когда он находит , это делает это:
Call Application.Run(Module.Name & ".hook_" & HookName)
Не очень оригинально, я знаю, но если я перебираю все модули и вызываю перехватчики для всех событий Workbook, он начинает пахнуть немного как AOP. Это означает, что я позволяю любому количеству модулей действовать, скажем, Workbook_SheetChange
, не загрязняя код в ThisWorkbook. Более того, разные люди будут работать над разными функциями внутри разных модулей подключения (БОЛЬШОЙ БОНУС).
Как я уже сказал, это работает, но я также должен вызвать Application.EnableEvents = False
перед этими вызовами и Application.EnableEvents = True
после вызовов, чтобы я не попадал в бесконечные циклы вызовов. Это тоже нормально.
Моя проблема: я хотел бы сделать общий обработчик ошибок выше всех хуков, чтобы, если один хук что-то испортил, я мог перехватить ошибку в моем верхнем диспетчере и повторно включить события. Звучит как хорошая идея, но поскольку я использую Application.Run()
, весь механизм обработки ошибок в середине нарушается, поэтому диспетчер не получит никакой ошибки, которая происходит внутри ловушки, которая вызывается подобным образом. Это также приведет к тому, что события приложения будут установлены на False
, что плохо (помните, что я устанавливаю их на False
непосредственно перед вызовом ловушки).
Мой вопрос: есть ли способ вызвать функцию с определенным именем в неизвестном модуле без Application.Run, чтобы мои ошибки всплывали до диспетчера? Я попробовал это:
Call Module.hook_WorksheetChange()
Но это не скомпилировалось (я не затаил дыхание из-за его успеха, но я надеялся ...). Здесь Module
- это Object
, который содержит VBComponent, а hook_WorksheetChange()
- это фактический Sub
, определенный в модуле.
Идеи, пожалуйста? Было бы не слишком элегантно, чтобы каждый хук всегда имел дело с очисткой Application.EnableEvents = True
- он должен заниматься только своей, специфичной для функции обработкой ошибок.