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,

    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
    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. 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. 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. 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
          2. 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
          3. 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. 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. 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