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
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
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