Erreur dans ma macro ?

Résolu
Bonjour,

voici un petit fichier dans lequel j'ai créé une macro, qui en principe paraissait très simple à faire (masquer des colonnes et mettre une mise en forme conditionnelle) mais quand je l'exécute, ça ne donne pas le résultat voulu.

La première feuille, c'est le fichier tel que je le reçois. (J'ai enlevé les noms qui sont confidentiels, mais le reste, j'y ai pas touché). Dans la 2e feuille, c'est le résultat voulu pour faciliter la lecture pour facturer. Donc, mon premier client, #3520, j'ai à lui faire un crédit pour le fournisseur B, C et D. Donc, ça varie d'un client à l'autre et il va y avoir de plus en plus de clients qui se rajouteront à chaque trimestre. Mais après avoir exécuté ma macro, voir le résultat dans la 3e feuille. J'ai pas compris pourquoi ça n'a pas fonctionné.
Ça, c'était la solution rapide pour préparer la facturation. Mais idéalement, ce serait encore plus facile si je pouvais avoir, à la place, le résultat de la 4e feuille qui lui, ne nécessiterait pas d'exécuter cette macro mais je crains que ça prenne un tableau croisé dynamique, je trouve ça hyper compliqué :(
Mais si ça en prend un, est-ce que ça se met dans une macro ???
dites-moi quelle solution serait la plus simple à faire svp ?

merci
j'ai excel 2010

https://www.cjoint.com/c/FEcpsnkNpGV

9 réponses

  1. Bonjour Ju@nita,

    J'ai trouvé votre exercice vraiment très intéressant ! Voici 2 liens :

    Fichier Word 2003 : Note explicative
    Fichier Excel 2003 : Exercice

    Quand j'ai voulu créer un lien Cjoint avec le fichier Excel 2007, ça a refusé
    sans que je sache pourquoi. Aussi, je l'ai converti en fichier Excel 2003,
    et là, ça a marché.

    La conversion a changé certaines couleurs et enlevé une mise en forme conditionnelle ; mais quand vous lirez ma note explicative, vous saurez
    que ça n'a pas d'importance :

    Seuls comptent un nouveau format et la nouvelle macro.

    Cordialement.  😊
     
    0
    1. bonjour Albkan,
      Heureuse de voir que l'exercice vous ait plu. J'avais pas eu le choix pour la sauvegarde vu qu'il fallait qu'il soit sauvegardé avec macro. Mais j'ai toujours pas compris pourquoi ma macro ne s'exécutait pas comme il faut. La feuille n'était pourtant pas protégée. Mais votre macro est très intéressante, le fait qu'il y ait une bascule, je ne savais pas qu'on pouvait faire ça. J'ai bien aimé l'exécuter et voir le résultat.
      Toujours est-il qu'il serait compliqué que je change manuellement le format de chaque colonne dans le fichier original puisque ce fichier provient de quelqu'un d'autre et qui me l'envoie à chaque trimestre. Le but d'une macro est justement d'éviter d'avoir à faire tout ce travail à chaque fois. Je voudrais, quand je reçois le fichier, cliquer sur ma macro (qui serait dans mes macros personnelles avec raccourci dans ma barre d'accès rapide), et je serais prête à facturer avec le résultat voulu. La dernière option (l'idéal) me paraissait irréalisable. Mais si ça vous semble possible (à michel_m aussi), je serais aux anges. Et on oublierait la première option car c'était soit la solution facile, soit la solution difficile.
      Je suis toujours fascinée par les solutions proposées sur ce site car je ne sais pas composer des macros directement dans le VBA. Je les fais avec exécution au fur et à mesure avec "enregistrer une macro". Je sais que ça me limite beaucoup mais j'aimerais tellement avoir toutes vos connaissances !
      J'attends vos réponses avec impatience :)
      bonne journée.
      0
      1. Contributeur
        ci joint proposition macro pour "l'ideal"
        en feuille synthèse, traitement quasi instantané macro "main" + macro paramétrée par client dans module "sstotaux"

        http://www.cjoint.com/c/FEduuQljlQt

        le code
        Option Explicit
        Option Base 1
        Dim T_in
        Const Code As Integer = 1572
        '---------------------------------------------------------
        Sub main()
        Dim Derlig As Byte, Cptr As Byte

        Application.ScreenUpdating = False 'fige défilement écran: confort rapidité
        Sheets("synthese").Range("A6:E10000").Clear 'nettoyage
        With Sheets("original")
        Derlig = .Columns("A").Find("", .Range("A5")).Row - 2 'dernier client
        T_in = .Range("A6:CH" & Derlig) 'mémorisation RAM tableau complet: rapidité traitement
        For Cptr = 1 To UBound(T_in)
        Call par_client(Cptr) 'appel traitement des succursales (client)
        Next
        End With

        With Sheets("synthese")
        .Columns("E").NumberFormat = "0.00" 'format 2 décimales
        .Activate 'présentation
        End With
        End Sub
        '----------------------------------------------
        Sub par_client(Lig)
        Dim T_out(), Col As Byte, Cpt As Byte, Ligvid As Integer

        For Col = 12 To 85 Step 9
        If T_in(Lig, Col) > 0 Then 'si crédit > 0
        Cpt = Cpt + 1
        ReDim Preserve T_out(5, Cpt) 'mémorisation des traitement pour chaque succursale
        T_out(1, Cpt) = T_in(Lig, 1) '#client
        T_out(2, Cpt) = T_in(Lig, 2) 'client
        T_out(3, Cpt) = Code '#item
        With Sheets("original")
        T_out(4, Cpt) = .Cells(1, Col - 8) & " " & Format(.Cells(5, Col), "0%") 'fournisseur%
        End With
        T_out(5, Cpt) = T_in(Lig, Col) 'crédit
        End If
        Next
        Cpt = Cpt + 1
        ReDim Preserve T_out(5, Cpt)
        T_out(1, Cpt) = "SOUS TOTAL " & T_in(Lig, 2)
        T_out(5, Cpt) = T_in(Lig, 86) 'total crédit

        'restitution client
        With Sheets("synthese")
        Ligvid = .Columns("A").Find("", .Range("A5")).Row '1° ligne vide
        'restitution T_out
        .Cells(Ligvid, "A").Resize(Cpt, 5) = Application.Transpose(T_out)
        'mise en gras sous total client
        .Rows(Ligvid + Cpt - 1).Font.Bold = True
        End With
        End Sub

         Michel
        0
        1. WOW, je suis très impressionnée par le résultat ! C'est exactement ce que je voulais. Il y a juste deux petites erreurs. Quand j'ai voulu valider si tous les montants y étaient, il manque des lignes dans la feuille synthèse. Par exemple, tous les clients qui ont un montant en négatif qui provient de la colonne AM de la feuille originale n'ont pas cette ligne dans la feuille synthèse. Ex: client 3345, il faudrait qu'on puisse voir : fourn. D (32.71), sinon son total ne serait pas valide. Et tous ceux qui ont un montant dans la colonne CB du fourn. I-A, cette ligne n'y est pas. C'est sûrement pas grand chose. Mais je ne sais pas comment corriger l'erreur :(
          Puis-je te demander d'y jeter un coup d'oeil svp ?
          un gros merci pour tout ce temps que tu y passes pour moi. C'est énormément apprécié.
          0
          1. Contributeur
            Bonjour,

            effectivement :
            changer >0 en =0 dans la macro " par_client"
            For Col = 12 To 85 Step 9
            If T_in(Lig, Col) = 0 Then 'si crédit = 0
            Cpt = Cpt + 1


            est ce normal que fournnisseur I A et I B n('est pas de de colonnes "indirect ?

            si oui le + simple serait d'insérer 4 colonnes avant BS et BX et de les masquer pour garder le pas de 9 (step 9 dans la macro)
            tu dis...
            0
        2. ce serait pas plutôt <>0 ??
          0
          1. Contributeur
            Oui !!! excuse
            j'ai fait un edit dans mon message précédent concernant les fournisseurs

            je repasse tout à l'heure (dentiste)
            0
        3. j'ai rajouté 4 colonnes mais ça donne un résultat bizarre. Les sous-totaux ne se font pas.
          je vais attendre ton retour. merci
          et j'ai oublié de répondre à ton autre question. Les fournisseurs IA et IB n'ont pas de colonne indirect.
          0
          1. Contributeur
            ouf!

            Ci joint classeur modifié en ajoutant les 4 colonnes aux IA et IB
            et en les masquant; sur ton classeur il y a un petit boulot pour changer leur cellule fusionnée : afficher, défusionner - refusionner; le nom fournisseur se centre lui même dans les colonnes visibles

            pour tester j'ai ajouté des crédits dans 1A et 1B

            http://www.cjoint.com/c/FEepQotkNpt

            0
            1. merveilleux ! ça fonctionne à la perfection. T'es un génie !

              merci beaucoup Michel et passe une bonne journée (malgré ta visite chez le dentiste) :)
              0
              1. Bonjour Ju@nita,

                Désolé de t'avoir fait « faux bond », et de n'avoir pas répondu à ton
                message 3. J'ai été tellement débordé ces temps-ci que je n'ai pas
                pu revoir ton exercice avant aujourd'hui.

                Même si tu as reçu une très bonne solution, et même si tu as clôturé
                le sujet, j'ai beaucoup d'informations très intéressantes pour toi,
                à commencer par la réponse à une question que tu te posais tout à
                fait légitimement :

                Dans ton message initial (le tout premier), tu as écris à propos de
                ta propre macro : « J'ai pas compris pourquoi ça n'a pas fonctionné. » ;
                et dans ton message 3, tu as écris : « Mais j'ai toujours pas compris
                pourquoi ma macro ne s'exécutait pas comme il faut. ».

                Si ça t'intéresse toujours, cliques sur mon pseudo, et sur mon profil,
                cliques sur le bouton bleu « Lui écrire un message ».

                Cela parce que j'aurai aussi besoin de te poser une question
                d'ordre privé. Je t'enverrai alors un Message Privé, et pour
                pouvoir le lire, tu devras cliquer sur la petite enveloppe qui
                est tout en haut de ton écran, à droite de ton pseudo.

                Pour t'avertir que tu as reçu un MP, cette enveloppe clignote avec
                un chiffre blanc sur fond rouge : c'est le nombre de nouveaux MP
                que tu as reçu (et pas encore lu).

                J'aurai encore beaucoup d'autres informations pour toi,
                dont la technique de la « balance ».

                Cordialement.  😊
                 
                0