Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Modifier un tableau pour reporting

cyrjou9185

XLDnaute Nouveau
Bonjour amis Excelleurs

Je me permets de vous solliciter concernant un problème pour le moment insoluble avec mes connaissances en Excel.

Je vous présente le cas:

J'ai un tableau de 2 colonnes et de plus de 30 000 lignes.

- En colonne A j'ai un numéro de dossier au format nombre.
- En colonne B j'ai les maladies dont souffres un panel de clients.

Pour un dossier, je peux avoir plusieurs occurrences qui font autant de lignes que de maladies.

L'idée est de pouvoir transformer/ regrouper pour obtenir le résultat suivant:

1 ligne avec en colonne A le numéro du dossier et sur les autres colonnes autant de colonnes que de maladies.

Pour illustrer,

Départ:

Numéro DossierMaladie
12Asthme
12Obésité
12Épilepsie
14Anxiété
14Insomnie
15Dépression


L'idée est d'avoir ceci:

Numéro de dossierMaladie 1Maladie 2Maladie 3
12AsthmeObésitéEpilepsie
14AnxiétéInsomnie
15Dépression

Pourriez-vous m'indiquer comment obtenir ce résultat en traitant les 30 000 lignes ?

Merci d'avance de votre aide
 

chris

XLDnaute Barbatruc
Bonjour

2 solutions ci-joint :
  1. une à base de formules mais avec autant de lignes cela risque de ramer
  2. l'autre basée sur une requête PowerQuery à actualiser d'un clic droit sur le tableau de résultats quand la source évolue
 

Pièces jointes

  • Mladies.xlsx
    21.2 KB · Affichages: 9
Dernière édition:
Réactions: JHA

alexga78

XLDnaute Occasionnel
Bonsoir à tous,
Juste pour le fun une autre proposition par power query.
Très curieux de connaitre le temps de traitement de 30000 lignes.

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Maladies"]}[Content],
    ColName = Table.ColumnNames(Source),
    #"Grouped Rows" = Table.Group(Source, ColName{0}, {{ColName{1}, each let
x = List.Distinct(Table.ToList(Table.SelectColumns(_,ColName{1}))) in Text.Combine(x,"-")}, {"Count", each List.Count(List.Distinct(_))}}),
    ColName2 = List.Transform({1..List.Max(#"Grouped Rows"[Count])}, each "Maladie " & Text.From(_)),
    #"Split Column by Delimiter" = Table.SplitColumn(Table.SelectColumns(#"Grouped Rows",ColName), ColName{1}, Splitter.SplitTextByDelimiter("-"), ColName2)
in
    #"Split Column by Delimiter"
 
Dernière édition:

cyrjou9185

XLDnaute Nouveau
Hello à tous les deux,

Un très grand merci pour vos retours.

J'ai testé les 2 solutions, et ça fonctionne parfaitement

Avec Power Query et la requête d'alexga78, ma machine a mis 30 secondes pour le traitement

Bonne soirée
 

alexga78

XLDnaute Occasionnel
bonsoir à tous,

et par macro ?

VB:
Sub Macro_vs_PQ()

Set dico = CreateObject("Scripting.Dictionary")
Dim t: t = Timer

Application.ScreenUpdating = False


With Sheets("Feuil1")
Dim tablo()
tablo = .Range("A1:B" & .Cells(Rows.Count, 1).End(xlUp).Row).Value

Dim i As Long: For i = LBound(tablo) To UBound(tablo)
dico(tablo(i, 1)) = dico(tablo(i, 1)) & tablo(i, 2) & ","
Next i

.Range("D1").Resize(dico.Count) = Application.Transpose(dico.keys)
.Range("E1").Resize(dico.Count) = Application.Transpose(dico.items)
.Range("E1").Resize(dico.Count).TextToColumns comma:=True

For i = 0 To .Range("D1").CurrentRegion.Columns.Count - 2
.Range("E1").Offset(, i) = "Maladie " & i + 1
Next i

End With

Application.ScreenUpdating = True

 
MsgBox Timer - t
Set dico = Nothing
Erase tablo
End Sub
 
Dernière édition:

Discussions similaires

Réponses
0
Affichages
1 K
Réponses
1
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…