OVH Cloud OVH Cloud

Macro pour réorganiser les colonnes de feuilles

5 réponses
Avatar
Christophe
Bonjour,

Excel 2007

Je recois des feuilles excel dont les formats et les titres sont
inconsistants. Je souhaiterai d=E9velopper une petite application qui
permettrai facilement de reorganiser les colonnes en fonction d'un
ordre d=E9fini =E0 chaque fois sans aller changer le code dans la macro.

Par exemple,
colonne C de feuille "Source" est copi=E9e-coll=E9e dans la colonne A de
la feuille "Cible"
colonne D de feuille "Source" est copi=E9e-coll=E9e dans la colonne B de
la feuille "Cible"
colonne E de feuille "Source" est copi=E9e-coll=E9e dans la colonne C de
la feuille "Cible"
colonne R de feuille "Source" est copi=E9e-coll=E9e dans la colonne E de
la feuille "Cible"
colonne S de feuille "Source" est copi=E9e-coll=E9e dans la colonne F de
la feuille "Cible", etc.

Pour ceci j'imagine un fichier avec 3 feuilles

1- Une feuille "Correspondances" avec 2 colonnes
Dans la colonne A un menu d=E9roulant permettant de d=E9finir la lettre de
la colonne de la feuille d'origine =E0 faire correspondre avec A, B,
C,D, E, F, G,........ , AX, AY, AZ,...BZ, etc..de la colonne B
correspondant =E0 la destination de la colonne dans la feuille r=E9sultat.

2- Une feuille "Source" dans laquelle je pourrais copier coller les
donn=E9es d'origine =E0 r=E9organiser

3- Une feuille "Cible" dans laquelle les donn=E9es r=E9organis=E9es.

Y-a plus qu' =E0 cr=E9er la macro maintenant:-)

Remerciements et sinc=E8res salutations.

Christophe

5 réponses

Avatar
isabelle
bonjour Christophe,

Sub Macro1()
For i = 1 To Sheets("Correspondances").Range("A65536").End(xlUp).Row
plg1 = Range(Sheets("Correspondances").Range("A" & i) & ":" & Sheets("Correspondances").Range("A" & i)).Address
plg2 = Range(Sheets("Correspondances").Range("B" & i) & "1").Address
Sheets("Source").Range(plg1).Copy Sheets("Cible").Range(plg2)
Next
End Sub

isabelle

Le 2010-08-09 17:06, Christophe a écrit :
Bonjour,

Excel 2007

Je recois des feuilles excel dont les formats et les titres sont
inconsistants. Je souhaiterai développer une petite application qui
permettrai facilement de reorganiser les colonnes en fonction d'un
ordre défini à chaque fois sans aller changer le code dans la macro.

Par exemple,
colonne C de feuille "Source" est copiée-collée dans la colonne A de
la feuille "Cible"
colonne D de feuille "Source" est copiée-collée dans la colonne B de
la feuille "Cible"
colonne E de feuille "Source" est copiée-collée dans la colonne C de
la feuille "Cible"
colonne R de feuille "Source" est copiée-collée dans la colonne E de
la feuille "Cible"
colonne S de feuille "Source" est copiée-collée dans la colonne F de
la feuille "Cible", etc.

Pour ceci j'imagine un fichier avec 3 feuilles

1- Une feuille "Correspondances" avec 2 colonnes
Dans la colonne A un menu déroulant permettant de définir la lettre de
la colonne de la feuille d'origine à faire correspondre avec A, B,
C,D, E, F, G,........ , AX, AY, AZ,...BZ, etc..de la colonne B
correspondant à la destination de la colonne dans la feuille résultat.

2- Une feuille "Source" dans laquelle je pourrais copier coller les
données d'origine à réorganiser

3- Une feuille "Cible" dans laquelle les données réorganisées.

Y-a plus qu' à créer la macro maintenant:-)

Remerciements et sincères salutations.

Christophe

Avatar
Christophe
Isabelle:

Merci. Je suis réellement admiratif. Tout d'abord parce que tu as
compris ma problématique alors que ma question était, comme souvent,
pour le moins absconse et, parce que la solution que tu proposes est
brillante même si je ne comprends pas tout.

J'ai bien entendu testé ta macro dans tous les cas de figure et il y a
un cas ou elle ne fonctionne pas. C'est lorsque une ou plusieurs
colonnes de la feuille source n'ont pas de correspondance avec une
colonne de la feuille cible.

Dans le cas ci-dessous la colonne B de la feuille cible ne correspond
à aucune colonne de la feuille source.

A ---------> A
---------> B
B ---------> C
C ---------> D

Dans ce cas, j'obtiens un Run-Time error '1004' Method Range of Object
Global Fialed.

Enfin, comment modifier la macro pour ajouter un titre au colonne A
et B de ma feuille "Correspondances"?

remercie et sincères salutations.

Christophe
Avatar
michdenis
Bonjour,

Si un jour, tu dois faire cela rapidement et tu ne veux pas prendre le temps de créer une macro,
tu peux faire ceci :

