Macro :Transposer une colonne en ligne

azerty1956

XLDnaute Nouveau
salut le forum,

Je suis un débutant en VBA, mes connaissances sont très limitées, ci-dessous je vous explique ce que je souhaite faire en espérant que quelqu'un pourra m'éclairer.

Je souhaite transposer une colonne Z d'une feuille 1 en ligne 1 sur la feuille 2 (à partir de la cellule (1,4) inclus).

Sur la feuille 1 de mon excel :

Dans un premier temps je dois automatiser la création de cette colonne Z qui correspond à la concaténation des colonnes G jusqu'à Q si la condition suivante est respectée : les cellules de la colonne X = Main.

Dans un second temps je veux classer cette colonne afin d'éliminer les doublons un à un (car dans mon cas les concaténations peuvent avoir le même nom).

Sur la feuille 2 de mon excel :

Finalement je souhaite coller les valeurs des concaténations de la colonne Z de la feuille 1 à la feuille 2 en les transposant. (coller dans la feuille 2 à partir de la cellule (1,4) inclus).
 

vbacrumble

XLDnaute Accro
Re : Macro :Transposer une colonne en ligne

Bonjour



Avec un fichier exemple, la vision de la question serait plus claire.

EDITION: sans fichier mais en utilisant le macro recorder
Code:
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 10/03/2009 par VBACrumble
'

Range("Z1:Z" & [Z65536].End(xlUp).Row).NumberFormat = "General"
    Range("Z1").FormulaR1C1 = _
        "=IF(RC[-2]=""Main"",CONCATENATE(RC[-23],RC[-22],RC[-21],RC[-20],RC[-19],RC[-18],RC[-17],RC[-16],RC[-15],RC[-14],RC[-13],RC[-12],RC[-11],RC[-10],RC[-9]),"""")"
    Range("Z1").AutoFill Destination:=Range("Z1:Z12"), Type:=xlFillDefault
    With Range("Z1:Z12")
    .NumberFormat = "@"
    .Value = .Value
    End With
    Range("Z1:Z12").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "AC1"), Unique:=True
    Range("AC1:AC9").Copy
    Sheets("Feuil2").Range("Z1").PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _
        , Transpose:=True
       ' Application.CutCopyMode = False
End Sub
 
Dernière édition:

azerty1956

XLDnaute Nouveau
Re : Macro :Transposer une colonne en ligne

j'ai déjà utilisé l'enregistreur des macros mais étant très novice en vba je ne vois pas comment faire.
Je vous mets un bout de mon tableau. tout a été fait à la main, et je souhaite automatiser celà.

Je souhaite transposer une colonne Z d'une feuille 1 en ligne 1 sur la feuille 2 (à partir de la cellule (1,4) inclus).

Sur la feuille 1 de mon excel :

Dans un premier temps je dois automatiser la création de cette colonne Z qui correspond à la concaténation des colonnes G jusqu'à Q si la condition suivante est respectée : les cellules de la colonne X = Main.

Dans un second temps je veux classer cette colonne afin d'éliminer les doublons un à un (car dans mon cas les concaténations peuvent avoir le même nom).

Sur la feuille 2 de mon excel :

Finalement je souhaite coller les valeurs des concaténations de la colonne Z de la feuille 1 à la feuille 2 en les transposant. (coller dans la feuille 2 à partir de la cellule (1,4) inclus).

Si vous avez d'autres idées pour générer automatiquement les clés de la feuille 2 à partir de la feuille 1 sans doublons, on peut éviter les étapes que j'ai énoncé précédemment.

NB: ci joint tableaux
 

Pièces jointes

  • forum1.zip
    9 KB · Affichages: 68
  • forum1.zip
    9 KB · Affichages: 62
  • forum1.zip
    9 KB · Affichages: 68
Dernière édition:

azerty1956

XLDnaute Nouveau
Re : Macro :Transposer une colonne en ligne

Je vous ai mis l'esquisse de code que j'ai fait, mais j'ai un problème : les clés correspondent en fait à la concaténation des colonnes G jusqu'à Q si la condition suivante est respectée : les cellules de la colonne X = Main.

Je ne sais pas comment je pourrais introduire dans le code une condition sur le fait de ne « copier/coller transposé » les concaténations que si sur la colonne X il y a écris Main.

Merci d'avance pour l'aide.

Code:
Sub test()
Dim i As Long, NoCol As Integer, laClef As String, tablo As Variant, c As Range

    For i = 2 To Split(Worksheets("feuille1").UsedRange.Address, "$")(4)
        tablo = Range(Cells(i, 1), Cells(i, 17)).Value
        For NoCol = 7 To 17
            laClef = laClef & tablo(1, NoCol) 'je ne comprend pas comment tu définis laClef? pourquoi tu répète le mot laClef 2 fois?
            With Worksheets("feuille2").Range("D1:" & Split(Worksheets("Main Thresh").UsedRange.Address, ":")(2))
     Set c = .Find(laClef)
     If c Is Nothing Then
          'comment on fait pour coller "la clé Colonne en lettre transposé" en ligne sur la feuille 2?
          NoCol = Worksheets("feuille2").Cells(1, Columns.Count).End(xlToLeft).Column + 1
     End If
End With
        Next
        laClef = ""
    Next
End Sub
 

azerty1956

XLDnaute Nouveau
Re : Macro :Transposer une colonne en ligne

Le problème est résolu mais un nouveau problème est apparu les clés que je dois avoir sur la premiere ligne de la feuille 2 correspondent en fait à la concaténation des colonnes G jusqu'à Q de la feuille 1 si la condition suivante est respectée : les cellules de la colonne X ( de la feuille 1)= Main.

Je ne sais pas comment je pourrais introduire dans le code une condition sur le fait de ne « copier/coller transposé » les concaténations que si sur la colonne X de la feuille 1 il y a écris Main.

voila le code :

Sub test67()
Dim PlageSource As Range
Dim FeuilleResultat As Worksheet
Dim NumColonneResultat As Integer
Dim NumLigneResultat As Integer
Dim Cell As Range
Dim Un As Collection
Dim i As Long

' nommer tous les endroits sur lesquels on travaille
Set PlageSource = Worksheets("EMR").Range("Z:Z")
Set FeuilleResultat = Worksheets("Main Thresh")
NumColonneResultat = 256
NumLigneResultat = 1

' creer une liste sans doublons, d'après un tuto de Silkyroad
Set Un = New Collection
On Error Resume Next
'Boucle sur la plage de cellule
For Each Cell In PlageSource
'If Cell <> "" Permet de ne pas prendre en compte les cellules vides
'Un.Add Cell, CStr(Cell) Ajoute le contenu de la cellule dans la collection
'le 2ème argument Cstr(cell) est le TAG de l'élément. Le tag est unique, c'est ca qui évite les doublons
'ici on choisi le contenu de la cellule, transformé en chaine de caractere (par Cstr)
If Cell <> "" Then Un.Add Cell, CStr(Cell)
Next Cell
On Error GoTo 0

'Boucle sur les éléments de la collection
'les écrire dans feuille2, en chagneant de colonne à chaque fois
For i = 2 To Un.Count
FeuilleResultat.Cells(NumLigneResultat, 2 + i) = CStr(Un(i).Value)
Next i

Set Un = Nothing
End Sub


Merci d'avance
 

Discussions similaires

Réponses
10
Affichages
406
Réponses
5
Affichages
193

Statistiques des forums

Discussions
312 677
Messages
2 090 815
Membres
104 673
dernier inscrit
lautard