Copie de données et agencement de ces données

chrsitophe Messages postés 11 Date d'inscription mercredi 16 avril 2008 Statut Membre Dernière intervention 21 avril 2008 - 17 avril 2008 à 19:34
Acta_6 Messages postés 29 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 22 avril 2008 - 18 avril 2008 à 12:59
J'ai un programme à faire qui doit recopier des valeurs d'une feuille vers une autre feuille un certain nombre de fois. Ce nombre de fois est correspond à la valeur d'une cellule.

L'exemple ci-dessous sera plus parlant:






feuil1
          B           C         D            E           
7       nb            2         1             2                                 nb est le nombre de fois que les données doivent être copiées
8   donnée1     typ1     typ2        typ3       
9   donnée2     rep1     rep2       rep3       

feuil2
           B           C         D            E            F            G
8   donnée1     typ1     typ1        typ2       typ3         typ3
9   donnée2     rep1     rep1       rep2       rep3         rep3

En réalité les données vont jusqu'à la ligne 38 et jusqu'à la colonne R

Voici mon code

For j = 3 To 18                         
'Boucle pour balayer les colonnes C (C=3) à R (R=18)

                                                   j correspond au numéro de la colonne pour la feuille1

    

   For h = (3 + k) To (2 + k + Cells(9, j).Value)        
 'Boucle pour copier les données en fonction 
                                                                                 du nombre "nb"

                 
h correspond au numéro de la colonne pour la feuille 2
                
 3 provient du fait que les données commence à partir de la colonne 'c'
                 2 provient du fait qu'il faut tenir compte du 3 et il faut ajouter -1
                 Cells(9, j).Value  est le nombre de fois à copier les données
                 k est une variable incrémentée après juste après cette boucle for, elle permet de ne
                  pas réécrire deux fois dans la même colonne dans la feuille 2        Sheets("feuil1").Select<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

        
Range("& j & 8: & j & 38").Select      'Séléction des données à copier

        Selection.Copy

       

        Sheets("feuil2").Select

        Range("& h & 8: & h & 38").Select   'Séléction de la plage à où les données seront récopier

       
ActiveSheet.Paste

    Next h

   

   

    
k = k + Cells(9, j).Value                        'Incrémentantation de la variable 'k' de Cells(9, j).Value

   

Next j

Ca fait longtemps que je suis sur cette macro et je ne vois plus comment m'en sortir.
Merci de votre aide

.....

2 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
18 avril 2008 à 00:08
Tu ne peux pas écrire ce genre de Range à partir de variables
Range("& j & 8: & j & 38").Select

j étant les colonnes et 8 à 38 étant les lignes

tu pourrais écrire
Range(Cells(Ligne, j), Cells(Ligne, j))
ça, c'est pour le principe d'écriture.

Pour ton problème et ton code... c'est quoi k et nb ?
et ça ?
For h = (3 + k) To (2 + k + Cells(9, j).Value)

Et écris tes messages un peu plus petit pour que ce soit lisible...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
Acta_6 Messages postés 29 Date d'inscription mercredi 25 avril 2007 Statut Membre Dernière intervention 22 avril 2008
18 avril 2008 à 12:59
MPi a raison pour la définition du range.
En plus, il est inutile, avant le Paste, de sélectionner toute la plage que va prendre tes cellules copiées. Sélectionne juste la première cellule. Ca devrait suffire.

Ensuite, ta 2ème boucle (celle pour copier les données) est inutile puisque la colonne d'insertion dépend forcément de la colonne de ta Feuill1 et du nb que tu récupères dans cette feuille aussi.

Il te suffit d'avoir une boucle For... to... ou Do...while qui va boucler nb fois pour faire ton Paste dans la colonne voulue de Feuill2.
Sans trop changer ton code (vais faire des ptits copier-coller), ca donnerait quelquechose de ce type:
Col2= 3     ' 1ère colonne dans laquelle tu dois copier tes données
For j =3 to 18
    Sheets("feuil1").Select
    Range(Cells(8, j), Cells(38, j)).select
    selection.Copy

    Sheets("feuil2").Select

    Nb=1
    Do
       Cells(8,Col2+Nb-1).Select
       ActiveSheet.Paste
    Loop Until Nb=Cells(9,j)       'cela dit, j'ai pas compris pourquoi c'était pas la ligne 7 mais bon...
    Col2=Col2+Nb
Next j  

Bon, j'ai juste planché sur tes boucles un peu complexe a mon gout mais le reste du code (les copy-paste) sont a toi.

J'espère que ca t'aidera.
0
Rejoignez-nous