Différence entre total VBA et somme automatique
Bonsoir le forum,
Dans ma base excel, je copie les données correspondantes à la saisie dans un userform de la feuille "2009Paiements" vers la feuille "2011FTous".
Dans le fichier compressé joint, afin de simplifier au maximum, je copie les enrergistrements correspondants à 2010 et à l'organisme 1 en cliquant sur le bouton "Exécuter macro".
Sur "2011FTous" se trouvent en D5 à D7 et en K5 à K7 les totaux calculés par le code VBA. En contrôlant ces sommes en faisant une somme automatique, il s'avère que les montants calculés ne sont pas rigoureusement exacts. Exemple : en K6 : 34588.55 alors que la somme automatique R15:R119 correspondant à ce calcul me donne 34588.57.
Les données en "2009Paiements" sont au format nombre à deux décimales, et dans le classeur l'option définir le calcul avec la précision au format affiché est activée.
Par contre, en mettant dans mon code un "Stop" à l'endroit approprié, j'ai remarqué que parfois ce sont des nombres à 3 chiffres après la virgule qui sont comptabilisés. L'erreur doit certainement provenir de là, mais je ne sais pas comment la contrer.
Je remercie par avance tous ceux et celles qui prendront de leur temps pour examiner ce problème.
Cordialement
Joseph
Bonjour,
Par contre, en mettant dans mon code un "Stop" à l'endroit approprié, j'ai remarqué que parfois ce sont des nombres à 3 chiffres après la virgule qui sont comptabilisés. L'erreur doit certainement provenir de là, mais je ne sais pas comment la contrer.
Ton fichier ne comporte pas le code que tu utilises. Difficile donc de te dire ce qui ne va pas.
Vois du coté des intructions ROUND
Amicalement
Bonjour Dan,
Bonjour le forum,
Le code se trouve en démarrant l'éditeur visual basic dans la feuille 34(2009Paiements).
Question bête : se pourrait-il que le code n'apparaisse pas dans le fichier que j'ai envoyé parce qu'il est compressé ?
N'ayant que des nombres à 2 décimales en feuille "2009Paiements", je ne devrais pas avoir à arrondir le résultat en "2011FTous". Le total calculé en VBA devrait rigoureusement être le même que celui que me donne le contrôle via la somme automatique.
Dis moi pour le code. Et s'il n'apparait toujours pas, y a-t'il un moyen pour ajouter un fichier de plus de 200KO ?
En tous cas merci de t'être penché sur ma problématique.
Amicalement
Joseph
Re,
Je n'arrive pas à exécuter ton code, j'ai toujours une erreur à Lastrow...
Peut être voir du coté des variables à mettre en Double au lieu de single.
Amicalement
Bonjour Dan,
Bonjour le forum,
Peut être voir du coté des variables à mettre en Double au lieu de single.
Alors là, c'est trop fort. Direct dans le mille.
Y a-t'il une explication ?
Merci beaucoup, et à charge de revanche (je peux toujours rêver....)
Amicalement
Joseph
Re,
C'est un peu technique mais avec Double, tu travailles en double précision (8 octets) tandis qu'avec Single tu es en simple précision.
Fais ce test avec ce code, tu vas comprendre de suite
Sub test()
Dim toto As String
Dim tata As Single
toto = "1234567.89"
tata = Val(toto)
MsgBox tata
toto = "1234567,89"
tata = CDbl(toto)
MsgBox tata
End SubEnsuite refais le test mais en remplaçant Dim tata as single par Dim tata as double et vois les résultats avec Msgbox.
Amicalement
Bonjour Dan, le forum,
Test effectué. Dans le premier cas pas de chiffres après la virgule, dans le deuxième deux chiffres après.
J'aurais effectivement utilisé Double si le montant de mes calculs le nécessitait, mais tel n'est pas le cas.
Quoique, rien ne dit qu'un jour il ne faudra pas l'utiliser... alors autant que ce soit tout de suite!
Toutefois tout ceci n'explique pas les 3 chiffres après la virgule que je trouve dans le déroulement du code VBA.
A toute fins utiles, voici le code en question, vu que tu n'arrives pas à l'exécuter via le fichier que j'avais joins.
Peut-être y verras-tu ce qui cloche. (ainsi que le blocage au niveau de LastRow)
Private Sub Macro_Click()
Dim cptPO2 As Long
Dim PO2numpro As Double
Dim PO2nompro As Double
Dim PO2MTDPRO As Double
Dim PO2MTPRO As Double
Dim PO2RETROPRO As Double
Dim PO2MTDPAY As Double
Dim PO2MTPAY As Double
Dim PO2RETROPAY As Double
Dim numfin As String
Dim nomfin As String
Dim LastRow As Long
Dim MaDate
Dim AnneeEnCours As Integer
Dim AnneePlancher As Integer
Dim AnneeSaisie As String
Dim b As Integer
Dim i As Long
Dim k As Byte
b = 2010
numfin = 1
nomfin = "CAF"
Application.ScreenUpdating = False
'Détermination de la dernière ligne de la feuille ("2009Paiements")
'Je prends en compte la colonne D, année du décompte
LastRow = Sheets("2009Paiements").Range("D65536").End(xlUp).Row
'Effacement de la feuille ("2011FTous")
Sheets("2011FTous").Range("A15:V3005").ClearContents
'Initialisation du compteur
cptPO2 = 15
'Initialisation des totaux
PO2MTDPRO = 0
PO2MTPRO = 0
PO2RETROPRO = 0
PO2MTDPAY = 0
PO2MTPAY = 0
PO2RETROPAY = 0
'Depuis la dernière ligne jusqu'à la ligne 6
For i = LastRow To 6 Step -1
'Si le décompte de la feuille ("2009Paiements") est égal à la valeur entrée
If Val(Sheets("2009Paiements").Cells(i, 4)) = b Then
'Si le financeur est celui choisi
If Val(Sheets("2009Paiements").Cells(i, 13)) = numfin Then
' 'Calcul des totaux
PO2MTDPRO = PO2MTDPRO + Sheets("2009Paiements").Cells(i, 6).Value
PO2MTPRO = PO2MTPRO + Sheets("2009Paiements").Cells(i, 8).Value
PO2RETROPRO = PO2RETROPRO + Sheets("2009Paiements").Cells(i, 11).Value
PO2MTDPAY = PO2MTDPAY + Sheets("2009Paiements").Cells(i, 16).Value
PO2MTPAY = PO2MTPAY + Sheets("2009Paiements").Cells(i, 18).Value
PO2RETROPAY = PO2RETROPAY + Sheets("2009Paiements").Cells(i, 21).Value
'Insérer une ligne Sheets("2011FTous")
Sheets("2011FTous").Rows(15).Insert
'Et copier les données de chaque colonne
For k = 1 To 22
Sheets("2011FTous").Cells(15, k) = Sheets("2009Paiements").Cells(i, k)
Next
cptPO2 = cptPO2 + 1
' Stop
End If
End If
Next
'Formatage
Sheets("2011FTous").Range("A15:V" & cptPO2).Interior.ThemeColor = xlThemeColorDark1
Sheets("2011FTous").Range("A15:A" & cptPO2).NumberFormat = "0000000"
Sheets("2011FTous").Range("C15:C" & cptPO2).NumberFormat = "000"
Sheets("2011FTous").Range("E15:E" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("F15:F" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("F15:F" & cptPO2).HorizontalAlignment = xlRight
Sheets("2011FTous").Range("G15:G" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("H15:H" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("H15:H" & cptPO2).HorizontalAlignment = xlRight
Sheets("2011FTous").Range("J15:J" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("K15:K" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("K15:K" & cptPO2).HorizontalAlignment = xlRight
Sheets("2011FTous").Range("M15:M" & cptPO2).NumberFormat = "000"
Sheets("2011FTous").Range("O15:O" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("P15:P" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("P15:P" & cptPO2).HorizontalAlignment = xlRight
Sheets("2011FTous").Range("Q15:Q" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("R15:R" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("R15:R" & cptPO2).HorizontalAlignment = xlRight
Sheets("2011FTous").Range("T15:T" & cptPO2).NumberFormat = "dd/mm/yyyy"
Sheets("2011FTous").Range("U15:U" & cptPO2).NumberFormat = "#,##0.00"
Sheets("2011FTous").Range("U15:U" & cptPO2).HorizontalAlignment = xlRight
Application.ScreenUpdating = True
Sheets("2011FTous").Select
With Sheets("2011FTous")
.Range("C3").Value = b
.Range("C5").Value = PO2MTDPRO
.Range("C6").Value = PO2MTPRO
.Range("C7").Value = PO2RETROPRO
.Range("J3").Value = nomfin
.Range("J5").Value = PO2MTDPAY
.Range("J6").Value = PO2MTPAY
.Range("J7").Value = PO2RETROPAY
End With
End SubMerci infiniment de ta patience et de ta disponibilité
Amicalement
Joseph
Re,
J'ai dû transférer ton fichier dans un nouveau car pas moyen d'exécuter le code. Il y avait une erreur sur tes feuilles mais laquelle... mystère !
Là cela fonctionne mais tu pourrais simplifier la fin du code aussi.
....
With Sheets("2011FTous")
.Range("C3").Value = b
.Range("C5").Value = PO2MTDPRO
.Range("C6").Value = PO2MTPRO
.Range("C7").Value = PO2RETROPRO
.Range("J3").Value = nomfin
.Range("J5").Value = PO2MTDPAY
.Range("J6").Value = PO2MTPAY
.Range("J7").Value = PO2RETROPAY
'Formatage
.Range("A15:V" & cptPO2).Interior.ThemeColor = xlThemeColorDark1
.Range("A15:A" & cptPO2).NumberFormat = "0000000"
.Range("C15:C" & cptPO2).NumberFormat = "000"
.Range("E15:E" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("F15:F" & cptPO2).NumberFormat = "#,##0.00"
.Range("F15:F" & cptPO2).HorizontalAlignment = xlRight
.Range("G15:G" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("H15:H" & cptPO2).NumberFormat = "#,##0.00"
.Range("H15:H" & cptPO2).HorizontalAlignment = xlRight
.Range("J15:J" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("K15:K" & cptPO2).NumberFormat = "#,##0.00"
.Range("K15:K" & cptPO2).HorizontalAlignment = xlRight
.Range("M15:M" & cptPO2).NumberFormat = "000"
.Range("O15:O" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("P15:P" & cptPO2).NumberFormat = "#,##0.00"
.Range("P15:P" & cptPO2).HorizontalAlignment = xlRight
.Range("Q15:Q" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("R15:R" & cptPO2).NumberFormat = "#,##0.00"
.Range("R15:R" & cptPO2).HorizontalAlignment = xlRight
.Range("T15:T" & cptPO2).NumberFormat = "dd/mm/yyyy"
.Range("U15:U" & cptPO2).NumberFormat = "#,##0.00"
.Range("U15:U" & cptPO2).HorizontalAlignment = xlRight
End With
End SubUne chose dans ton fichier. Sur tes deux feuilles tu as mis un motif blanc par Format / Cellule / Motifs. A éviter à tout prix !!! cela fait prendre du poids à ton fichier inutilement.
Si tu veux une feuille blanche, va décocher l'option "quadrillage" dans le menu Outils -> options -> onglet "affichage".
Amicalement
Bonsoir Dan,
le forum,
Et remplacer
.Range("A15:V" & cptPO2).Interior.ThemeColor = xlThemeColorDark1
par : .Range("A15:V" & cptPO2).Interior.ThemeColor = xlNone
Mille merci Dan; et à bientôt.
Amicalement
Joseph