2010-07-23 6 views
2

J'ai un gestionnaire dans un add-in qui fait un peu de traitement comme modifier leurs feuilles de calcul.Comment ignorer certains événements dans Excel VBA pour App_SheetChange?

J'ai déjà optimisé le gestionnaire pour effectuer uniquement le traitement si la mise à jour de l'utilisateur se produit dans la plage dont dépend le traitement (une seule colonne).

Mais lorsque les utilisateurs suppriment des lignes ou insèrent des lignes, je n'ai pas besoin de lancer ma routine.

Comment puis-je détecter en quelque sorte que le changement qui a donné lieu à l'appel à App_SheetChange() était simplement insérer/supprimer une ligne ou d'une autre manière d'assurer que l'insertion/suppression de lignes ne remet pas App_SheetChange() en premier lieu (ce qui semble un peu lourd)?

Une mise en garde potentiellement importante: le code a pour vivre dans le complément, je ne peux pas ajouter de code de macro à des classeurs individuels.

Répondre

2

Je ne peux pas penser à un moyen de le faire. Peut-être que vous pourriez utiliser une solution de contournement, par exemple, pour vérifier si UsedRange, ou CurrentRegion, ou une plage nommée a perdu une colonne/ligne depuis App_SheetChange dernière.

Ou peut-être, vous pouvez définir la .ID de chaque cellule dans la colonne à l'adresse de cette même cellule, et si sur un App_SheetChange l'Application.Intersect(your_column, Target).ID ne représente pas l'adresse actuall du Application.Intersect(your_column, Target), puis une suppression (insertion) est arrivé, et au lieu d'exécuter votre macro, vous devez mettre à jour la propriété .ID de chaque cellule de la colonne à nouveau.

+0

Oui, même ici. Vous pouvez initialiser une variable globale de 'range (" votre namedrange "). Row.count' et sur' app_sheetchange() 'regardez pour voir si elle a été étendue/contractée avec un autre nombre de' range ("votre namedrange"). Row.count '. si c'est le cas, ne faites rien, sinon, faites votre chose. –