XL 2019 Eclater les catégories d'un tableau

Nico2978

XLDnaute Nouveau
Bonjour à tous,
je souhaiterais savoir si il est possible de transformer via une fonction excel ou via vba un tableau comme celui ci:
1712566913452.png


En une liste comme celle la:
1712566991258.png


Et si oui, comment faut-il s'y prendre s'il vous plaît?

Je vous remercie! Et au vu de l'heure bon appétit
 
Solution
Bon pour traiter les doublons il suffit d'ajouter un tri :
VB:
Sub Modifier()
Dim P As Range, i&
Set P = [A1].CurrentRegion
Application.ScreenUpdating = False
P.Rows(P.Rows.Count + 1).Resize(Rows.Count - P.Rows.Count - P.Row + 1).Delete xlUp 'RAZ
P.Copy P(P.Rows.Count + 2, 1)
Set P = P(P.Rows.Count + 2, 1).Resize(P.Rows.Count, P.Columns.Count)
P.Sort P.Columns(1), xlAscending, Header:=xlYes 'tri
For i = P.Rows.Count To 2 Step -1
    If P.Cells(i, 1) <> P.Cells(i - 1, 1) Then
        P.Rows(i).Insert xlDown
        P.Rows(1).Copy P.Rows(i)
        P.Cells(i, 1) = P.Cells(i + 1, 1)
        P.Cells(i + 1, 1) = ""
    Else
        P.Cells(i, 1) = ""
    End If
Next
P.Rows(1).Delete xlUp
End Sub

Nico2978

XLDnaute Nouveau
Bonjour à tous,
une tentative par Power Query - à actualiser Données => Actualiser.

Bonne journée.
Bonjour Axel! Merci pour cette nouvelle approche qui en soit fait le travail et regroupe bien selon le critère voulu. Mais au niveau de la mise en forme du tableau powerquery , je ne trouve pas bcp d'option, notament pour éviter les répétitions "catégorie" et réinsérer les entêtes de colonnes.

Merci en tout cas, car pour une partie de mon projet, cette fonctionnalité d'excel pourrait s'avérer bien utile, j'ai des données de prod avec des catégories et sous catégories.

Bon après midi
 

job75

XLDnaute Barbatruc
Bonjour Nico2978, JHA, alexga78,

Il y a aussi le VBA, c'est assez simple :
VB:
Sub Modifier()
Dim P As Range, i&
Set P = [A1].CurrentRegion
Application.ScreenUpdating = False
P.Rows(P.Rows.Count + 1).Resize(Rows.Count - P.Rows.Count - P.Row + 1).Delete xlUp 'RAZ
P.Copy P(P.Rows.Count + 2, 1)
Set P = P(P.Rows.Count + 2, 1).Resize(P.Rows.Count, P.Columns.Count)
For i = P.Rows.Count To 2 Step -1
    P.Rows(i).Insert xlDown
    P.Rows(1).Copy P.Rows(i)
    P.Cells(i, 1) = P.Cells(i + 1, 1)
    P.Cells(i + 1, 1) = ""
Next
P.Rows(1).Delete xlUp
End Sub
A+
 

Pièces jointes

  • Modifier.xlsm
    17.5 KB · Affichages: 2

Nico2978

XLDnaute Nouveau
Merci Axel, c'est excellent! Et avec une petite MFC ça rend exactement comme je l'attendais (voir fichier joint)

Il subsiste 2 problèmes:
  • Le tableau source n'est pas dynamique, si je supprime des entrées et que je recharge, j'ai un message d'erreur
  • La requête modifie la MEF au niveau de la largeur de colonne. Il y a t'il un moyen de figer celle ci ? Peut être que query propose des options pour ça, je n'en ai pas vu

Je te remercie!
 

Pièces jointes

  • Classeur Nico categorie (2).xlsm
    31.4 KB · Affichages: 2
Dernière édition:

Nico2978

XLDnaute Nouveau
Bonjour Nico2978, JHA, alexga78,

Il y a aussi le VBA, c'est assez simple :
Bonjour Job35 merci à toi pour ce programme, à chaud après test, je dirais que ça ne convient pas tout à fait mais presque (voir photo ci dessous)
1712582706941.png


Ce que tu proposes m'a l'air assez versatile, j'imagine que je peux modifier en rajoutant des conditions pour la catégorie en colonne 1 ne se répète pas et idem pour les entêtes/catégorie.

Je vais regarder en tout cas merci bcp! Je reviens vite
 

alexga78

XLDnaute Occasionnel
Re,
pour la largueur des colonnes il "suffit" de jouer sur le nom des colonnes de la dernière étape de la requête, lignes vides du tableau source supprimées également.
cependant je ne suis pas certain que le mise en forme sera conservée si nouvelles catégories, chaque ligne étant une entrée.
le mieux est de passer par le VBA, donc je passe.
 

Pièces jointes

  • Classeur Nico categorie.xlsm
    29.2 KB · Affichages: 1

job75

XLDnaute Barbatruc
Bon pour traiter les doublons il suffit d'ajouter un tri :
VB:
Sub Modifier()
Dim P As Range, i&
Set P = [A1].CurrentRegion
Application.ScreenUpdating = False
P.Rows(P.Rows.Count + 1).Resize(Rows.Count - P.Rows.Count - P.Row + 1).Delete xlUp 'RAZ
P.Copy P(P.Rows.Count + 2, 1)
Set P = P(P.Rows.Count + 2, 1).Resize(P.Rows.Count, P.Columns.Count)
P.Sort P.Columns(1), xlAscending, Header:=xlYes 'tri
For i = P.Rows.Count To 2 Step -1
    If P.Cells(i, 1) <> P.Cells(i - 1, 1) Then
        P.Rows(i).Insert xlDown
        P.Rows(1).Copy P.Rows(i)
        P.Cells(i, 1) = P.Cells(i + 1, 1)
        P.Cells(i + 1, 1) = ""
    Else
        P.Cells(i, 1) = ""
    End If
Next
P.Rows(1).Delete xlUp
End Sub
 

Pièces jointes

  • Modifier(1).xlsm
    18.1 KB · Affichages: 2

Discussions similaires

Réponses
13
Affichages
155
Réponses
17
Affichages
345