Autres VBA Ordre commun dans plusieurs feuilles

Barb4

XLDnaute Nouveau
Bonjour,
Je me heurte à un problème sur excel. Il se trouve que mon classeur a plusieurs feuilles avec un "motif" (façon INDIRECT). C'est-à-dire que pour 10 feuilles, il a les mêmes colonnes (mais avec des valeurs différentes), sauf que certaines colonnes sont dans le désordre. J'aimerai savoir si il existe une macro qui me permettrait de remettre dans l'ordre ces colonnes selon un ordre référence. A noter que j'aimerai que les valeurs en-dessous de l'en-tête se déplacent avec les en-têtes.
En guise d'exemple, voici un classeur avec 11 feuilles dont une avec l'ordre référent.
Merci pour votre patience,

Bonne soirée.
 

Pièces jointes

  • Classeur exemple.xlsx
    18.1 KB · Affichages: 12
Solution
Avec le classeur c'est mieux !
RE..
VB:
Sub ordre()
    Dim C, COL&, Sh As Worksheet
    Application.ScreenUpdating = False
    COL = 3
    For Each Sh In Sheets(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))
            With Sh
                 For Each C In Array("France", "Canada", "USA", "Angleterre", "Brésil", "Allemagne", "Russie", "Portugal", "Espagne", "Norvège", "Soudan", "Australie")
                    If .Cells(4, COL) <> C Then
                        .Columns(Application.Match(C, .[4:4], 0)).Cut
                        .Cells(1, COL).Insert Shift:=xlToRight
                    End If
                    COL = COL + 1
                Next
            End With
            COL = 3
    Next...

Jacky67

XLDnaute Barbatruc
Bonjour,
Je me heurte à un problème sur excel. Il se trouve que mon classeur a plusieurs feuilles avec un "motif" (façon INDIRECT). C'est-à-dire que pour 10 feuilles, il a les mêmes colonnes (mais avec des valeurs différentes), sauf que certaines colonnes sont dans le désordre. J'aimerai savoir si il existe une macro qui me permettrait de remettre dans l'ordre ces colonnes selon un ordre référence. A noter que j'aimerai que les valeurs en-dessous de l'en-tête se déplacent avec les en-têtes.
En guise d'exemple, voici un classeur avec 11 feuilles dont une avec l'ordre référent.
Merci pour votre patience,

Bonne soirée.
Bonsoir,
Une proposition en vba avec ce code
VB:
Sub ordre()
    Dim C, COL&, Sh As Worksheet
    COL = 4
    For Each Sh In ThisWorkbook.Worksheets
        If UCase(Left(Sh.Name, 1)) = "G" Then
            With Sh
                For Each C In Array("France", "Canada", "USA", "Angleterre", "Brésil", "Allemagne", "Russie")
                    If .Cells(5, COL) <> C Then
                        .Columns(Application.Match(C, .[d5:j5], 0) + 3).Cut
                        .Cells(1, COL).Insert Shift:=xlToRight
                    End If
                    COL = COL + 1
                Next
            End With
            COL = 4
        End If
    Next
    Application.CutCopyMode = False
End Sub
 

Pièces jointes

  • Classeur exemple.xlsm
    30.2 KB · Affichages: 3
Dernière édition:

Barb4

XLDnaute Nouveau
Bonsoir,
Une proposition en vba avec ce code
VB:
Sub ordre()
    Dim C, COL&, Sh As Worksheet
    COL = 4
    For Each Sh In ThisWorkbook.Worksheets
        If UCase(Left(Sh.Name, 1)) = "G" Then
            With Sh
                For Each C In Array("France", "Canada", "USA", "Angleterre", "Brésil", "Allemagne", "Russie")
                    If .Cells(5, COL) <> C Then
                        .Columns(Application.Match(C, .[d5:j5], 0) + 3).Cut
                        .Cells(1, COL).Insert Shift:=xlToRight
                    End If
                    COL = COL + 1
                Next
            End With
            COL = 4
        End If
    Next
    Application.CutCopyMode = False
End Sub
Je reviens vers vous, car je me demandais quelque chose, imaginons mes feuilles auraient été nommées 1,2,3,4,... et sans lettres communes. Je me demandais comment les sélectionner dans ce code à la place de
Code:
If UCase(Left(Sh.Name, 1)) = "G" Then
Je sais que je rajoute de la difficulté mais je préférais sélectionner des feuilles spécifiques dans le cas où d'autres feuilles du classeur ne seraient pas concernées par le code.

Merci pour votre réactivité et votre patience,

Bonne journée.
 

Jacky67

XLDnaute Barbatruc
Je reviens vers vous, car je me demandais quelque chose, imaginons mes feuilles auraient été nommées 1,2,3,4,... et sans lettres communes. Je me demandais comment les sélectionner dans ce code à la place de
Code:
If UCase(Left(Sh.Name, 1)) = "G" Then
Je sais que je rajoute de la difficulté mais je préférais sélectionner des feuilles spécifiques dans le cas où d'autres feuilles du classeur ne seraient pas concernées par le code.

