Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Déplacer des colonnes dans un ordre en vba

bloublou

XLDnaute Occasionnel
Bonsoir à tous,

Je voudrais déplacer les colonnes de la feuille 1 dans l'ordre de la feuille 2 en vba ?

Pouvez-vous m'aider ?

Bonne nuit

BlouBlou
 

Pièces jointes

  • Classeur1.xls
    18.5 KB · Affichages: 92
  • Classeur1.xls
    18.5 KB · Affichages: 97
  • Classeur1.xls
    18.5 KB · Affichages: 88

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Bonjour bloublou, 00

Ce problème de classement de colonnes est intéressant, je mets un Like au post #1.

Chère ânesse j'espère que tu ne m'en voudras pas de squatter ton fichier.

La macro :

Code:
Sub ClasserColonnes()
'Feuil1 et Feuil2 sont les CodeNames des feuilles
Dim col%, P1 As Range, P2 As Range, i%, n
Application.ScreenUpdating = False
col = Feuil2.Cells(1, Feuil2.Columns.Count).End(xlToLeft).Column
Set P1 = Feuil1.Columns(1).Resize(, col)
Set P2 = Feuil2.Rows(1)
1 For i = 1 To col
  If P1.Cells(1, i) <> "" Then
    n = Application.Match(P1.Cells(1, i), P2, 0)
    If IsError(n) Then MsgBox "Revoyez les titres en Feuil2 !": Exit Sub
    If i <> n Then
      P1.Columns(i).Cut
      P1.Columns(n + 1).Insert
      GoTo 1
    End If
  End If
Next
Application.Goto P1.Cells(1)
End Sub
A+
 

Pièces jointes

  • Classer les colonnes(1).xls
    61.5 KB · Affichages: 79

DoubleZero

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Re-bonjour, bonjour, job75 ,

... j'espère que tu ne m'en voudras pas de squatter ton fichier...

Moi ? T'en vouloir ? En ai-je l'air ?

Bravo, job75 et...

... A bientôt
 

Pièces jointes

  • Moi, t'en vouloir (point d'interrogation !).jpeg
    29.3 KB · Affichages: 152
  • Moi, t'en vouloir (point d'interrogation !).jpeg
    29.3 KB · Affichages: 194
  • Moi, t'en vouloir (point d'interrogation !).jpeg
    29.3 KB · Affichages: 201

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Re,

Il vaut mieux utiliser cette macro :

Code:
Sub ClasserColonnes()
'Feuil1 et Feuil2 sont les CodeNames des feuilles
Dim col1%, col%, P1 As Range, P2 As Range, i%, n
Application.ScreenUpdating = False
col1 = Feuil1.Cells(1, Feuil1.Columns.Count).End(xlToLeft).Column
col = Feuil2.Cells(1, Feuil2.Columns.Count).End(xlToLeft).Column
col = Application.Max(col1, col)
Set P1 = Feuil1.Columns(1).Resize(, col)
Set P2 = Feuil2.Rows(1)
1 For i = 1 To col
  If P1.Cells(1, i) <> "" Then
    n = Application.Match(P1.Cells(1, i), P2, 0)
    If IsError(n) Then MsgBox "Revoyez les titres en Feuil2 !": Exit Sub
    If i <> n Then
      P1.Columns(i).Cut
      P1.Columns(n - (i < n)).Insert 'True se convertit en -1
      GoTo 1
    End If
  End If
Next
Application.Goto P1.Parent.[A1]
End Sub
Elle permet de traiter le cas où le n° de la dernière colonne (col1) en Feuil1 est supérieur à cellui de Feuil2.

Fichier (2), mais testez aussi cette macro sur le fichier (1).

A+
 

Pièces jointes

  • Classer les colonnes(2).xls
    60 KB · Affichages: 57
Dernière édition:

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Re,

La variable P1 compliquait inutilement la compréhension, ceci est plus simple :

