XL 2010 Problème (aléatoire ?) avec Range(Cells(a,b),Cells(c,d))

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Dans différentes macros de différents classeurs, j'ai un problème d'utilisation de Range avec des Cells.
Parfois la macro se déroule sans problème. Mais parfois la même macro plante.

Dans la dernière macro en date qui me pose souci, je tente de faire une copie d'une suite horizontale de 31 cellules d'une feuille "A1" d'un classeur "A", vers une suite horizontale de 31 cellules d'une feuille "B1" d'un classeur "B".
Le but est de copier une ligne de planning, d'un classeur vers un autre classeur.

la ligne qui plante est la suivante :
shSource.Range(Cells(LigEnCoursSource, ColNomsSource + 1), Cells(LigEnCoursSource, ColNomsSource + 31)).Copy shDest.Range(Cells(LigEnCoursDest, ColNomsDest + 1), Cells(LigEnCoursDest, ColNomsDest + 31))

j'ai aussi tenté :
shSource.Range(shSource.Cells(LigEnCoursSource, ColNomsSource + 1), shSource.Cells(LigEnCoursSource, ColNomsSource + 31)).Copy shDest.Range(shDest.Cells(LigEnCoursDest, ColNomsDest + 1), shDest.Cells(LigEnCoursDest, ColNomsDest + 31))

L'idéal serait de pouvoir faire la copie sans sélectionner le classeur "A" puis sa feuille "A1" pour faire le copier, puis sélectionner le classeur "B" puis sa feuille "B1" pour faire le coller, car (si je ne me trompe) ça fait perdre beaucoup de temps même avec le ScreenUpdating mis à FALSE.

Remarque :
shDest (le sheet de destination) est initialisé avec un "Set" : Set shDest = ThisWorkbook.Sheets(MoisAImporter)
Même principe pour le sheet source.
 
Solution
re
oui ca semble correcte
bien que c'est du tricotage en metant 16 et 24 directement
tu peux concatener aussi
shSource.Range("F"& 10+NbLigSource).Resize(1, NbJoursDuMois).Copy shDest.Range("F"& 10+NbLigDest)

enfin tu a compris l'essentiel je crois

TooFatBoy

XLDnaute Barbatruc
Et ça non plus, ce n'est pas bon ???
Range(Cells(5,10).Address & ":" & Cells(15,20).Address)

Désolé, je ne suis plus tout jeune et il me faut de plus en plus de temps pour comprendre même les choses les plus simples... :oops: :oops: :oops:


[edit]
Non, laisse tomber, plus ça va moins j'ai l'impression de comprendre...
[/edit]
 

TooFatBoy

XLDnaute Barbatruc
Si je relis toutes tes réponses, il n'y a que des "Pas bien !!!" et un seul "Bien !!!" qui me fait croire que la formule que j'ai donnée au départ est bonne et ne devrait pas planter :
shSource.Range(shSource.Cells(LigEnCoursSource, ColNomsSource + 1), shSource.Cells(LigEnCoursSource, ColNomsSource + 31)).Copy shDest.Range(shDest.Cells(LigEnCoursDest, ColNomsDest + 1), shDest.Cells(LigEnCoursDest, ColNomsDest + 31))
 

patricktoulon

XLDnaute Barbatruc
Et ça non plus, ce n'est pas bon ???
Range(Cells(5,10).Address & ":" & Cells(15,20).Address)

Désolé, je ne suis plus tout jeune et il me faut de plus en plus de temps pour comprendre même les choses les plus simples... :oops: :oops: :oops:


[edit]
Non, laisse tomber, plus ça va moins j'ai l'impression de comprendre...
[/edit]

SI SI !! ca c'est bon tu l'exprime en string par le concat des address
Range(Cells(5,10).Address & ":" & Cells(15,20).Address)---> BON

Range(Cells(5,10).Address , Cells(15,20).Address)--->pas bon