A ) Tu copies la ligne d'étiquette de ton tableau vers la feuille où tu veux afficher l'ordre des champs différemment.

B ) Dans la ligne que tu viens de copier dans ta plage de destination à l'aide d'un copier-coller, tu modifies l'ordre
de présentation des champs de la ligne d'étiquette comme tu le désires et tu fais disparaître ceux qui ne te sont pas
utiles le cas échéant. (attention à la casse des noms de ta ligne d'étiquette)

C ) De ta feuille de destination, tu appelles la commande "Filtre élaboré" (avancé), tu remplis le champ "plages", tu
laisses "vide" le champ critère et ayant activé le bouton radio "Copier vers un autre emplacement", tu indiques dans le
champ "Copier dans" l'adresse de la ligne d'étiquette que tu as emménagé dans ta feuille d'étiquette. Tu cliques sur
"OK" et toutes tes données sont copiées où il se doit.
C'est beaucoup plus long à écrire qu'à faire !

--
MichD
--------------------------------------------


"Christophe" a écrit dans le message de groupe de discussion :

Bonjour,

Excel 2007

Je recois des feuilles excel dont les formats et les titres sont
inconsistants. Je souhaiterai développer une petite application qui
permettrai facilement de reorganiser les colonnes en fonction d'un
ordre défini à chaque fois sans aller changer le code dans la macro.

Par exemple,
colonne C de feuille "Source" est copiée-collée dans la colonne A de
la feuille "Cible"
colonne D de feuille "Source" est copiée-collée dans la colonne B de
la feuille "Cible"
colonne E de feuille "Source" est copiée-collée dans la colonne C de
la feuille "Cible"
colonne R de feuille "Source" est copiée-collée dans la colonne E de
la feuille "Cible"
colonne S de feuille "Source" est copiée-collée dans la colonne F de
la feuille "Cible", etc.

Pour ceci j'imagine un fichier avec 3 feuilles

1- Une feuille "Correspondances" avec 2 colonnes
Dans la colonne A un menu déroulant permettant de définir la lettre de
la colonne de la feuille d'origine à faire correspondre avec A, B,
C,D, E, F, G,........ , AX, AY, AZ,...BZ, etc..de la colonne B
correspondant à la destination de la colonne dans la feuille résultat.

2- Une feuille "Source" dans laquelle je pourrais copier coller les
données d'origine à réorganiser

3- Une feuille "Cible" dans laquelle les données réorganisées.

Y-a plus qu' à créer la macro maintenant:-)

Remerciements et sincères salutations.

Christophe
Avatar
isabelle
bonjour Christophe,

en y ajoutant une condition pour vérifier si une valeur de la colonne A n'est pas vide
et en commençant la boucle for i = 1 par for i = 2 tu pourra ajouter les titres de colonnes (Source, Cible) sur la ligne 1

Sub test1()
For i = 2 To Sheets("Correspondances").Range("A65536").End(xlUp).Row
If Not Sheets("Correspondances").Range("A" & i) = "" Then
plg1 = Range(Sheets("Correspondances").Range("A" & i) & ":" & Sheets("Correspondances").Range("A" & i)).Address
plg2 = Range(Sheets("Correspondances").Range("B" & i) & "1").Address
Sheets("Source").Range(plg1).Copy Sheets("Cible").Range(plg2)
End If
Next
End Sub

et aussi étant donnée que la feuille "Correspondances" est souvent utilisée dans la macro
on peut réduire l'écriture du code en utilisant "With"

Sub test2()
With Sheets("Correspondances")
For i = 2 To .Range("A65536").End(xlUp).Row
If Not .Range("A" & i) = "" Then
plg1 = Range(.Range("A" & i) & ":" & .Range("A" & i)).Address
plg2 = Range(.Range("B" & i) & "1").Address
Sheets("Source").Range(plg1).Copy Sheets("Cible").Range(plg2)
End If
Next
End With
End Sub

isabelle

Le 2010-08-10 05:55, Christophe a écrit :
Isabelle:

Merci. Je suis réellement admiratif. Tout d'abord parce que tu as
compris ma problématique alors que ma question était, comme souvent,
pour le moins absconse et, parce que la solution que tu proposes est
brillante même si je ne comprends pas tout.

J'ai bien entendu testé ta macro dans tous les cas de figure et il y a
un cas ou elle ne fonctionne pas. C'est lorsque une ou plusieurs
colonnes de la feuille source n'ont pas de correspondance avec une
colonne de la feuille cible.

Dans le cas ci-dessous la colonne B de la feuille cible ne correspond
à aucune colonne de la feuille source.

A ---------> A
---------> B
B ---------> C
C ---------> D

Dans ce cas, j'obtiens un Run-Time error '1004' Method Range of Object
Global Fialed.

Enfin, comment modifier la macro pour ajouter un titre au colonne A
et B de ma feuille "Correspondances"?

remercie et sincères salutations.

Christophe

Avatar
Christophe
Isabelle:

A la fois formidable et didactique.

Mille mercis.

Christophe