Code:
Sub ClasserColonnes()
'Feuil1 et Feuil2 sont les CodeNames des feuilles
Dim F As Worksheet, col1%, col%, P As Range, i%, n
Application.ScreenUpdating = False
Set F = Feuil1
col1 = F.Cells(1, F.Columns.Count).End(xlToLeft).Column
col = Feuil2.Cells(1, Feuil2.Columns.Count).End(xlToLeft).Column
col = Application.Max(col1, col)
Set P = Feuil2.Rows(1).Resize(, col)
1  For i = 1 To col
  If F.Cells(1, i) <> "" Then
    n = Application.Match(F.Cells(1, i), P, 0)
    If IsError(n) Then MsgBox "Revoyez les titres en Feuil2 !": Exit Sub
    If i <> n Then
      F.Columns(i).Cut
      F.Columns(n - (i < n)).Insert 'True se convertit en -1
      GoTo 1
    End If
  End If
Next
Application.Goto F.[A1]
End Sub
Fichier (3).

A+
 

Pièces jointes

  • Classer les colonnes(3).xls
    54 KB · Affichages: 68

bloublou

XLDnaute Occasionnel
Re : Déplacer des colonnes dans un ordre en vba

Bonsoir le forum, 00, job75,

Merci pour vos 2 solutions ca marche nickel
la macro serait équivalente si c'était sur la même feuille que l'on déplacerait les colonnes ?

Merci

BlouBlou
 

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Bonjour bloublou, 00, le forum,

la macro serait équivalente si c'était sur la même feuille que l'on déplacerait les colonnes ?

Justement les solutions précédentes déplacent les colonnes uniquement sur Feuil1.

Si l'on utilise Feuil2 c'est bien plus simple :

Code:
Sub ClasserColonnes()
Dim F1 As Worksheet, F2 As Worksheet, P As Range, i%, n
Set F1 = Feuil1: Set F2 = Feuil2 'CodeNames
Set P = Feuil2.Rows(1)
For i = 1 To F1.Cells(1, F1.Columns.Count).End(xlToLeft).Column
  If F1.Cells(1, i) <> "" Then
    n = Application.Match(F1.Cells(1, i), P, 0)
    If IsError(n) Then MsgBox "Revoyez les titres en Feuil2 !": Exit For
    F1.Columns(i).Copy F2.Cells(1, n)
  End If
Next
If IsError(n) Then F2.Rows("2:" & F2.Rows.Count).Delete
Application.Goto F2.[A1]
End Sub
Le copier/coller d'une feuille à l'autre suffit.

Fichiers (4) et (4 bis).

A+
 

Pièces jointes

  • Classer les colonnes(4).xls
    60 KB · Affichages: 66
  • Classer les colonnes(4 bis).xls
    61 KB · Affichages: 57

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Re,

Je reviens sur le déplacement des colonnes en Feuil1 en exploitant les excellentes idées de DoubleZero :

- insertion d'une ligne auxiliaire

- tri de gauche à droite :

Code:
Sub ClasserColonnes()
Dim F1 As Worksheet, F2 As Worksheet, col%
Dim P As Range, c As Range, r As Range
Application.ScreenUpdating = False
Set F1 = Feuil1: Set F2 = Feuil2
col = F2.Cells(1, F2.Columns.Count).End(xlToLeft).Column
Set P = F2.[A1].Resize(, col + 1)
F1.[1:1].Insert 'ligne auxiliaire
For Each c In F1.[A2].Resize(, col)
  Set r = P.Find(c, P(col + 1), xlValues, xlWhole)
  If r Is Nothing Then MsgBox "Revoyez les titres en Feuil2 !": Exit For
  c(0) = r.Column
  If r = "" Then r.EntireColumn.Hidden = True 'masque la colonne
Next
If Not r Is Nothing Then F1.Columns(1).Resize(, col) _
  .Sort F1.[A1], xlAscending, Header:=xlNo, Orientation:=xlLeftToRight 'tri
F1.[1:1].Delete 'suppression de la ligne auxiliaire
F2.Columns(1).Resize(, col).Hidden = False 'affichage des colonnes
Application.Goto F1.[A1]
End Sub
Avec le tri l'exécution est bien plus rapide.

