1. #1
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    mai 2004
    Messages
    4 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : Finance

    Informations forums :
    Inscription : mai 2004
    Messages : 4 671
    Points : 11 021
    Points
    11 021
    Billets dans le blog
    5

    Par défaut [Exercice] Le meilleur algo (sous Excel)

    Bonjour,

    Voici un petit exercice intéressant, enfin j'espère.
    Par ce jeu d'enregistrements inscrit tel que dans les colonnes A, B,C,D, E et F:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID        Valeur   Texte                  Montant	Coef	 Total
    A1,A2,A3  VA	   TA1,TA2,TA3,TA4,TA5	  101,00   	2,50%	 103,53   
    B1	  VB1,VB2  TB1,TB2	          173,00       41,00%	 243,93   
    C1,C2	  VC	   TC1	                  125,00       28,00%	 160,00
    J'attends de vous le meilleurs algo pour obtenir le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ID	Valeur	Texte	 Montant         Coef    Total
    A1	VA	TA1	 101,00   	2,50%	 103,53   
    A1	VA	TA2	 101,00   	2,50%	 103,53   
    A1	VA	TA3	 101,00   	2,50%	 103,53   
    A1	VA	TA4	 101,00   	2,50%	 103,53   
    A1	VA	TA5	 101,00   	2,50%	 103,53   
    A2	VA	TA1	 101,00   	2,50%	 103,53   
    A2	VA	TA2	 101,00   	2,50%	 103,53   
    A2	VA	TA3	 101,00   	2,50%	 103,53   
    A2	VA	TA4	 101,00   	2,50%	 103,53   
    A2	VA	TA5	 101,00   	2,50%	 103,53   
    A3	VA	TA1	 101,00   	2,50%	 103,53   
    A3	VA	TA2	 101,00   	2,50%	 103,53   
    A3	VA	TA3	 101,00   	2,50%	 103,53   
    A3	VA	TA4	 101,00   	2,50%	 103,53   
    A3	VA	TA5	 101,00   	2,50%	 103,53   
    B1	VB1	TB1	 173,00   	41,00%	 243,93   
    B1	VB1	TB2	 173,00   	41,00%	 243,93   
    B1	VB2	TB1	 173,00   	41,00%	 243,93   
    B1	VB2	TB2	 173,00   	41,00%	 243,93   
    C1	VC	TC1	 125,00   	28,00%	 160,00   
    C2	VC	TC1	 125,00   	28,00%	 160,00
    On considère que les colonnes ID, Valeur et Texte peuvent contenir un nombre aléatoire de valeurs séparées par des virgules...
    Les 3 autres ne changent pas pour une même ligne.

    A vos claviers...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2013 et 2016 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  2. #2
    Rédacteur/Modérateur
    Avatar de Jean-Philippe André
    Homme Profil pro
    Consultant technique et formateur en recherche active pour le Canada
    Inscrit en
    juillet 2007
    Messages
    10 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Consultant technique et formateur en recherche active pour le Canada
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 10 630
    Points : 23 216
    Points
    23 216

    Par défaut

    Salut,
    voici ma proposition, dans laquelle on voit bien la decomposition, ou je recopier sur la feuille 1 dans les colonnes H a M :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub pioupiou()
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Integer
    Dim varID As Variant
    Dim varValeur As Variant
    Dim varText As Variant
    For i = 2 To Worksheets(1).Range("A65536").End(xlUp).Row
        varID = Split(Worksheets(1).Range("A" & i).Value, ",")
        varValeur = Split(Worksheets(1).Range("B" & i).Value, ",")
        varText = Split(Worksheets(1).Range("C" & i).Value, ",")
        For j = 0 To UBound(varID)
            For k = 0 To UBound(varValeur)
                For l = 0 To UBound(varText)
                    Worksheets(1).Range("H" & Worksheets(1).Range("H65536").End(xlUp).Row + 1).Value = varID(j)
                    Worksheets(1).Range("I" & Worksheets(1).Range("I65536").End(xlUp).Row + 1).Value = varValeur(k)
                    Worksheets(1).Range("J" & Worksheets(1).Range("J65536").End(xlUp).Row + 1).Value = varText(l)
                    Worksheets(1).Range("K" & Worksheets(1).Range("K65536").End(xlUp).Row + 1).Value = Worksheets(1).Range("D" & i).Value
                    Worksheets(1).Range("L" & Worksheets(1).Range("L65536").End(xlUp).Row + 1).Value = Worksheets(1).Range("E" & i).Value
                    Worksheets(1).Range("M" & Worksheets(1).Range("M65536").End(xlUp).Row + 1).Value = Worksheets(1).Range("F" & i).Value
                Next l
            Next k
        Next j
    Next i
    End Sub
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    mai 2004
    Messages
    4 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : Finance

    Informations forums :
    Inscription : mai 2004
    Messages : 4 671
    Points : 11 021
    Points
    11 021
    Billets dans le blog
    5

    Par défaut

    Hey... JP !

    Je n'aborde pas l'entrée dans la plage de cette manière car le .End() s'écrase
    souvent devant un .SpecialCells().
    En dehors de cela, j'ai le même jeu de boucles avec un objet Range pour le remplissage final...
    Je ne sais pas si on peut faire mieux.

    Au suivant...
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2013 et 2016 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    février 2006
    Messages
    20 948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 20 948
    Points : 42 456
    Points
    42 456

    Par défaut

    Salut,

    Pourquoi tant de haine et limiter à Excel !

    Pour Word :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Sub SplitTables()
    Dim intLi As Integer
    Dim stId() As String
    Dim stValeur() As String
    Dim stTexte() As String
    Dim intA1 As Integer
    Dim intA2 As Integer
    Dim intA3 As Integer
    Dim oTbl1 As Table
    Dim oTbl2 As Table
     
    Set oTbl1 = ActiveDocument.Tables(1)
     
    Set oTbl2 = ActiveDocument.Tables.Add(Range:=ActiveDocument.Paragraphs.Last.Range, numrows:=1, numcolumns:=6)
     
     
    For intLi = 2 To oTbl1.Rows.Count
    'Split des valeurs du tableau
    stId = Split(NetText(oTbl1.Cell(intLi, 1).Range.Text), ",")
    stValeur = Split(NetText(oTbl1.Cell(intLi, 2).Range.Text), ",")
    stTexte = Split(NetText(oTbl1.Cell(intLi, 3).Range.Text), ",")
    'Boucles de remplissage
        For intA1 = 0 To UBound(stId)
            For intA2 = 0 To UBound(stValeur)
                For intA3 = 0 To UBound(stTexte)
                    oTbl2.Rows.Last.Cells(1).Range.Text = stId(intA1)
                    oTbl2.Rows.Last.Cells(2).Range.Text = stValeur(intA2)
                    oTbl2.Rows.Last.Cells(3).Range.Text = stTexte(intA3)
                    oTbl2.Rows.Last.Cells(4).Range.Text = NetText(oTbl1.Cell(intLi, 4).Range.Text)
     
                    oTbl2.Rows.Last.Cells(5).Range.Text = NetText(oTbl1.Cell(intLi, 5).Range.Text)
                    oTbl2.Rows.Last.Cells(6).Range.Text = NetText(oTbl1.Cell(intLi, 6).Range.Text)
                    oTbl2.Rows.Add
                Next intA3
            Next intA2
        Next intA1
    Next intLi
    Set oTbl1 = Nothing
    Set oTbl2 = Nothing
     
    End Sub
     
    'Fonction de nettoyage
    Function NetText(stTemp As String) As String
    NetText = Left(stTemp, Len(stTemp) - 2)
     
    End Function
    J'ai pas crée par code la seconde table, je l'ai ajoutée avant de lancer le code.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    mai 2004
    Messages
    4 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : Finance

    Informations forums :
    Inscription : mai 2004
    Messages : 4 671
    Points : 11 021
    Points
    11 021
    Billets dans le blog
    5

    Par défaut

    Pas mal non plus...
    Pourquoi tant de haine et limiter à Excel !
    Disons que le besoin était effectivement sous Excel... et donc l'objet du défi par voie de conséquence;

    En le lançant, j'espérais qu'un DVP Quidam aurait usé d'un algo autre que le miens qui s'image de près à celui de JPCheck...

    Merci en tout cas, c'est super

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2013 et 2016 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    février 2006
    Messages
    20 948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 20 948
    Points : 42 456
    Points
    42 456

    Par défaut

    Salut Argy,

    Word n'étant pas équipé d'outils comme Excel, il faut tout faire.
    Initialement, je pensais que ce serait un traitement long, mais ce n'est pas le cas.
    J'ai cru qu'il ne fonctionnait pas, j'ai pas eu de message d'erreur et le sablier ne s'est pas affiché.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    août 2005
    Messages
    1 367
    Détails du profil
    Informations forums :
    Inscription : août 2005
    Messages : 1 367
    Points : 1 680
    Points
    1 680

    Par défaut

    bonjour,

    mon code n'apporte rien de bien neuf, mais je le trouve plus efficace comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub distribute()
    Dim InitRng As Range
    Dim vID As Variant, vvID As Variant
    Dim vValeur As Variant, vvValeur As Variant
    Dim vTexte As Variant, vvTexte As Variant
    Dim vMontant, vCoef, vTotal, RC, R
     
    Set InitRng = Range("A1").CurrentRegion
    R = 1
     
    For RC = 1 To InitRng.Rows.Count
        vID = Split(InitRng.Cells(RC, 1), ",")
        vValeur = Split(InitRng.Cells(RC, 2), ",")
        vTexte = Split(InitRng.Cells(RC, 3), ",")
        vMontant = InitRng.Cells(RC, 4)
        vCoef = InitRng.Cells(RC, 5)
        vTotal = InitRng.Cells(RC, 6)
        For Each vvID In vID
            For Each vvValeur In vValeur
                For Each vvTexte In vTexte
                    Sheets(2).Cells(R, 1) = vvID
                    Sheets(2).Cells(R, 2) = vvValeur
                    Sheets(2).Cells(R, 3) = vvTexte
                    Sheets(2).Cells(R, 4) = vMontant
                    Sheets(2).Cells(R, 5) = vCoef
                    Sheets(2).Cells(R, 6) = vTotal
                    R = R + 1
                Next vvTexte
            Next vvValeur
        Next vvID
    Next RC
     
    End Sub
    voila, à vot' bon coeur msieur dame...
    Alleï Bonjour chez vous!

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    mai 2004
    Messages
    4 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : Finance

    Informations forums :
    Inscription : mai 2004
    Messages : 4 671
    Points : 11 021
    Points
    11 021
    Billets dans le blog
    5

    Par défaut

    Merci mayekeul...
    L'efficacité ("je le trouve plus efficace comme ça") reste à mesurer...

    Je constate qu'il n'y a pas 36 solutions et que celle que j'ai mis moi-même en place... ressemble pour sa quasi totalité à la solution proposée par jpcheck que je remercie aussi.

    Merci également à Heureux-oli qui a donné une version pour Word fort intéressante.

    Je considère que ce défi est clos...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2013 et 2016 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    juillet 2010
    Messages
    378
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2010
    Messages : 378
    Points : 44
    Points
    44

    Par défaut

    J'ai juste une petite proposition,
    on a un point en commun, c'est de connaître l'algorithme,

    mais rare sont les gens qui risque de comprendre ligne par ligne le code en haut,

    je propose à la personne qui poste un code, de le commenter ligne par ligne, ou bien de noter un paragraphe pour expliquer le code noté

    Merci

  10. #10
    Membre régulier

    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 20
    Points : 107
    Points
    107

    Par défaut

    Bonjour,

    C'est bien dommage qu'il n'y ait plus eu de défis Excel depuis 2010

    Je constate qu'il n'y a pas 36 solutions et que celle que j'ai mis moi-même en place... ressemble pour sa quasi totalité à la solution proposée par jpcheck que je remercie aussi.
    Effectivement, en temps normal j'aurais créé une solution similaire à celle de JP ...

    Je me suis donc lancé le défi de créer une macro différente et la plus courte possible (en espérant relancer un peu cette partie "Défis" qui semble à l'abandon)

    Le résultat :

    2 boucles (au lieu de 4) + 4 lignes (pour les 6 colonnes) et c'est tout (par contre, dans sa version réduite, le code pique un peu les yeux ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub defi_xlp()
        For ligne = 2 To 4
            For i = 0 To (UBound(Split(Cells(ligne, 1), ",")) + 1) * (UBound(Split(Cells(ligne, 2), ",")) + 1) * (UBound(Split(Cells(ligne, 3), ",")) + 1) - 1
                Range("G" & Range("G1000").End(xlUp).Row + 1) = Split(Cells(ligne, 1), ",")(Int(i / ((UBound(Split(Cells(ligne, 1), ",")) + 1) * (UBound(Split(Cells(ligne, 2), ",")) + 1) * (UBound(Split(Cells(ligne, 3), ",")) + 1) / (UBound(Split(Cells(ligne, 1), ",")) + 1))))
                Range("H" & Range("H1000").End(xlUp).Row + 1) = Split(Cells(ligne, 2), ",")(Int(i / ((UBound(Split(Cells(ligne, 1), ",")) + 1) * (UBound(Split(Cells(ligne, 2), ",")) + 1) * (UBound(Split(Cells(ligne, 3), ",")) + 1) / (UBound(Split(Cells(ligne, 2), ",")) + 1))))
                Range("I" & Range("I1000").End(xlUp).Row + 1) = Split(Cells(ligne, 3), ",")(i Mod (UBound(Split(Cells(ligne, 3), ",")) + 1))
                Range("D" & ligne & ":F" & ligne).Copy Range("J" & Range("J1000").End(xlUp).Row + 1 & ":L" & Range("J1000").End(xlUp).Row + 1)
            Next
        Next
    End Sub
    Si ça intéresse quelqu'un, je peux poster la version telle qu'elle était avant qu'elle soit réduite en un minimum de lignes ...

  11. #11
    Membre du Club
    Homme Profil pro
    Ambulance
    Inscrit en
    avril 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ambulance
    Secteur : Santé

    Informations forums :
    Inscription : avril 2012
    Messages : 27
    Points : 43
    Points
    43

    Par défaut bonjour,

    3 colonnes ID - Valeur - Texte
    A) test sur colonne ID pour trouver cellule vide ---> fin de liste
    B) Boucles
    1- boucle générale - Ligne 1 à fin de liste
    2- par ligne test sur les 3 colonnes ---> tableauID = séparateur "," ...
    3- imbriquer les 3 boucles ---> 0 à fin de tableauID,...
    C) Ecrire avec Ligne (boucle générale + décalage)

    @+ JP
    PS: je n'avais pas vu les réponses...!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Doc pour créer requetes SQL via ODBC sous EXCEL
    Par satanas dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/01/2005, 09h33
  2. grouper/créer un plan sous Excel
    Par EFCAugure dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 06/10/2004, 17h46
  3. Pb de séparateur lors du chargement sous excel
    Par mickael777 dans le forum C++Builder
    Réponses: 5
    Dernier message: 25/06/2004, 10h52
  4. [VBA-E] Sélection feuilles sous excel
    Par Mystic eyes dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2004, 14h27
  5. Sauvegarde problématique sous excel par OLE
    Par ulysse66x dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 16/04/2003, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo