VBA - transformer des colonnes en lignes

jcf

XLDnaute Nouveau
bonjour tout le monde,

J'ai besoin de vos conseils pour une macro (je débute).
J'ai un fichier Excel avec plusieurs colonnes :

ogu68.png


J'aimerai créer une nouvelle ligne pour chaque tranches de SDA (SDA_debut -> SDA_fin) en gardant les infos "code_site", "caisse", "NDI_ref_facturation".

Pour avoir le résultat ci-dessous :

99I2G.png


Vous avez des conseils ? une idée du déroulement du script ? des fonctions qui pourraient m'aider ?

Merci d'avance ! :)
 
C

Compte Supprimé 979

Guest
Re : VBA - transformer des colonnes en lignes

Bonjour Jcf et bienvenue sur ce forum

Il te faut déjà une boucle pour effectuer l'action sur toutes les lignes
Voci un début de code ;)
Code:
Sub Test()
Dim DLig as long, Lig as long
' Récupérer la dernière ligne remplie du tableau
DLig = Range("A" & Rows.Count).End(XlUp).Row
' Pour chaque ligne en partant de la fin, mieux pour insérer des lignes
For Lig = DLig to 2 Step -1
  ' Vérifier si sur la ligne il y a d'autres SDA
  ' Si oui insérer une ligne et couper coller les données
Next Lig
End Sub

A+
 

job75

XLDnaute Barbatruc
Re : VBA - transformer des colonnes en lignes

Bonjour jcf, bienvenue sur XLD,

Un conseil : joignez le fichier, ça évitera de se fatiguer à le refabriquer.

Quant au script : du couper/coller, en insérant les lignes nécessaires...

Edit : salut Bruno :)

A+
 

jcf

XLDnaute Nouveau
Re : VBA - transformer des colonnes en lignes

Bonjour, merci pour votre accueil et vos réponses.

Bruno j'ai une question.
Sur la boucle For, pourquoi le "to 2" ?

Code:
For Lig = DLig to 2 Step -1

Edit : ok je viens de comprendre, je plaisantais pas quand je disais que je débutais xD
 

Pièces jointes

  • SDA_macro_test.xlsx
    9.5 KB · Affichages: 257
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA - transformer des colonnes en lignes

Re,

La macro et le fichier :

Code:
Sub Regrouper()
Dim lig&, lig1&, col%
Application.ScreenUpdating = False
For lig = [A65536].End(xlUp).Row To 2 Step -1
  lig1 = lig + 1
  col = 6
  While Cells(lig, col) <> ""
    Rows(lig1).Insert
    Cells(lig, col).Resize(, 2).Cut Cells(lig1, 4)
    Cells(lig, 1).Resize(, 3).Copy Cells(lig1, 1)
    lig1 = lig1 + 1
    col = col + 2
  Wend
Next
[F:IV].Delete
End Sub

Edit : j'ai supposé que même sur Excel 2007 le tableau ne dépassera pas la ligne 65536 et la colonne IV.

S'il peut dépasser ces limites dites-le, je modifierai légèrement la macro.

A+
 

Pièces jointes

  • SDA_macro_test(1).xls
    43.5 KB · Affichages: 447
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA - transformer des colonnes en lignes

Re,

Pour éviter le couper ou copier/coller qui prennent trop de temps de calcul, procéder comme suit :

- mettre les colonnes A à E au format Texte (pour conserver les zéros devant les nombres)

- faire un transfert des valeurs avec cette macro :

Code:
Sub Regrouper()
Dim lig&, lig1&, col%
Application.ScreenUpdating = False
For lig = [A65536].End(xlUp).Row To 2 Step -1
  lig1 = lig + 1
  col = 6
  While Cells(lig, col) <> ""
    Rows(lig1).Insert
    Cells(lig1, 4).Resize(, 2) = Cells(lig, col).Resize(, 2).Value
    Cells(lig1, 1).Resize(, 3) = Cells(lig, 1).Resize(, 3).Value
    lig1 = lig1 + 1
    col = col + 2
  Wend
Next
[F:IV].Delete
End Sub
Fichier(2).

A+
 

Pièces jointes

  • SDA_macro_test(2).xls
    44.5 KB · Affichages: 315

jcf

XLDnaute Nouveau
Re : VBA - transformer des colonnes en lignes

remercie!!
ça me donne vraiment envie de me plonger à fond dans le VBA. T'as un livre que tu recommandes pour s'initier job75 ??
J'essaye de bien comprendre le code mais j'ai encore un petit doute.

Le resize c'est pour sélectionner plusieurs champs ? (sur l'aide F1 c'est pas super bien expliqué même si ça parait logique dans ton code)

On créée une ligne sous la ligne qu'on veut copier
Code:
Rows(lig1).Insert
Sur cette ligne on se positionne sur la 4eme colonne, on prend 2 champs (resize?) et on copie la valeur des deux champs de la colonne d'au dessus.
Code:
Cells(lig1, 4).Resize(, 2) = Cells(lig, col).Resize(, 2).Value

J'ai tout bon ?

Et sur le premier code je ne comprenais pas pourquoi il y avait un espace entre le CUT et le 2eme CELLS
Code:
Cells(lig, col).Resize(, 2).Cut Cells(lig1, 4)

merci d'avoir passé du temps à optimiser le code en tout cas!
 

job75

XLDnaute Barbatruc
Re : VBA - transformer des colonnes en lignes

Re,

Oui je pense que vous avez compris le Resize :

Code:
plage.Resize(n1, n2)
redimensionne plage en lui donnant n1 lignes et n2 colonnes, la 1ère cellule (en haut à gauche) restant la même.

Quant à l'espace après Cut ou Copy, c'est la syntaxe imposée par VBA, voyez l'aide.

A+
 

hellnar

XLDnaute Junior
Re : VBA - transformer des colonnes en lignes

Bonsoir,

Merci à @jcf
Ah j'aime bien pour la fonction Resize que je ne connaissais pas et qui va m'éviter des calculs de plages de cellules lourdes à souhait (par exemple pour traiter un Sudoku)

Hellnar
 

lantuan

XLDnaute Nouveau
Re : VBA - transformer des colonnes en lignes

Salut a tous,

Je souhaiterai faire exactement le contraire.

D'une liste en lignes je voudrais organiser mes données en colonne.

Pourriez vous me fournir le code VBA svp ?

Merci
 

Pièces jointes

  • EX1.XLS
    23.5 KB · Affichages: 168
  • EX1.XLS
    23.5 KB · Affichages: 162
  • EX1.XLS
    23.5 KB · Affichages: 174

Discussions similaires

Réponses
16
Affichages
554
Réponses
9
Affichages
219

Statistiques des forums

Discussions
312 502
Messages
2 089 024
Membres
104 007
dernier inscrit
Monvieux