Erreur incompréhensible

Bonjour à tous et désolé d'avance pour ce titre peu explicite mais je n'ai pas trouvé mieux ... Pour me faire pardonner, je vais faire en sorte que l'énoncé de mon problème soit le plus clair possible

Afin de suivre au mieux mon activité commerciale, j'ai trois fichiers Excel principaux :

  • Le premier se nomme "Stock_acheté_17.xlsx" et retrace tous mes achats mensuels
  • Le second s'appelle "Ventes_totales.xlsm" et retrace toutes mes ventes mensuelles
  • Le troisième fichier, "Situation_économique_17.xlsm", est une synthèse des deux premiers et compare certaines de leurs informations telles que la quantité achetée et la quantité vendue, le résultat net estimé et celui atteint ou encore le ROI espéré et le ROI réel.

Vous trouverez ci-dessous la macro entière correspondant au troisième fichier mais le problème se situe au niveau de l'obtention du résultat net atteint, que j'ai notifié par "[SOURCE DU PROBLEME]" en commentaire.

 
Sub Statistique_produit()

    Dim tableau_mois(11) As String, chemin_classeur_actif As String, ref1 As String, ref2 As String, ref_vente As String
    Dim classeur_actif As Workbook
    Dim feuille_active As Worksheet

    Dim i As Integer, r As Integer, x As Integer
    Dim nombre_produits As Integer, nombre_produits_total As Integer

    Application.ScreenUpdating = False

    tableau_mois(0) = "Jan" 'Initialisation du tableau
    tableau_mois(1) = "Fev"
    tableau_mois(2) = "Mar"
    tableau_mois(3) = "Avril"
    tableau_mois(4) = "Mai"
    tableau_mois(5) = "Juin"
    tableau_mois(6) = "Juil"
    tableau_mois(7) = "Aout"
    tableau_mois(8) = "Sept"
    tableau_mois(9) = "Oct"
    tableau_mois(10) = "Nov"
    tableau_mois(11) = "Dec"

    chemin_classeur_actif = "C:\Users\DEVICE\Desktop\Compta\stock_acheté_17.xlsx"
    Set classeur_actif = Workbooks.Open(Filename:=chemin_classeur_actif)

    'Curation des estimations

    nombre_produits = 0
    nombre_produits_total = 2

    For i = 11 To 11 'Dans cet exemple nous ne prenons en compte que le mois de décembre

        Set feuille_active = classeur_actif.Sheets(tableau_mois(i))

        nombre_produits = feuille_active.Range("A" & Rows.Count).End(xlUp).Row

        If nombre_produits > 1 Then

            feuille_active.Range("A2:A" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("A" & nombre_produits_total) 'nom du produit
            feuille_active.Range("G2:G" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("B" & nombre_produits_total) 'quantité achetée
            feuille_active.Range("F2:F" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("C" & nombre_produits_total) 'coût moyen
            feuille_active.Range("H2:H" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("D" & nombre_produits_total) 'coût logistique
            feuille_active.Range("M2:M" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("F" & nombre_produits_total) 'Prix de vente
            feuille_active.Range("N2:N" & nombre_produits).Copy
            Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("H" & nombre_produits_total).PasteSpecial Paste:=xlPasteValues 'CA

            feuille_active.Range("O2:O" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("J" & nombre_produits_total) 'Résultat net
            feuille_active.Range("Q2:Q" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("L" & nombre_produits_total) 'ROI
            feuille_active.Range("S2:S" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("N" & nombre_produits_total) 'SKU n°1
            feuille_active.Range("T2:T" & nombre_produits).Copy Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("O" & nombre_produits_total) 'SKU n°2

            nombre_produits_total = nombre_produits_total + nombre_produits - 1

        Else

        End If

    Next i

    classeur_actif.Close SaveChanges:=True

    chemin_classeur_actif = "C:\Users\DEVICE\Desktop\Compta\Ventes_Totales.xlsm"
    Set classeur_actif = Workbooks.Open(Filename:=chemin_classeur_actif)

    'Curation des résultats

    nombre_references = Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("A" & Rows.Count).End(xlUp).Row

             If nombre_references > 1 Then
              'Si au moins une référence a été achetée dans l'année

                 For r = 2 To nombre_references
                  'Alors on réalise une boucle de la première référence jusqu'à la dernière

                     ref1 = Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("N" & r).Value
                     ref2 = Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Range("O" & r).Value
                     ref_vente = 0
                     nombre_ventes_produits = 0
                     CA_total = 0
                     total_avec_frais = 0

                     'ref1 et ref2 prennent la valeur de la référence r achetée

                     For i = 11 To 11
                      'Ici aussi, nous ne nous occupons que du mois de décembre

                                    Set feuille_active = classeur_actif.Sheets(tableau_mois(i))
                                    'Qui correspond aux 12 mois de l'année

                                    nombre_ventes_totales = feuille_active.Range("H" & Rows.Count).End(xlUp).Row
                                    'On calcule le nombre de ventes qu'il y a eu dans le mois en question

                             For x = 2 To nombre_ventes_totales

                                  If feuille_active.Range("G" & x).Value <> "" Then ref_vente = feuille_active.Range("G" & x).Value

                                  If ref_vente = ref1 Then

                                  nombre_ventes_produits = feuille_active.Range("I" & x).Value + nombre_ventes_produits
                                  CA_total = feuille_active.Range("O" & x).Value + CA_total
                                  total_avec_frais = feuille_active.Range("W" & x).Value + total_avec_frais ' [SOURCE DU PROBLEME]

                                  ElseIf ref_vente = ref2 Then

                                  nombre_ventes_produits = feuille_active.Range("I" & x).Value + nombre_ventes_produits
                                  CA_total = feuille_active.Range("O" & x).Value + CA_total
                                  total_avec_frais = feuille_active.Range("W" & x).Value + total_avec_frais ' [SOURCE DU PROBLEME]

                                  Else

                                  End If

                            Next x

                     Next i

                     Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Activate

                     Range("E" & r).Select

                     Selection.Value = nombre_ventes_produits

                     Range("G" & r).Select

                     If CA_total <> "0" And nombre_ventes_produits <> "0" Then

                     Selection.Value = CA_total / nombre_ventes_produits

                     Else

                     Selection.Value = 0

                     End If

                     Range("I" & r).Select
                     Selection.Value = CA_total

                     Range("K" & r).Select
                     Selection.Value = total_avec_frais

                     Range("M" & r).Select

                     If CA_total <> "0" And total_avec_frais <> "0" Then

                     Selection.Value = (total_avec_frais - (CA_total - total_avec_frais) / (CA_total - total_avec_frais))

                     Else

                     Selection.Value = 0

                     End If

                 Next r
                  'Puis on passe au prochain item

            Else

            End If

    classeur_actif.Close SaveChanges:=True

    Cells.Select
    Selection.ClearFormats
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
    End With

    Range("A1:O1").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Font.Bold = True
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 6299648
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    With Selection.Font
        .Color = -16727809
        .TintAndShade = 0
    End With

    Application.ScreenUpdating = True

End Sub

 

A son activation, la macro ne renvoie aucune erreur et fait à priori son job, pourtant le résultat affiché en K "résultat net réalisé" est "un peu" erroné. J'entends par "un peu" que les résultats sont parfois bons, parfois pas du tout !

Avec la macro actuelle,

Le produit A avec la référence 74-2RWH-5MFR devrait afficher un résultat net réalisé dans la cellule K2 de 68,9 (la somme de la colonne W "total_avec_frais" dans le fichier Ventes_totales avec cette référence) et affiche en effet cette valeur.

Le produit B avec la référence YG-GSGS-PENB devrait afficher un résultat net réalisé dans la cellule K3 de 39,33 (la somme de la colonne W "total_avec_frais" dans le fichier Ventes_totales avec cette référence) mais il affiche en fait 28,25.

Le produit C avec la référence OR-W09R-FJOP devrait afficher un résultat net réalisé dans la cellule K4 de 216,97 (la somme de la colonne W "total_avec_frais" dans le fichier Ventes_totales avec cette référence) mais il affiche en fait 193,57.

Les autres produits n'ont pas encore été vendu et sont donc correctement à 0.

Je suis vraiment médusé par ces résultats car je ne comprends pas quelle peut être l'origine d'une telle erreur ... Vous trouverez bien-sûr en pièce jointe les trois fichiers dont je parle. Sur mon ordinateur ils sont placés sur le bureau dans un dossier s’appelant "compta".

Je vous serais vraiment reconnaissant si vous trouviez la source de mon problème ... Il y a encore une quinzaine de jours j'écrivais encore à peine une ligne sur VBA, j'ai un peu progressé depuis mais j'avoue que là ça me pose une colle.

Merci d'avance pour vos lumières

15ventes-totales.xlsm (48.39 Ko)

Bonjour,

Dans la très grande majorité des cas, il faut éviter les ".select"

À tester ...

 ...
 ...
 ...
Workbooks("Situation_économique_17.xlsm").Worksheets("Par produit").Activate
Range("E" & r) = nombre_ventes_produits
If CA_total <> "0" And nombre_ventes_produits <> "0" Then
    Range("G" & r) = CA_total / nombre_ventes_produits
Else
    Range("G" & r) = 0
End If

Range("I" & r) = CA_total
Range("K" & r) = total_avec_frais

If CA_total <> "0" And total_avec_frais <> "0" Then
    Range("M" & r) = (total_avec_frais - (CA_total - total_avec_frais) / (CA_total - total_avec_frais))
Else
    Range("M" & r) = 0
End If
...
...
...

laceline

Bonjour,

bon, mon post a disparu, je recommence...

Perso je passerai par des TCD qui font 90% du boulot.

Pb : il est toujours conseillé de tout mettre dans une base unique, et de sélectionner les données voulues.

Là avec une feuille par mois ça t'oblige à changer la source des TCD 12 fois alors que tu aurais pu tout avoir d'un coup.

Un exemple de TCD, à toi de voir si ça t'inspire.

eric

Bonjour et merci pour vos pistes de réflexion !

Eriiic : J'avais complètement oublié cette histoire de tableaux croisés dynamiques qui, avec le recul, parait en effet beaucoup plus simple à mettre en place ... Le hic c'est qu'il est nécessaire d'avoir un TCD par feuille de calcul alors que dans le cas présent je voudrais avoir tous les résultats les uns à côté des autres En plus de cela, je dois t'avouer que j'ai passé BEAUCOUP de temps sur ce petit code et ça m'embête de le mettre à la benne sur cette tout dernier problème, c'est un peu devenu un défi personnel !

Concernant la feuille par mois, c'est vrai que c'est un peu une aberration en y repensant et ça ralentit considérablement l'exécution de la macro. Je créerais un code à l'avenir pour mettre toutes les données des différents mois sur une seule feuille, mais étant donné que la boucle de mon programme ne traite que le mois de décembre, l'erreur ne peut pas venir de là.

Ce qui m'amène à toi Laceline, j'ai modifié mon code selon tes indications mais rien ne change.

L'un de vous a t'il une autre idée pour la résolution de ce problème ?

Pour ton défi personnel je te suggère de faire en pas à pas en contrôlant les valeurs des variables clés jusqu'à ce que tu trouves la fautive et l'explication.

eric

Bonjour,

... En plus de cela, je dois t'avouer que j'ai passé BEAUCOUP de temps sur ce petit code et ça m'embête de le mettre à la benne sur cette tout dernier problème, c'est un peu devenu un défi personnel ! ...

Une piste ...

Si on trie le tableau sur la colonne K du fichier "Ventes_Totales", les lignes vides de la colonne K se retrouvent au bas et là, la macro donne les bons résultats.

laceline

Bonjour,

Ceci semble bien fonctionner sans trier le tableau sur la colonne K du fichier "Ventes_Totales" ...

Remplacer :

...
If feuille_active.Range("G" & x).Value <> "" Then ref_vente = feuille_active.Range("G" & x).Value
If ref_vente = ref1 Then
...

par :

...
If feuille_active.Range("G" & x).Value <> "" And feuille_active.Range("G" & x).Value = ref1 Then 
...

laceline

Super ! Je viens de trouver l'erreur et ma macro fonctionne du feu de Dieu !!

En effet, il s'agissait des cellules vides qui se baladaient dans la colonne "références" qui faussaient tout. Aussitôt repéré, aussitôt corrigé et mon fichier est terminé. Merci pour votre aide, j'aurais pu chercher encore longtemps je pense ...

Sujet résolu.

Ah, je viens de voir ta réponse Laceline, c'était bien ça le soucis. C'est pas plus mal ça m'a fait chercher un peu

Rechercher des sujets similaires à "erreur incomprehensible"