Attribuer un champ à tous les éléments de la ligne (exemple)

Résolu
DesTunK Messages postés 392 Statut Membre -  
Theo.R Messages postés 585 Statut Membre -
Bonjour,

Je souhaite convertir les lignes de mon tableau qui contiennent le même ID (COLA) en les mettant un colonne plutôt qu'en ligne (exemple si dessous)


COLA COLB COLC COLD
11 Philippe Johan
12 Didier Yann Luc

COLA COLB
11 Philippe
11 Johan
12 Didier
12 Yann
12 Luc


Merci d'avance à tous, cordialement
--
Règle N° 1 : Si tout va bien, ne touchez à rien

3 réponses

  1. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

    Avec une macro qui transfère les données de la Feuil1 vers la Feuil2.
    Sub Test()
    Dim WsS As Worksheet, WsC As Worksheet
    Dim DerLig As Long, LigneS As Long, LigneC As Long
    Dim DerColS As Integer, ColS As Integer
    Set WsS = Worksheets("Feuil1") 'Feuille source
    Set WsC = Worksheets("Feuil2") 'Feuille cible
    DerLigs = WsS.Range("A" & Rows.Count).End(xlUp)
    LigneC = 1
    For LigneS = 1 To DerLigs
    DerColS = WsS.Cells(LigneS, Columns.Count).End(xlToLeft).Column
    For ColS = 2 To DerColS
    WsC.Cells(LigneC, 1) = WsS.Cells(LigneS, 1)
    WsC.Cells(LigneC, 2) = WsS.Cells(LigneS, ColS)
    LigneC = LigneC + 1
    Next ColS
    Next LigneS
    End Sub

    A+
    1
    1. Theo.R Messages postés 585 Statut Membre 31
       
      Plus efficace que ma proposition car moins de Select's ;)

      Je dois apprendre à moins les utiliser pour gagner en perf :s

      Merci Gyrus ;)
      0
    2. Gyrus Messages postés 3360 Statut Membre 526 > Theo.R Messages postés 585 Statut Membre
       
      Salut Theo.R,

      C'est effectivement une très bonne habitude à prendre. Personnellement, je les bannis autant que faire se peut.

      A+
      0
    3. Theo.R Messages postés 585 Statut Membre 31 > Gyrus Messages postés 3360 Statut Membre
       
      Si je peux me permettre, j'aurais 3 questions sur ton style de code :

      1) "Set" : quelle différence fait-il ? On aurait pas le même résultat entre :
      Set WsS = Worksheets("Feuil1")
      et
      WsS = Worksheets("Feuil1")
      ?

      2) En m'autoformant au VBA, j'ai appris à définir les types d'objets qu'on utilise avec la fonction "Dim ... as ...", mais mon peu d'expérience m'amène à m'interroger sur l'utilité de cette procédure préalable.. Par exemple j'ai essayé ton code sans les "Dim" et il marche de la même manière ! Dans quels cas cela fait une différence ?

      3) je passe souvent par des .Select pour changer de feuille car mettre
      Sheets(1).Range("A1").value = X
      ne fonctionne pas. C'est pour cette raison que tu passes par la fonction Cells(...) plutôt que Range(...) ?

      Merci d'avance :D
      0
    4. Gyrus Messages postés 3360 Statut Membre 526 > Theo.R Messages postés 585 Statut Membre
       
      1) L'instruction Set permet d'attribuer une référence d'objet à la variable.

      Exemple :
      Avec l'instruction Set C=Range("A1") , la variable C représente la cellule A1.
      C.address renvoie $A$1 et C.value renvoie la valeur de A1.

      Par contre, si tu écris C=Range("A1"), Excel va comprendre que tu attribues la valeur de A1 à la variable C.

      2) L'instruction Dim déclare et alloue de l'espace de stockage pour une (ou plusieurs) variable(s). Là encore, bien que Excel tolère que les variables ne soient pas déclarées, il est important de prendre l'habitude de la faire, ne serait-ce que pour optimiser la mémoire. Pour t'obliger à effectuer cette déclaration, tu peux activer Option Explicit en amont de la procédure.

      3) Sheets(1).Range("A1").value = "X" fonctionne très bien.
      de même que :
      Sheets("Feuil1").Range("A1")="X"
      Sheets("Feuil1").Cells(1,1)="X"

      A+
      0
    5. Theo.R Messages postés 585 Statut Membre 31 > Gyrus Messages postés 3360 Statut Membre
       
      Merci pour tes réponses rapides ! :-)
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    Un essai avec une (petite) macro
    http://www.cjoint.com/c/FBjqeyzjtFI

    Cdlmnt
    1
    1. DesTunK Messages postés 392 Statut Membre 157
       
      Ca fonctionne parfaitement merci :)
      0
  3. Theo.R Messages postés 585 Statut Membre 31
     
    bonjour,

    Le code suivant fonctionne pour une feuille source en première position et une feuille vierge (cible) en 2ème position :
    Sub test()

    Dim DernLigne As Long
    DernLigne = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row

    m = 1
    For i = 1 To DernLigne
    Sheets(1).Select
    x = WorksheetFunction.CountIf(Rows(i & ":" & i), "<>") - 1

    Sheets(1).Select
    Range("A" & i).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Sheets(2).Select
    Range("B" & m).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True
    Application.CutCopyMode = False

    Range("B" & m).Select
    Selection.Copy
    Range("A" & m + 1 & ":A" & m + x).Select
    ActiveSheet.Paste
    Rows(m & ":" & m).Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    m = m + x

    Next i
    End Sub
    0
    1. DesTunK Messages postés 392 Statut Membre 157
       
      Ca fonctionne parfait, merci :)-
      0