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

XL 2016 Deplacer des colonnes en fonction des valeurs d'une autre colonne

Dymouille

XLDnaute Nouveau
Bonjour à tous !

Je cherche à déplacer des colonnes en fonctions des valeurs d'une autre colonne,

Dans mon fichier joint j'aimerais que les colonnes avec comme entête ("state", "autre", "another") soient deplacés et mise juste avant la premiere colonne qui contient "ENER-"
pareil pour les colonnes avec comme entête ("state1", "autre1", "another1") mais devant la deuxieme colonne qui contient "ENER-" et ainsi de suite..

j'ai testé avec un la fonction .FindNext mais rien de bien concluant..

si vous avez des idées, merci d'avance !
 

Pièces jointes

  • forum.xlsx
    11.2 KB · Affichages: 5
Solution
Bonsoir @Dymouille ,

Avec une macro VBA dans le module de la feuille "Feuil1".
Cliquer sur le bouton Hop!

Le code:
VB:
Sub déplacer()
Dim dercol&, t, i&, j&, colState$, colEner$, n&, ss, se

   dercol = Cells(1, Columns.Count).End(xlToLeft).Column
   t = Range("a1:a2").Resize(, dercol)
   For j = 1 To UBound(t, 2)
      If t(1, j) Like "state*" Then colState = colState & ";" & j
      If t(2, j) Like "ENER-" Then colEner = colEner & ";" & j
   Next j
   If colState = "" Or colEner = "" Then Exit Sub
   ss = Split(Mid(colState, 2), ";"): se = Split(Mid(colEner, 2), ";")
   n = UBound(ss): If UBound(se) < n Then n = UBound(se)
   Application.ScreenUpdating = False
   For i = 0 To n...

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Dymouille ,

Avec une macro VBA dans le module de la feuille "Feuil1".
Cliquer sur le bouton Hop!

Le code:
VB:
Sub déplacer()
Dim dercol&, t, i&, j&, colState$, colEner$, n&, ss, se

   dercol = Cells(1, Columns.Count).End(xlToLeft).Column
   t = Range("a1:a2").Resize(, dercol)
   For j = 1 To UBound(t, 2)
      If t(1, j) Like "state*" Then colState = colState & ";" & j
      If t(2, j) Like "ENER-" Then colEner = colEner & ";" & j
   Next j
   If colState = "" Or colEner = "" Then Exit Sub
   ss = Split(Mid(colState, 2), ";"): se = Split(Mid(colEner, 2), ";")
   n = UBound(ss): If UBound(se) < n Then n = UBound(se)
   Application.ScreenUpdating = False
   For i = 0 To n
      Columns(--ss(i)).Resize(, 3).Cut
      Columns(--se(i)).Insert Shift:=xlToRight
   Next i
End Sub
 

Pièces jointes

  • Dymouille- déplacer colonnes- v1.xlsm
    22 KB · Affichages: 5
Dernière édition:

Dymouille

XLDnaute Nouveau
Bonsoir @mapomme ,

Merci pour ta réactivité !
Malheureusement je ne peux pas tester dès maintenant, mais demain matin

j'ai omis de le préciser mais la colonne ou se trouve la valeur "ENER-" est variable entre fichier,
En gros, j'ai un fichier de "contrôle" ou je génère et taille à ma sauce une dizaine de fichier depuis ce dernier,

peux-tu m’éclairer sur quelques petits points stp ?

VB:
Columns(--ss(i)).Resize(, 3).Cut

que veulent dire les "--" ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
VB:
VB:
Columns(--ss(i)).Resize(, 3).Cut
que veulent dire les "--" ?

ss est un tableau de chaines de caractère (obtenu par la fonction Split()). Il contient les numéros des colonnes où on trouve les valeurs "state". Ces numéros sont sous forme de texte et non de nombre.
ss(0)="5" et ss(1)="14"

Columns demande soit du texte sous forme Columns("e:e") soit un nombre Columns(5)
Nous, nous avons un numéro de colonne mais représenté sous forme de texte "5"
Il nous faut donc transformer le texte "5" en nombre 5.
Pour cela, on utilise la capacité VBA a vouloir convertir implicitement du texte en nombre dans une opération arithmétique. L'opération choisie est la double négation. La première négation transforme -"5" en -5.
La seconde négation transforme le -5 en 5.

En fait, on aurait aussi pu écrire plus formellement : Columns( Clng( ss(0) ) ) où Clng convertit un string en entier long.
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…