XL 2016 Pour les pros de la manipulation de données

cortilolo

XLDnaute Nouveau
Bonjour à tous,
j'ai besoin d'une aide car ça fait un moment que je suis sur un truc qui a l'air hyper simple mais que je n'arrive pas à automatiser.
En fichier joint, je vous laisse le fichier avec deux onglet.
dans l'onglet j'ai c'est un extrait d'une base de données que j'ai
dans l'onglet je veux, c'est un extrait de la base de données que je voudrais obtenir

En résumé je veux mettre des attributs de champ qui sont en colonne en ligne

Merci d'avance de votre aide
 

Pièces jointes

  • test.xlsx
    8.7 KB · Affichages: 18

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Cortilolo,
Un essai en PJ avec :
VB:
Sub Worksheet_Activate()
    Dim T, L%, L2%, Ligne%
    Set F = Sheets("J'ai")
    Application.ScreenUpdating = False
    Range("A1:B" & Range("A65500").End(xlUp).Row).ClearContents
    T = F.[A1].CurrentRegion
    Ligne = 1
    For L = 1 To UBound(T)
        For L2 = 2 To UBound(T, 2)
            If T(L, L2) <> "" Then
                Cells(Ligne, 1) = T(L, 1)
                Cells(Ligne, 2) = T(L, L2)
                Ligne = Ligne + 1
            End If
        Next L2
    Next L
End Sub
La macro se déclenche lorsqu'on sélectionne la feuille "je veux"
 

Pièces jointes

  • test.xlsm
    15.1 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonsoir cortilolo, sylvanu,

ton fichier en retour. :)

la 2ème feuille est vide ; va sur la 1ère feuille, et fais Ctrl e ; attention : note bien que tu es maintenant sur la 2ème feuille ; la 1ère feuille est restée inchangée !​

VB:
Option Explicit

Sub Essai()
  If ActiveSheet.Name <> "j'ai" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row
  If dlg = 1 And IsEmpty([A1]) Then Exit Sub
  Dim ref$, chn$, lg1&, lg2&, col As Byte
  lg2 = 1: Application.ScreenUpdating = 0
  With Worksheets("je veux")
    For lg1 = 1 To dlg
      ref = Cells(lg1, 1)
      For col = 2 To 4
        chn = Cells(lg1, col)
        If chn <> "" Then
          .Cells(lg2, 1) = ref
          .Cells(lg2, 2) = chn
          lg2 = lg2 + 1
        End If
      Next col
    Next lg1
    .Select
  End With
End Sub

soan
 

Pièces jointes

  • test v1.xlsm
    15.5 KB · Affichages: 2
Dernière édition:

JFL_XLD

XLDnaute Junior
Bonsoir à tous !

Une proposition basique avec Power Query.
A tester !

Code:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(Source, {"Colonne1"}, "Attribut", "Valeur"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"})
in
    #"Colonnes supprimées"
 

Pièces jointes

  • Cortilolo - test.xlsx
    17.8 KB · Affichages: 7

cortilolo

XLDnaute Nouveau
Merci pour vos réponses mais je ne connais absolument pas le langage macro et si je veux adapter vos propositions à un fichier beaucoup plus grand avec notamment beaucoup plus de colonnes.
par exemple j’ai 15 colonnes qui ne doivent pas changer, juste se répéter à chaque ligne, puis seulement 3 colonnes qui elles doivent d’implémenter comme dans mon exemple...
je sais pas si je suis clair...

je vous mettrai bien mon « vrai » fichier en joint mais ce sont des données assez confidentielles...
 

soan

XLDnaute Barbatruc
Inactif
Bonjour cortilolo,

bonne chance pour l'adaptation à ton fichier de 2800 lignes et 50 colonnes ! 🍀

si t'as besoin d'une adaptation de mon code VBA, n'hésite pas à m'demander.

(mais bien sûr, c'est inutile si tu préfères une solution via Power Query 😜)

soan
 

cortilolo

XLDnaute Nouveau
Non j'ai bien pris ta solution en supprimant les 47 colonnes qui devaient juste se répéter et j'ai lancé la macro sur les 3 colonnes qui m'intéressaient.
ensuite j'ai refait une jointure avec le fichier obtenu et le fichier initial avec la clé id. Un peu de temps de perdu sûrement mais ça fonctionne j'ai bien mon fichier tel que je le souhaitais.
Petite dernière question, cela aurait été possible de faire l'inverse? partir de l'onglet je veux et arriver à l'onglet j'ai?
 

soan

XLDnaute Barbatruc
Inactif
@cortilolo, le fil,

dans ton post #12, tu as écrit : « cela aurait été possible de faire l'inverse ? »

oui, tout à fait ! :)

dans le fichier joint, la 2ème feuille est vide ; va sur la 1ère feuille, fais Ctrl e ; attention : tu es de nouveau sur la 2ème feuille ; la 1ère feuille est restée inchangée !​

VB:
Option Explicit

Sub Essai()
  If ActiveSheet.Name <> "j'ai" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row
  If dlg = 1 And IsEmpty([A1]) Then Exit Sub
  Dim ref$, chn$, lg1&, lg2&, dh As Byte
  lg2 = 1: dh = 1: Application.ScreenUpdating = 0
  With Worksheets("je veux")
    For lg1 = 1 To dlg
      ref = Cells(lg1, 1): chn = Cells(lg1, 2)
      With .Cells(lg2, 1)
        If .Value <> "" Then _
          If ref <> .Value Then lg2 = lg2 + 1: dh = 1
      End With
      With .Cells(lg2, 1)
        .Value = ref: .Offset(, dh) = chn: dh = dh + 1
      End With
    Next lg1
    .Select
  End With
End Sub

soan
 

Pièces jointes

  • test v2.xlsm
    15.9 KB · Affichages: 7

Discussions similaires

Statistiques des forums

Discussions
315 127
Messages
2 116 537
Membres
112 771
dernier inscrit
mikadu49