Merci pour votre réactivité et votre patience,

Bonne journée.
RE...
Hello Job75 , Phi69970 :)
Si la modification de job75 ne devait pas convenir , alors donner le nom des feuilles à traiter ou ceux des feuilles à ne pas traiter. ou mieux, joindre le classeur .
 

Barb4

XLDnaute Nouveau
Bonjour,
Merci beaucoup pour vos réponses. J'ai l'impression d'abuser de votre temps et je m'en excuse.
Seulement, les nombres étaient juste un exemple.
J'aurai dû le faire dès le début, mais je pensais plus à des feuilles nommées par des lettres.
Par ailleurs je me demandais comment adapter vos codes si j'insérais une colonne de plus car au niveau de
Code:
 .Columns(Application.Match(C, .[d5:j5], 0) + 3).Cut
VBA m'indique une erreur lorsque je veux faire par exemple, de d4:n4.
Le mieux étant de vous donner un classeur avec la disposition que j'aimerai, comme cela de trop vous déranger avec mes questions de débutant.
A préciser que uniquement les feuilles A à J sont concernées et Base et Pays sont exclues du code.
Encore merci de votre aide si précieuse !
Cdt.
 

Barb4

XLDnaute Nouveau
Bonjour,
Merci beaucoup pour vos réponses. J'ai l'impression d'abuser de votre temps et je m'en excuse.
Seulement, les nombres étaient juste un exemple.
J'aurai dû le faire dès le début, mais je pensais plus à des feuilles nommées par des lettres.
Par ailleurs je me demandais comment adapter vos codes si j'insérais une colonne de plus car au niveau de
Code:
 .Columns(Application.Match(C, .[d5:j5], 0) + 3).Cut
VBA m'indique une erreur lorsque je veux faire par exemple, de d4:n4.
Le mieux étant de vous donner un classeur avec la disposition que j'aimerai, comme cela de trop vous déranger avec mes questions de débutant.
A préciser que uniquement les feuilles A à J sont concernées et Base et Pays sont exclues du code.
Encore merci de votre aide si précieuse !
Cdt.
Avec le classeur c'est mieux !
 

Pièces jointes

  • Classeur exemple2.xlsx
    24.9 KB · Affichages: 3

Jacky67

XLDnaute Barbatruc
Avec le classeur c'est mieux !
RE..
VB:
Sub ordre()
    Dim C, COL&, Sh As Worksheet
    Application.ScreenUpdating = False
    COL = 3
    For Each Sh In Sheets(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))
            With Sh
                 For Each C In Array("France", "Canada", "USA", "Angleterre", "Brésil", "Allemagne", "Russie", "Portugal", "Espagne", "Norvège", "Soudan", "Australie")
                    If .Cells(4, COL) <> C Then
                        .Columns(Application.Match(C, .[4:4], 0)).Cut
                        .Cells(1, COL).Insert Shift:=xlToRight
                    End If
                    COL = COL + 1
                Next
            End With
            COL = 3
    Next
    Application.CutCopyMode = False
End Sub
 

Pièces jointes

  • Classeur exemple V2.xlsm
    43.5 KB · Affichages: 5

Barb4

XLDnaute Nouveau
RE..
VB:
Sub ordre()
    Dim C, COL&, Sh As Worksheet
    Application.ScreenUpdating = False
    COL = 3
    For Each Sh In Sheets(Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"))
            With Sh
                 For Each C In Array("France", "Canada", "USA", "Angleterre", "Brésil", "Allemagne", "Russie", "Portugal", "Espagne", "Norvège", "Soudan", "Australie")
                    If .Cells(4, COL) <> C Then
                        .Columns(Application.Match(C, .[4:4], 0)).Cut
                        .Cells(1, COL).Insert Shift:=xlToRight
                    End If
                    COL = COL + 1
                Next
            End With
            COL = 3
    Next
    Application.CutCopyMode = False
End Sub
Merci pour tout !
 

job75

XLDnaute Barbatruc
Une solution qui utilise le tri horizontal :
VB:
Sub Tri_horizontal()
Dim w As Worksheet
Application.ScreenUpdating = False
Sheets("Ref").[C4:N4].Name = "P" 'nom défini
For Each w In Worksheets
    If w.Range("B4") = "Nb Produits" Then
        w.Rows(4).Insert 'insère une ligne 4 auxiliaire
        w.Range("C4:N4") = "=MATCH(R[1]C,P,0)" 'repères pour le tri
        w.Range("C4:N" & w.Rows.Count).Sort w.Rows(4), xlAscending, Orientation:=2 'tri horizontal
        w.Rows(4).Delete 'supprime la ligne auxiliaire
    End If
Next
End Sub
S'il y a beaucoup de lignes elle est nettement plus rapide.
 

Pièces jointes

  • Classeur exemple(1).xlsm
    39.5 KB · Affichages: 8

Discussions similaires

Statistiques des forums

Discussions
312 332
Messages
2 087 362
Membres
103 528
dernier inscrit
maro