Bon ! J'ai ouvert ton fichier ! Cela m'étonnerait que tu es trouvé ce code tel quel, car il n'a aucune chance de fonctionner...
Pour mémoire, je te prie de noter que je m'insurge toujours quand je vois des bouts de code avec des Range ou Cells qui apparaissent ainsi sans référence à l'objet parent !
Tu ne dois jamais perdre de vue que lorsque tu veux renvoyer un objet Range, tu invoques la propriété Range, ou Cells, ou Rows... d'un objet Worksheet (lequel est renvoyé par la propriété Worksheets d'un objet Workbook, etc.) On remonte toujours ainsi juqu'à l'objet Application renvoyée par sa propriété Application. C'est à dire que l'on renvoie toujours des objets par l'intermédiaire de propriétés ou méthodes situées à un niveau supérieur dans la hiérarchie des objets Excel.
Dans beaucoup d'expression, on peut omettre Application, qui est implicite. Comme on travaille en général avec une seule application Excel, ça roule (il peut y avoir quelques problèmes si l'on entreprend de travailler avec plusieurs Excel...), et le plus souvent on travaille avec un seul classeur, pas de perte donc en omettant Application.Workbooks(xx) (si l'on travaille avec plusieurs, il sera judicieux de s'en soucier...). Par contre dès lors qu'on arrive au niveau feuille on en a toujours potentiellement plusieurs, et il convient de ne pas l'ignorer, et ne pas considérer qu'il est bon de se référer implicitement à la feuille active.
C'est ce que l'on appelle qualifier ses expressions, ou les doter de qualificateur d'objet.
Ainsi il convient toujours mieux d'écrire Worksheets(1).Range("A1"), voire même ActiveSheet.Range("A1") (si la feuille active est nécessairement toujours celle que l'on souhaite durant le déroulement de la procédure), plutôt que Range("A1"), expression non qualifiée. Le code est plus précis, et il sera aussi plus rapide à l'exécution. Et si l'on a à se référer plusieurs fois à un objet, on le met sous bloc With, cela améliorera encore.
Après ce préambule, venons-en à ton problème concret : si VBA ne renâcle pas devant un Range ou Cells sans rien devant, et qu'il va aller lui-même chercher quelle la feuille active du classeur actif de l'application dans laquelle il se trouve pour pouvoir y rattacher le Range invoqué, il n'en va pas de même pour tous les objets !
En rencontrant un Shapes tout seul, VBA refusera obstinément d'aller plus loin (et Excel aussi). Cette vaste collection ne peut être rattachée qu'à une feuille, et si on ne lui indique pas quelle feuille, rien ne va plus !
Tu dois en avoir une bonne dizaine dans ton code qui se baladent ainsi.... tu vois donc ce qui te reste à faire !