Evidemment il y a des astuces (masquage des colonnes par exemple) pas faciles à comprendre

Fichier (5).

A+
 

Pièces jointes

  • Classer les colonnes(5).xls
    63.5 KB · Affichages: 64

pierrejean

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Bonjour bloublou DoubleZero Gerard

Un essai avec un code peut être un peu plus facile à comprendre a défaut d’être aussi rapide

Code:
Sub essai()
Dim dercol As Integer, derlin As Integer, tablo
Dim n As Integer, m As Integer, col As Integer, y As Range
dercol = Sheets("Feuil1").Cells(1, Columns.Count).End(xlToLeft).Column
derlin = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
tablo = Sheets("Feuil1").Range(Cells(1, 1).Address & ":" & Cells(derlin, dercol).Address)
Sheets("Feuil1").Range(Cells(1, 1).Address & ":" & Cells(derlin, dercol).Address).ClearContents
Sheets("Feuil2").Rows(1).Copy Destination:=Sheets("Feuil1").Range("A1")
Application.ScreenUpdating = False
For n = LBound(tablo, 2) To UBound(tablo, 2)
  Set y = Sheets("Feuil1").Rows(1).Find(tablo(LBound(tablo, 1), n), LookIn:=xlValues, lookat:=xlWhole)
  col = y.Column
  For m = LBound(tablo, 1) + 1 To UBound(tablo, 1)
    Sheets("Feuil1").Cells(m, col) = tablo(m, n)
  Next
Next
Application.ScreenUpdating = False
End Sub
 

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Bonjour pierrejean

D'accord mais la durée d'exécution peut avoir son importance.

Vois les 2 "petits" fichiers joints avec 10006 lignes.

Mon fichier utilise la version (5) de mon post #10.

A+
 

Pièces jointes

  • Petit fichier de pierrejean(1).zip
    189.9 KB · Affichages: 43
  • Petit fichier de job75(1).zip
    190 KB · Affichages: 44

bloublou

XLDnaute Occasionnel
Re : Déplacer des colonnes dans un ordre en vba

Bonsoir le forum, 00, job75, PierreJean,

Merci pour tous ces codes et de s'être pencher sur mon pb

Le code de job 75 est chaud à comprendre mais je vais essayer

Bonne soirée

BlouBlou
 

job75

XLDnaute Barbatruc
Re : Déplacer des colonnes dans un ordre en vba

Bonjour bloublou, Pierre, le forum,

Ah j'avais oublié le cas où la dernière colonne en Feuil1 est supérieure à celle en Feuil2.

Utilisez donc cette macro qui fonctionne dans tous les cas :

Code:
Sub ClasserColonnes()
Dim F1 As Worksheet, F2 As Worksheet, col1%, col%, c As Range, r As Range
Application.ScreenUpdating = False
Set F1 = Feuil1: Set F2 = Feuil2 'CodeNames des feuilles
col1 = F1.Cells(1, F1.Columns.Count).End(xlToLeft).Column
col = F2.Cells(1, F2.Columns.Count).End(xlToLeft).Column
col = Application.Max(col1, col)
F1.[1:1].Insert 'ligne auxiliaire
For Each c In F1.[A2].Resize(, col)
  Set r = F2.[A1].Resize(, col).Find(c, , xlValues, xlWhole)
  If r Is Nothing Then MsgBox "Revoyez les titres en Feuil2 !": Exit For
  c(0) = r.Column
  If r = "" Then r.EntireColumn.Hidden = True 'masque la colonne
Next
If Not r Is Nothing Then F1.Columns(1).Resize(, col) _
  .Sort F1.[A1], xlAscending, Header:=xlNo, Orientation:=xlLeftToRight 'tri
F1.[1:1].Delete 'suppression de la ligne auxiliaire
F2.Columns(1).Resize(, col).Hidden = False 'affichage des colonnes
Application.Goto F1.[A1]
End Sub
Fichier (6).

A+
 

Pièces jointes

  • Classer les colonnes(6).xls
    62.5 KB · Affichages: 77

Discussions similaires

Réponses
2
Affichages
185
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…