Différence entre total VBA et somme automatique

65classeur2.zip (141.31 Ko)

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 Sub

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

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

Une 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

Rechercher des sujets similaires à "difference entre total vba somme automatique"