IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA Réaliser des arrondis.


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut VBA Réaliser des arrondis.
    Bonjour à tous,

    je galere depuis 2 heure sur mon code VBA que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Private Function Arrondi(ByVal Nombre, ByVal Decimales)
          Arrondi = Int(Nombre * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales
    End Function
     
    Sub vba()
     
    Dim DernLigne As Long
     
    Dim Sommetotal As Long
     
    Dim Fs As Object, A As Object
     
    Dim i As Long
     
            feuille = Sheets("information").Range("B6").Value
             Code = Sheets("information").Range("c6").Value
            typeecriture = Sheets("information").Range("E6").Value
     
    Sheets(feuille).Select
    DernLigne = Sheets(feuille).Range("A65536").End(xlUp).Row
    date_export = Replace(Sheets("information").Range("D6").Value, "/", "-")
     
    Set Fs = CreateObject("Scripting.FileSystemObject")
    Set A = Fs.CreateTextFile("J:\Comptabilite\Documents\" & date_export & ".txt", True)
    A.WriteLine ("Type Ecriture   Code Journal    Date de Pièce   N° Compte Général   N° Compte tiers Libellé d'écriture  Montant débit   Montant crédit  N°Plan  N° section")
         For i = 1 To DernLigne
     
             If Sheets(feuille).Range("C" & i).Value <> "" Then
             A.WriteLine (typeecriture & vbTab & Code & vbTab & date_export & vbTab & Range("C" & i) & vbTab & vbTab & Range("A" & i) & vbTab & Range("D" & i) & vbTab & Range("E" & i) & vbTab & vbTab)
     
    Else
     
    End If
       Next
        A.Close
     
    End Sub
    Ce code VBA a pour but créer un fichier txt et extraire les ligne d'une feuille excel. Pour qu'au final nous pussions importer ce fichier dans la compta (sage 100).

    Le problème se situe au niveau de "Range("D" & i) & vbTab & Range("E" & i)",

    Je n'arrive pas à faire arrondir les chiffres à 2 chiffres après la virgule.

    J'ai essayé round il me ressort erreur 13 incompatibilité type.

    Je n'arrive pas avoir le problème, si quelqu'un pourrais me donner une piste

    Merci

    guigui69

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Je ne vois aucun arrondi dans ton code..

    La fonction Round marche très bien.

    De plus aucune raison que le code ne marche pas... Bien qu'il soit un peu pourri

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse,

    J'ai retirer le round dans le code VBA car il ne fonctionnait pas, mais voici le code avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            A.WriteLine (typeecriture & vbTab & Code & vbTab & date_export & vbTab & Range("C" & i) & vbTab & vbTab & Range("A" & i) & vbTab & Round(Range("D" & i), 2) & vbTab & Round(Range("E" & i), 2) & vbTab & vbTab)
    J'ai l'erreur 13 incompatibilité de type

    guigui69

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    tu ne peux rounder que des trucs roundables.. c'est à dire des chiffres, t'as sûrement des strings ou des blancs à l'intérieur, je me trompe ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut
    Oui possible des blancs oui mais strings c'est quoi ?

    Comment contourner cela?

    guigui69

  6. #6
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    string : chaines de caractères ou culotte relativement fine au niveau des fesses

    par exemple tester avant de faire ta ligne avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if isnumeric(Range("D" & i)) and isnumeric(Range("E" & i)) then
    A.WriteLine (typeecriture & vbTab & Code & vbTab & date_export & vbTab & Range("C" & i) & vbTab & vbTab & Range("A" & i) & vbTab & Round(Range("D" & i), 2) & vbTab & Round(Range("E" & i), 2) & vbTab & vbTab)
    else
    A.WriteLine (typeecriture & vbTab & Code & vbTab & date_export & vbTab & Range("C" & i) & vbTab & vbTab & Range("A" & i) & vbTab & Jsépasketufais & vbTab & jsépasketuveux & vbTab & vbTab)
    end if

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut
    Merci pour ton aide,

    par contre avec round ou Application.WorksheetFunction.Round je n'arrive pas avoir le même arrondi que sous excel.


    Dans Excel (le fichier de départ) les deux colonnes sont a 9518.29 et dans mon fichier j'arrive 9518.26 dans la colonne D et 9518.28 dans la colonne E

    Pourquoi ?

    guigui69

  8. #8
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    le bordel des chiffres à virgule... les seuls bons calculs sont sur des entiers, utilise des multiplications par 10 puis des divisions par 10 avant et après faire tes arrondis

    Application.WorksheetFunction.Round fait la même chose que celui d'excel

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut
    Re,

    J'ai modifié comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Sub vba()
     
    Dim DernLigne As Long
     
    Dim Sommetotal As Long
     
    Dim Fs As Object, A As Object
     
    Dim i As Long
     
            feuille = Sheets("information").Range("B6").Value
             Code = Sheets("information").Range("c6").Value
            typeecriture = Sheets("information").Range("E6").Value
     
    Sheets(feuille).Select
    DernLigne = Sheets(feuille).Range("A65536").End(xlUp).Row
    date_export = Replace(Sheets("information").Range("D6").Value, "/", "-")
     
    Set Fs = CreateObject("Scripting.FileSystemObject")
    Set A = Fs.CreateTextFile("J:\Comptabilite\Documents\" & date_export & ".txt", True)
    A.WriteLine ("Type Ecriture   Code Journal    Date de Pièce   N° Compte Général   N° Compte tiers Libellé d'écriture  Montant débit   Montant crédit  N°Plan  N° section")
         For i = 1 To DernLigne
     
             'If Sheets(feuille).Range("C" & i).Value <> "" Then
                             If IsNumeric(Sheets(feuille).Range("D" & i).Value) Then
     
                         Else
                         Sheets(feuille).Range("D" & i).Value = "0,00"
                    End If
     
                             If IsNumeric(Sheets(feuille).Range("E" & i).Value) Then
     
                         Else
                         Sheets(feuille).Range("E" & i).Value = "0,00"
                    End If
     
     
                    If Sheets(feuille).Range("D" & i).Value = "" Then
                         Sheets(feuille).Range("D" & i).Value = "0,00"
                    End If
     
            If Sheets(feuille).Range("E" & i).Value = "" Then
                         Sheets(feuille).Range("E" & i).Value = "0,00"
                     End If
     
     
            A.WriteLine (typeecriture & vbTab & Code & vbTab & date_export & vbTab & Range("C" & i) & vbTab & vbTab & Range("A" & i) & vbTab & (Arrondi((Range("D" & i).Value) * 100, 2)) / 100 & vbTab & (Arrondi(Range("E" & i).Value * 100, 2)) / 100 & vbTab & vbTab)
     
    'Else
     
    'End If
       Next
        A.Close
     
    End Sub
    Qu'en pensez-vous ?

    guigui69

  10. #10
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    bah on en sait rien nous... Si ca te convient c'est parfait...

  11. #11
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut VBA réaliser des arrondis
    Bonsoir,

    Pour ma gouverne, ton code final marche vraiment avec "arrondi" ? Je croyais que VBA ne comprenait que des instructions en Anglais.

    Cordialement.

  12. #12
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    En fait, c'est un peu plus complexe. Tu peux utiliser l'appellation française d'une fonction Excel en VBA si tu l'utilise avec un Excel en français et de paire avec la propriété FormulaLocal de la cellule. Donc, tu dois choisir une ou l'autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").formula ="round("A8",2)"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").formulalocal = "Arrondi(3.456,2)"

    Dans ce cas-ci, son Arrondi() n'est pas la fonction Excel, mais une fonction VBA qui provient de son tout premier message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function Arrondi(ByVal Nombre, ByVal Decimales)
          Arrondi = Int(Nombre * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales
    End Function
    Et puis, depuis Excel 2000, la fonction VBA Round() arrondit le 5 selon les recommandations de l'IEEE. Le 5 est arrondi soit en plus, soit en moins, de façon à être arrondi au nombre pair le plus près.

    Donc 3,5 et 4,5 sont arrondis à 4. Et c'est la même chose en VB.net.

    Mais, la fonction personnalisée utilisée ici, respecte l'avis assez généralisé que le 5 est systématiquement arrondi à l'entier supérieur. Reste maintenant à savoir si Sage se conforme à l'IEEE ou à la tradition.

  13. #13
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut VBA réaliser des arrondis
    Bonjour Clementmarcotte,

    Merci pour les éclaircissements.

    j'avais oublié la variable "arrondi" du premier message qui prête à confusion.

    Cordialement.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    822
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 822
    Points : 49
    Points
    49
    Par défaut
    Bonjour,


    J'ai essayé avec la fonction arrondi ou round j'ai toujours eu un ecart. J'ai donc *100 et diviser par 100.

    Je vais tester aujourd'hui sur d'autre exemple.

    guigui69

  15. #15
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
    Range("A1") = Round(ConverNum([A8]), 0)
    End Sub
     
     
    Function ConverNum(N) As Double
    Dim t
    ConverNum = 0
    t = Replace(N, ".", ",")
    If IsNumeric(t) = True Then ConverNum = t: Exit Function
    t = Replace(t, ",", ".")
    If IsNumeric(t) = True Then ConverNum = t: Exit Function
     
     
    End Function

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Et puis, depuis Excel 2000, la fonction VBA Round() arrondit le 5 selon les recommandations de l'IEEE. Le 5 est arrondi soit en plus, soit en moins, de façon à être arrondi au nombre pair le plus près.

    Donc 3,5 et 4,5 sont arrondis à 4. Et c'est la même chose en VB.net.
    Bonjour,

    je n'ai jamais compris cette recommandation défiant la norme classique voir même les mathématiques,
    peut-être encore un haut fonctionnaire voulant laisser sa trace …


    Sinon pour arrondir, ne pas oublier la fonction Format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Test()
        V1$ = CStr(3.5):  V2$ = CStr(4.5)
        Debug.Print Round(CDbl(V1), 0), Round(CDbl(V2), 0)
        Debug.Print CDbl(Format(V1, "0")), CDbl(Format(V2, "0"))
    End Sub
    Et pour de la précision comptable, le type de variable Currency


    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  17. #17
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    je n'ai jamais compris cette recommandation défiant la norme classique voir même les mathématiques,
    peut-être encore un haut fonctionnaire voulant laisser sa trace …
    Fallait bien faire un choix! Comment aurais-tu fait ? Aléatoirement ? L'impair le plus proche ?

    Et pour la comparabilité du coup ?

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut


    Pour comparer au pair le plus proche, je veux bien mais de là à influencer une norme comptable établie ! …

  19. #19
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Il faut bien qu'il y ait une règle pour que les ordinateurs sachent arrondir...

    Imagine si l'on avait le choix, on arrondirait notre chiffre d'affaire au dessus, nos pertes au dessous..

  20. #20
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut


    Ah bon, parce qu'avant cette recommandation IEEE les ordinateurs ne savaient pas arrondir ?‼

    Ayant travaillé avant 2000 en gestion et dans la finance …

    Comptablement cette norme est à

Discussions similaires

  1. Macro VBA sur des onglets réalisable ?
    Par djiyll dans le forum Excel
    Réponses: 3
    Dernier message: 31/05/2014, 02h28
  2. Réaliser des coins arrondis
    Par laurentSc dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/01/2013, 11h21
  3. Réponses: 7
    Dernier message: 08/03/2004, 16h30
  4. Comment réaliser des modèles de documentations avec XML ?
    Par Dams76 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 29/08/2003, 03h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo