Je suis un peu confus au sujet de la portée des plages nommées dans Excel. J'ai deux versions d'un classeur Excel. Parfois, les utilisateurs doivent copier les données d'une ancienne version du classeur dans une version plus récente. Certaines fonctions VBA personnalisées sont utilisées dans la plupart des calculs de cellules. Chacune de ces fonctions recherche environ 4 à 12 plages nommées sur la feuille. Cela semblait bien fonctionner ... Cependant, j'ai récemment découvert que lorsque deux versions du fichier sont ouvertes, les références VBA à toutes les plages nommées ne renvoient les valeurs qu'à partir du premier fichier qui a été ouvert (donc si la version plus récente de le formulaire a été ouvert en premier, puis l'ancienne version va agir comme certaines de ses données proviennent de la nouvelle version!). Les plages nommées du deuxième fichier semblent être ignorées par le second fichier, au moins dans le code VBA, tant que les deux fichiers restent ouverts. Si je ferme le classeur ouvert en premier, le second calculera correctement.Les plages nommées en double entre les classeurs provoquent des confusions dans mes fonctions personnalisées
J'ai trouvé une solution partielle: au lieu de le faire:
Blah = Range("valueXYZ").Value
Je le fais à la place:
Blah = ThisWorkbook.Names("namedCellXYZ").RefersToRange.Value
Cela fonctionne très bien, mais seulement sur la version plus récente du classeur. Je ne peux pas mettre à jour le code VBA dans l'ancienne version du classeur. Cela signifie que si les clients ouvrent l'ancienne version après que la nouvelle version est déjà ouverte, (donc les deux sont ouverts, mais l'ancien a été ouvert en second), l'ancienne version obtiendra les valeurs et les plages nommées de la version plus récente - et Rapportez donc des nombres et des plages incorrects. C'est mauvais. J'ai besoin d'un bon moyen d'empêcher l'ancienne feuille d'accéder aux plages nommées à partir du nouveau, mais je ne peux que modifier le nouveau. La seule chose que je peux penser est de renommer toutes les plages nommées et mettre à jour beaucoup de code VBA dans la nouvelle version - quelque chose qui est sujette aux erreurs et sonne comme un travail excessif.
Des suggestions? Par exemple, est-il possible d'afficher au moins un avertissement à l'utilisateur lorsque le second fichier est ouvert? Ou est-il possible d'utiliser VBA pour restreindre la portée des plages nommées? D'autres idées?
Bonne idée. Cependant, j'ai de la difficulté à faire fonctionner ce gestionnaire d'événements. –
Je l'ai fait fonctionner - j'ai dû redémarrer Excel pour que l'événement commence à fonctionner. Merci!!Pour autant que je sache, la version la plus récente n'a pas besoin de vérifier les classeurs qui sont déjà ouverts - le premier classeur ouvert a la priorité de toute façon (donc si l'ancienne version est ouverte en premier, les plages nommées fonctionnent correctement pour cela, et la nouvelle version est conçue correctement pour que cela fonctionne) (Ainsi, c'est seulement un problème si les anciennes versions sont ouvertes en second lieu). J'ai donc seulement besoin de mettre en place la fonction pour vérifier les classeurs qui s'ouvrent après le plus mis à jour. –
Oui, cela a du sens. Si l'utilisateur ouvre Ancien, Nouveau, Ancien se référera à Ancien (premier ouvert) et Nouveau se référera à Nouveau (références complètes) - donc pas de problème. Si l'utilisateur ouvre Nouveau puis Ancien, l'utilisateur doit être averti. Si vous voulez aller encore plus loin, vous pouvez afficher l'avertissement, puis demander à l'utilisateur s'il est acceptable de fermer et de rouvrir New pour résoudre le problème. S'il existe des modifications non enregistrées dans Nouveau, l'utilisateur doit enregistrer, ne pas enregistrer ou annuler. – devuxer