SelectionChange - это событие, встроенное в объектную модель Excel для этого. Он должен делать именно так, как вы хотите, стреляя в любое время, когда пользователь нажимает в любом месте ...
Я не уверен, что понимаю ваши возражения против глобальных переменных, вам понадобится только 1, если вы используете событие Application.SelectionChange. Однако в этом нет необходимости, если вы используете код класса Workbook позади (для перехвата события Workbook.SelectionChange) или код класса Worksheet позади (для перехвата события Worksheet.SelectionChange). (Если ваша проблема не является проблемой «сброса глобальной переменной» в VBA, для которой есть только одно решение: обработка ошибок везде. Не допускайте необработанных ошибок, вместо этого регистрируйте их и / или «мягко сообщайте» об ошибке как сообщение ящик для пользователя.)
Вам также может понадобиться перехватывать события Worksheet.Activate () и Worksheet.Deactivate () (или эквивалент в классе Workbook) и / или события Workbook.Activate и Workbook.Deactivate (), чтобы знать, когда пользователь переключил рабочие листы и / или рабочие тетради. Окно активации и деактивации событий должно завершить этот подход. Все они могут вызывать одну и ту же точную процедуру, однако все они обозначают одно и то же: пользователь изменил «фокус», если хотите.
Если вам не нравится VBA, кстати, вы можете сделать то же самое с помощью VB.NET или C #.
[Редактировать: Dbb очень хорошо отмечает, что событие SelectionChange не поднимает щелчок, когда пользователь щелкает в выбранной ячейке. Если вам нужно поднять это, вам нужно использовать подклассы.]