Microsoft 365 RÉSOLU Multi ligne selon critère cellule

Bambi35

XLDnaute Occasionnel
Bonjour à tous
je viens vers vous pour de l'aide.je cherche à pouvoir faire un code wba pour pourvoir duplique les lignes selon les plusieurs activités de l'adhérents (Colonne Z) avec les infos de la colonne A à Y
Exemple pour ABGU Marc avoir 2 ligne 1 pour l'Escalade et 1 pour le Badminton

Merci de votre aide
Cordialement
Bambi35
 

Pièces jointes

  • Adherents.xls
    34 KB · Affichages: 8

Bambi35

XLDnaute Occasionnel
Bonsoir Chris
Merci pour ton retour
Je ne connais pas la fonction PowerQuery.
Avec ton fichier je ne sais pas comment tu as fait
je ne vois pas de code vba ni de macro !!!
J'aimerais que cela fonction aussi avec d'autre version d'EXCEL

Merci de ton aide

Bambi35
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Idem mais en VBA. le code est dans module1. Cliquer sur le bouton Hop!
VB:
Sub diviser()
Dim derlig&, t, j&, jsup&, i&, k&, m&, s
With Sheets("Adherents_F78019")
   If .FilterMode Then .ShowAllData
   derlig = .Cells(.Rows.Count, "b").End(xlUp).Row
   t = Application.Transpose(.Range("a1:z" & derlig).Value)
   jsup = UBound(t, 2)
   For j = 2 To jsup
      s = Split(t(26, j), "-")
      If UBound(s) - LBound(s) + 1 > 1 Then
         t(26, j) = Trim(s(0))
         For m = 1 To UBound(s)
            ReDim Preserve t(1 To UBound(t), 1 To UBound(t, 2) + 1)
            For k = 1 To 25: t(k, UBound(t, 2)) = t(k, j): Next
            t(26, UBound(t, 2)) = Trim(s(m))
         Next m
      End If
   Next j
   t = Application.Transpose(t)
   .Range("a1").Resize(UBound(t), UBound(t, 2)) = t
End With
End Sub
 

Pièces jointes

  • Bambi35- Adherents- v1.xls
    43 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonsoir Bambi35, chris, mapomme,

Solution très voisine de celle de mapomme mais je poste quand même.

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim tablo, resu(), i&, s, j%, n&, k%
tablo = Feuil1.[A1].CurrentRegion.Resize(, 26)
ReDim resu(1 To Rows.Count, 1 To 26)
For i = 2 To UBound(tablo)
    s = Split(tablo(i, 26), "-")
    For j = 0 To UBound(s)
        n = n + 1
        For k = 1 To 25: resu(n, k) = tablo(i, k): Next k
        resu(n, 26) = Trim(s(j))
Next j, i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2]
    If n Then .Resize(n, 26) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 26).ClearContents 'RAZ en dessous
End With
End Sub
Elle se déclenche quand on active la feuille.

A+
 

Pièces jointes

  • Adherents(1).xls
    44.5 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à @chris à tous,

Ayant un tout nouveau PC avec un tout nouveau Excel 365 et donc Power Query, j'ai fait ma première requête. Elle était sans doute très simple car j'ai réussi. C'était ma toute première fois. Maintenant, il va falloir approfondir. Je ferai sans doute appel à vous dans les prochaines semaines.
 

chris

XLDnaute Barbatruc
RE
Bonsoir Chris
Merci pour ton retour
Je ne connais pas la fonction PowerQuery.
Avec ton fichier je ne sais pas comment tu as fait
je ne vois pas de code vba ni de macro !!!
J'aimerais que cela fonction aussi avec d'autre version d'EXCEL

RE

PowerQuery est intégré à Excel à partir de 2016 et en add on à partir de 2010 donc le choix des versions est large :cool:

Cela se fait en quelques clics :
Mettre le tableau initial sous forme de tableau structuré (existe depuis 2003 donc 17ans), nommer le tableau Adherents plutôt que Tableau1

Ensuite depuis une cellule du tableau : Données, A partir d'un tableau : ce qui ouvre PowerQuery
Sélectionner la colonne activités suivies, clic droit, Fractionner la colonne, Par délimiteur, Personnalisé : taper un espace un - et un espace, Options avancées : cocher fractionner en lignes
Sortir par Fermer et Charger : le résultat se stocke dans un nouvel onglet

Si l'original change, Données, Actualiser Tout : rien d'autre à faire
Si c'est à faire une seule fois : rompre la liaison du tableau de résultats
 

job75

XLDnaute Barbatruc
Bonjour le forum,

Si l'on veut que les dates (textes) soient restituées sous forme de vraies dates (nombres) il faut les convertir, voyez ce fichier (2) :
VB:
Private Sub Worksheet_Activate()
Dim tablo, resu(), i&, s, j%, n&, k%
tablo = Feuil1.[A1].CurrentRegion.Resize(, 26)
ReDim resu(1 To Rows.Count, 1 To 26)
For i = 2 To UBound(tablo)
    s = Split(tablo(i, 26), "-")
    For j = 0 To UBound(s)
        n = n + 1
        For k = 1 To 25
            If IsDate(tablo(i, k)) Then resu(n, k) = CDate(tablo(i, k)) Else resu(n, k) = tablo(i, k) 'convertit les dates (textes) en vraies dates (nombres)
        Next k
        resu(n, 26) = Trim(s(j))
Next j, i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2]
    If n Then .Resize(n, 26) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 26).ClearContents 'RAZ en dessous
End With
End Sub
Dans la feuille "Résultat" les colonnes D M T ont été mises au format Date.

A+
 

Pièces jointes

  • Adherents(2).xls
    46 KB · Affichages: 6

Bambi35

XLDnaute Occasionnel
Bonjour à tous

Merci à vous pour votre réactivité
Super Job75 nickel
mapomme dans ton vba les dates changent quand je reclic sur hop
Chris merci pour tes explications pour PowerQuery je vais approfondir cette solution
Merci encore de votre aide cela va me faciliter la tache pour les inscriptions

@+++
Bambi35
 

job75

XLDnaute Barbatruc
Je reviens sur ce fil pour parler un peu de Power Query.

Ce qui me gêne dans cet outil c'est que c'est une usine à gaz.

Je comprends bien que Microsoft a voulu aider ceux qui ne savent pas programmer.

Mais mettre des critères et commandes dans tous les sens c'est vraiment laborieux.

Perso je préfère le VBA, je sais toujours ce que je fais très exactement.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 321
Messages
2 087 265
Membres
103 501
dernier inscrit
talebafia