Excel VBA : selection d'une plage impossible

Résolu/Fermé
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 17 déc. 2011 à 13:07
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 18 déc. 2011 à 08:54
Bonjour,

Je suis en train de me battre avec un truc incompréhensible : je cherche à copier les valeurs d'une plage vers une autre, mais ma macro plante avec une erreur d'exécution 1004, que ce soit sur Excel 2003 ou 2010.

J'ai écrit le code suivant afin de localiser le problème, et je suis tombé sur un truc bizarre : je peux sélectionner les cellules variables de début et de fin, je peux sélectionner la plage entière à partir des cellules définies (ici G4 et R159 correspondants aux cellules variables), mais impossible de sélectionner la même plage avec les cellules variables !
Voici mon code :
        Sheets("Blabla").Select
        ActiveSheet.Cells(4, ColDAT).Select   'Fonctionne
        ActiveSheet.Cells(159, ColDAT + 11).Select    'Fonctionne
        ActiveSheet.Range("G4:R159").Select  'Fonctionne (c'est la même plage que la suivante)
        ActiveSheet.Range(Cells(4, ColDAT), Cells(159, ColDAT + 11)).Select   'Plante !

Bien entendu la variable ColDAT est définie As Long.....
Je n'y comprends rien.
Quelqu'un aurait-il une suggestion ?
Merci pour votre aide.

A voir également:

2 réponses

Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
17 déc. 2011 à 14:13
Bonjour,

Je viens de tester votre code et la ligne utilisée fonctionne parfaitement dans mon fichier essai.