edit
shSource.Range(shSource.Cells(LigEnCoursSource, ColNomsSource + 1), shSource.Cells(LigEnCoursSource, ColNomsSource + 31)).Copy shDest.Range(shDest.Cells(LigEnCoursDest, ColNomsDest + 1), shDest.Cells(LigEnCoursDest, ColNomsDest + 31))
oui cela devrait etre bon a condition que
tes variables(LigEnCoursSource,
ColNomsSource, LigEnCoursDest , ColNomsDest) soient correctement renseignées
 

TooFatBoy

XLDnaute Barbatruc
OK, compris pour les guillemets. ;)

Alors une dernière question, si tu le veux bien.
Ma ligne de commande pourrait-elle s'écrire comme ça :
shSource.Range("F10").Resize(1, NbJoursDuMois).Offset(NbLigSource, 0).Copy shDest.Range("F10").Offset(NbLigDest, 0)

Pour recopier la zone F16:AH16 de la feuille du classeur source, en F24:AH24 de la feuille du classeur de destination, ça donnerait :
shSource.Range("F10").Resize(1, 29).Offset(6, 0).Copy shDest.Range("F10").Offset(14, 0)


[edit]
Trop tard... Bon ben, bonne nuit l'ami et merci pour cet échange !
[/edit]
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Je n'avais pas vu ta réponse, donc j'ai testé ma ligne orange, et... ça fonctionne parfaitement. Plus aucun plantage !
Plus aucun souci, même en enchaînant les douze mois de l'année.

c'est du tricotage en metant 16 et 24 directement
Pardon, mais je ne comprends pas bien cette réponse.

La ligne verte n'est qu'un exemple de ce que ça donnerait si mes deux variables avaient pour valeurs respectives 6 et 14.

La formule que tu donnes est effectivement plus jolie (et très facile à comprendre).
C'est donc celle que je vais utiliser dans ma macro. ;)
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Marcel32, patricktoulon

Je vois que durant mon absence, vous avez pas chômé ;)
Un rythme d'enfer
(au point qu'il y en a même qui m'ont pas vu passé...)
Au final, on revient à ce je disais, on a principalement besoin de connaitre la première cellule qui commence la plage de recopie.

On pourrait aussi passer par un tableau* si on ne veut que les valeurs seules ;)
(*: array)
 

TooFatBoy

XLDnaute Barbatruc
Au final, on revient à ce je disais, on a principalement besoin de connaitre la première cellule qui commence la plage de recopie.
Oui, et j'ai bien tenu compte de cette remarque que tu avais faite au départ, puisque la dernière ligne d'instruction que je propose (et qui est en suite simplifiée par @patricktoulon) ne fait bien référence qu'à une seule et unique cellule de destination ainsi que tu disais qu'il fallait faire. ;)

Quant au tableau, je pense que dans ce cas précis ce n'est pas utilisable (ou du moins pas intéressant à utiliser) puisque mon but est de copier le contenu des cellules, mais surtout leur mise en forme et également les éventuels commentaires associés aux différentes cellules.
 

TooFatBoy

XLDnaute Barbatruc
D'abord, merci à vous deux pour toutes vos réponses très instructives !

En suite, juste une remarque sur le fil complet :
J'ai mis du vert sur les messages qui me semblaient être les plus importants et qui ont permis d'arriver jusqu'à la solution finale. Mais bien sûr toutes vos réponses sont bonnes. ;)

Enfin, une toute petite remarque sur le fonctionnement du forum :
Je ne peux hélas pas peindre en vert le message #24 qui est pourtant la solution que j'utilise actuellement.
Bon, de toutes façons je vais utiliser la réponse #25, donc ce n'est pas bien grave. Mais si @patricktoulon n'avait pas répondu et donné une formule un peu plus simple, je n'aurais pas pu mettre en évidence la bonne solution. Dommage.
 

Discussions similaires

Réponses
8
Affichages
861

Statistiques des forums

Discussions
314 782
Messages
2 112 919
Membres
111 701
dernier inscrit
aelbachiri