Excel VBA : selection d'une plage impossible [Résolu/Fermé]

Signaler
Messages postés
1085
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
3 octobre 2020
-
Messages postés
1085
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
3 octobre 2020
-
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.

2 réponses

Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
121
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,
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
121
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,
Messages postés
1085
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
3 octobre 2020
333
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
Messages postés
378
Date d'inscription
vendredi 29 avril 2011
Statut
Membre
Dernière intervention
31 décembre 2011
121
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,
Messages postés
1085
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
3 octobre 2020
333
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
Messages postés
1085
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
3 octobre 2020
333
Re,

Problème de copie de valeurs résolu.
Oubli de ma part : je n'avais pas d'abord sélectionné la feuille où se situe la plage de copie, ce qui donne :
Sheet("Blabla").Select 
Sheet("MaFeuille").Range("MaPlage").Value = ActiveSheet.Range(Cells(4, ColDAT), Cells(159, ColDAT + 11)).Value 
etc...
Cette manière de procéder est beaucoup plus rapide que de passer par les Copy, Select et PasteSpecial

Michel
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é.