Une piste éventuelle, assurez-vous que le variable ColDAT (que j'aurai plutôt définit en Integer au passage), n'est pas null, est un nombre entier et n'est pas inférieure ou égale 0.

Sinon n'hésitez pas à mettre votre fichier (sans donnée confidentielle) sur https://www.cjoint.com/ et à nous transmettre le lien pour que nous puissions vous aider davantage.

Bonne après-midi,
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
17 déc. 2011 à 16:39
Salut Syzygy et merci pour votre réponse.

ColDAT est positif, non nul. Sinon, les deux premières lignes du code ne fonctionneraient pas.
Bonne remarque concernant la définition de la variable en Integer (j'étais un peu généreux avec mon Long), mais ça ne change rien à mon problème.
J'ai essayé ce code sur une autre feuille de mon classeur : ça plante.
J'ai utilisé un autre nom pour la variable ColDAT (on ne sait jamais) : ça plante pareil.
Puis comme vous j'ai essayé le code sur un autre classeur, et là, ça fonctionne.
C'est à n'y rien comprendre.
Au moins, je sais maintenant que ça vient de mon fichier. Mais où ? Mystère.
Je ne peux pas suspecter une saturation du presse papier puisque la sélection de la même plage avec les références fixes se fait sans problème.
J'ai pas mal de plages nommées dans ce fichier. Y'a t'il une limitation sur le nombre de plages que peut traiter Excel ? Je pense que non, mais sait-on jamais, et en tout cas pourquoi celle-là et pas les autres ?

Je vais continuer mes investigations.

Merci encore.

Michel
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
17 déc. 2011 à 18:33
Bonsoir,

Sans votre classeur, difficile de vous aider plus, j'espère que vos recherches ont été fructueuse.
Sinon pour répondre à vos questions, je ne pense pas que les plages nommées aient une influence quelconque sur l'exécution de votre code.

Si vraiment vous ne trouvez pas de solution, essayez de vous passer de cette procédure. Avez-vous essayé de nommer la plage que vous souhaitez sélectionner de façon dynamique en utilisant la fonction DECALER() ?
Personnellement, je nomme la plupart de mes plages de données non fixes à l'aide de cette fonction, ce qui rend sa sélection plus facile en VBA.

Bonne soirée,
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
17 déc. 2011 à 19:21
Salut Syzygy,

Pour tout dire et sans rentrer dans les détails, c'est justement pour me débarrasser des fonctions décaler d'Excel actuellement en place que je cherche à copier les valeurs d'une plage vers une autre. Les fonctions, décaler ou autres, sont incompatibles avec ce que je souhaite faire par la suite.

Rassurez-vous, je maitrise assez bien vba et j'ai dans mes codes une foultitude de offset sur des ranges définis pour justement éviter d'avoir à nommer des plages et surtout parce que ces plages sont variables.

En fait, j'ai trouvé d'où venait l'erreur : en déplaçant le code de la feuille vers un module, la sélection de la plage variable se fait correctement. J'aurais pu y penser plus tôt.
Je suppose que la variable étant déclarée sur la feuille, elle n'est pas exportable vers une autre feuille pour aller y chercher une plage. Ce qui est surprenant c'est que la sélection d'une cellule était tout de même possible.
Enfin, l'essentiel c'est que ça marche.

Merci encore pour votre aide.

Michel
0
Syzygy Messages postés 378 Date d'inscription vendredi 29 avril 2011 Statut Membre Dernière intervention 31 décembre 2011 142
17 déc. 2011 à 21:44
Bonsoir,

Ravi que votre problème soit résolu. Il est toutefois possible de résoudre le problème autrement :

Comme vous l'avez remarqué, l'endroit où était stocké la procédure avait son importance. Le problème ne vient pas de la variable (si vous la remplacez par une constante écrite "en dur", le problème persiste). Le problème venait plutôt de la fonction comme le suggère Sylvau.

La commande suivante, (exécutée depuis la feuille "Feuil2")

Sheets("Blabla").Select
ActiveSheet.Range(Cells(4, ColDAT), Cells(159, ColDAT + 11)).Select

demande à Excel de sélectionner une plage située dans la feuille "Blabla" (ActiveSheet.Range) mais qui contient des cellules stockées dans la feuille depuis laquelle est exécutée le code (Cells(4, ColDAT),Cells(159, ColDAT + 11).
En effet si vous ne lui indiquez pas le contraire explicitement, Excel interprétera que la fonction Cells(4,ColDAT), renvoie une cellule contenue dans "Feuil2".
Et vous l'aurez compris, il est impossible de sélectionner une plage dans une feuille qui contient des cellules d'une autre feuille.

Pour résoudre le problème il fallait légèrement changer votre code en :

Sheets("Blabla").Select
ActiveSheet.Range(ActiveSheet.Cells(4, ColDat), ActiveSheet.Cells(159, ColDat + 11)).Select

Le code s'exécute ainsi normalement, ActiveSheet.Cells(4, ColDAT) renvoyant une cellule contenue dans la feuille active, c'est à dire "Blabla"

(Pour éviter la resaisie du ActiveSheet, vous pouvez bien entendu utiliser un With ActiveSheet -End With)

Bonne soirée,
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
18 déc. 2011 à 00:09
Merci Syzygy,
Je pense effectivement que vous avez raison. Un activesheet devant mes cells aurait résolu le problème.
Mais le module fonctionne tout aussi bien,donc j'en suis resté à cette solution.
Par contre j'ai voulu copier les valeurs d'une plage à l'autre avec les codes suivants :
'Range("DetailArchiveT").Value = Sheets("Blabla").Range(Cells(4, ColDAT), Cells(159, ColDAT + 11)).Value
'Range("DetailArchiveL").Value = Sheets("Blabla").Range(Cells(4, ColDAL), Cells(159, ColDAL + 11)).Value
mais ça bloque.
Sans doute est-ce un problème similaire.
J'ai été contraint de passer par des Select et PasteSpecial (xlPasteValues)
C'est pas très propre, mais ça à le mérite de fonctionner.
Je tenterai d'améliorer ça plus tard.

Bonne soirée,

Michel
0
oui...mais le fait de faire appel à une fonction qui elle même en utilise une autre (range(cells(.....)) doit avoir une incidence. Dans les autres exemples, c'est du direct...

J'ai déjà vu cela quelque part, mais sans pouvoir en dire plus. Désolé.
0