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

  • Initiateur de la discussion Initiateur de la discussion Dymouille
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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...
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

Dernière édition:
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 "--" ?
 
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:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour