SelectionChange es el evento integrado en el modelo de objetos de Excel para esto. Debería hacer exactamente lo que quiera, disparando cada vez que el usuario haga clic en cualquier lugar ...
No estoy seguro de entender sus objeciones a las variables globales aquí, solo necesitaría 1 si usa el evento Application.SelectionChange . Sin embargo, no necesitaría ninguno si utiliza el código de clase Workbook (para atrapar el evento Workbook.SelectionChange) o el código de clase Worksheet detrás (para atrapar el evento Worksheet.SelectionChange). (A menos que su problema sea el problema de "reinicio global de variables" en VBA, para el cual solo hay una solución: manejo de errores en todas partes. No permita ningún error no controlado, en lugar de eso, inicie sesión y/o "informe suave" como mensaje cuadro para el usuario.)
Es posible que también necesite interceptar los eventos Worksheet.Activate() y Worksheet.Deactivate() (o su equivalente en la clase Workbook) y/o Workbook.Activate and Workbook.Deactivate () eventos para que sepa cuándo el usuario ha cambiado las hojas de cálculo y/o los libros de trabajo. Los eventos de activación y desactivación de ventana deben completar este enfoque. Todos pueden llamar el mismo procedimiento exacto, sin embargo, todos denotan lo mismo: el usuario cambió el "foco", si se quiere.
Si no te gusta VBA, por cierto, puedes hacer lo mismo usando VB.NET o C#.
[Editar: Dbb hace un muy buen punto sobre el evento SelectionChange no captando un clic cuando el usuario hace clic dentro de la celda seleccionada actualmente. Si necesita recoger eso, entonces necesitaría usar subclases.]
Perfecto, gracias :) – haslo