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 :

Problème format d'un nombre (avec décimales) calculé dans un autre module


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Points : 34
    Points
    34
    Par défaut Problème format d'un nombre (avec décimales) calculé dans un autre module
    Bonjour,

    J'ai un problème de format, en effet je dois calculer un montant total à partir d'un prix unitaire qui est dans un fichier plat.
    Dans ce fichier plat il y a position du montant unitaire et la position de la virgule à placer pour reconstituer le montant unitaire
    Ex : 00001280007 -
    Le dernier caractère correspond au placement de la virgule (de la droite vers la gauche)
    Les 10 autres caractères correspondent au montant
    Le montant unitaire est donc 0.0128

    Jusqu'à cette étape je récupère bien 0.0128 mais lorsque je veux récupérer ce montant dans un autre module pour l'utiliser il m'indique 0.

    Ci-dessous les étapes pour reconstituer le montant final plus la macro utilisée

    Pouvez-vous m'aider?

    Merci


    • Dans un module "Module2" - Extraction du montant unitaire dans un fichier plat
      1. Extraction de la chaine de caractère correspondant au montant unitaire
      2. Extraction de la chaine de caractère déterminant la position de la virgule pour la chaine de caractère
      3. Reconstitution du montant de la chaine de caractères
      4. Utilisation d'une fonction " fx_nb_dec" pour formater le montant avec tous les chiffres après la virgule

    • Calcul du montant total




    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
    Public Function SplitAmount(Line As String)
     
    'Montant extrait montant d'une chaine de caractères
    Montant = Replace(Mid(strLine, 38, 14), " ", "")
    'Montant_Decimal_Locator donne le nombre de caractère de droite à gauche pour placer la virgule
    Montant_Decimal_Locator = Replace(Mid(strLine, 52, 1), " ", "")
     
     
    Nb_Decimale = Len(Montant) - Montant_Decimal_Locator
    nb_Avant_Virgule = Mid(Montant, 1, Montant_Decimal_Locator)
    nb_Après_Virgule = Mid(Montant, Montant_Decimal_Locator + 1, Len(Montant) - Montant_Decimal_Locator)
     
    Montant_Final_Unitaire = fx_nb_dec((nb_Avant_Virgule & "," & nb_Après_Virgule), Nb_Decimale)
     
    End Function
     
     
    Public Function fx_nb_dec(ByVal Nombre, ByVal Decimales)
        fx_nb_dec = Int(Nombre * 10 ^ Decimales + 1 / 2) / 10 ^ Decimales
    End Function
     
     
    'Dans un autre module
     
    Public Montant_Final_Unitaire As Double
     
    Sub test
    Dim Montant As Double
    Dim Quantité as Integer
    Dim...
     
    Montant_Total = Quantité * Montant_Final_Unitaire

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Option Explicit en début de chaque module est une excellente méthode pour éviter ce qui se passe !
    D'autre part j’évite l'emploi des variables publiques car c'est généralement une source de problèmes.
    Il est préférable de transmettre des variables locales aux procédures qui en ont besoin.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Sur la base de ton exemple 00001280007 - avec un seul chiffre indiquant la position du séparateur décimal

    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
    Sub Test()
    Dim Montant_Final_Unitaire As String
    Dim Montant_Total As Double
    Dim Quantité As Integer
     
    Montant_Final_Unitaire = "00001280007 - "
    Quantité = 1
     
    Montant_Total = Quantité * SplitAmount(Montant_Final_Unitaire)
    MsgBox Montant_Total
    End Sub
     
    Private Function SplitAmount(ByVal strLine As String) As Double
    Dim PosDec As Integer
     
    strLine = Split(strLine)(0)
    PosDec = Right(strLine, 1)
    PosDec = Len(strLine) - PosDec
    strLine = Left(strLine, Len(strLine) - 1)
     
    SplitAmount = Val(Left(strLine, PosDec - 1) & "." & Mid(strLine, PosDec))
    End Function


    Sinon,
    Déclare proprement tes variables.
    Le séparateur de décimal de vba est le point
    Utiliser VAL pour convertir une chaine en nombre
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut

    Si j'ai bien compris, tu dois diviser le nombre sans le dernier caractère par 10 puissance ce dernier caractère.

    Si en A1, on a '00001280007 (chaîne de caractères)

    alors

    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
    Option Explicit
     
    Sub calcul_nombre_déc()
     
    Dim lenombre As Long
    Dim lapuiss As Byte
    Dim nombre_dec As Double
     
    With Worksheets(1).Range("A1")
            lenombre = Left(.Text, Len(.Text) - 1) + 0
            lapuiss = Right(.Text, 1) + 0
    End With
     
    nombre_dec = lenombre / WorksheetFunction.Power(10, lapuiss)
     
    Debug.Print nombre_dec
     
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  5. #5
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Hé salut, ami mercatog
    Je viens de voir ton post.

    Mon code est à adapter si, comme je ne l'avais pas vu, le nombre est suivi de " -".
    Il suffit de considérer le 1er élément d'un split avec " " comme séparateur. (Listindex 0)

    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
    Option Explicit
     
    Sub calcul_nombre_déc()
     
    Dim lenombre As Long
    Dim lapuiss As Byte
    Dim nombre_dec As Double
     
    Dim lacstr As String
    lacstr = Split(Worksheets(1).Range("A1"), " ")(0)
     
    lenombre = Left(lacstr, Len(lacstr) - 1) + 0
    lapuiss = Right(lacstr, 1) + 0
     
    nombre_dec = lenombre / WorksheetFunction.Power(10, lapuiss)
     
    Debug.Print nombre_dec
     
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


Discussions similaires

  1. Réponses: 1
    Dernier message: 23/04/2015, 14h11
  2. Réponses: 8
    Dernier message: 08/10/2014, 14h17
  3. Nombre avec décimales
    Par flamby6969 dans le forum VBA Access
    Réponses: 9
    Dernier message: 02/04/2009, 00h56
  4. Formater un attribut nombre avec sql
    Par khadir dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2008, 17h53
  5. InputBox nombre avec décimal
    Par Baba75AB dans le forum IHM
    Réponses: 2
    Dernier message: 19/06/2008, 17h09

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