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 :

Format Numérique - de VBA à l'affichage Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Format Numérique - de VBA à l'affichage Excel
    Bonjour le forum,

    Dans le cadre de mon projet, j'ai besoin d'avoir des données chiffrées utilisables. L'utilisateur à l'aide d'une InputBox saisit le montant lié au contrat.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub T_Add_TBM_Change()
        If T_Add_TBM.Text <> "" Then
            T_Add_TBTTC.Visible = True
            T_Add_LBTTC.Visible = True
     
            Do
                TTC = InputBox("Veuillez saisir le montant TTC associé - Syntaxe : 23,23")
            Loop While Not IsNumeric(TTC)
            T_Add_TBTTC.Text = TTC
        End If
    End Sub


    Vous pourrez voir dans le code que je me suis assuré que la variable TTC soit bien un nombre.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
                .Cells(LR, 23) = Format(T_Add_TBTTC.Value, " #,##0.00")


    Le problème survient ici, ou du moins lors de l'affichage Excel. En effet, dans la cellule cette dernière est inscrite en tant que Texte.

    Sauriez-vous m'expliquer d'où vient le problème ? Me serai-je trompé dans la syntaxe ?

    Bonne journée à vous,

    Révèr

  2. #2
    Rédacteur

    Bonjour,
    C'est tout à fait normal
    La fonction Format a pour but de convertir une valeur numérique en String (chaîne de caractères) donc du texte
    Si tu écris directement la valeur numérique dans une cellule elle sera numérique (Attention de veiller à ce que la variable soit bien de type numérique).

    Maintenant si tu souhaites que la cellule ait un format numérique particulier, il y a lieu d'utiliser la propriété NumberFormat et y mettre comme valeur, le format souhaité
    Exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range("B5").NumberFormat = "#,##0.00"

    C'est exactement la même chose que de formater manuellement le format d'une cellule.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #3
    Membre confirmé
    Bonjour Philippe,

    Je voyais beaucoup d'exemples de manipulation des formats numériques avec "Format()" c'est pour ça que j'ai dû me laisser tenter.

    Ma variable est bel et bien numérique, j'ai créé une boucle qui s'effectue tant que la valeur n'est pas numérique. (Bien évidemment, j'ai testé avec un VarType juste avant de créer la boucle pour ne pas me trouver dans une situation délicate )

    En effet ça fonctionne bien mieux comme ça ! Je retiens cette information

    Merci beaucoup pour ton aide !

  4. #4
    Expert éminent sénior
    Citation Envoyé par révèr Voir le message
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
            Do
                TTC = InputBox("Veuillez saisir le montant TTC associé - Syntaxe : 23,23")
            Loop While Not IsNumeric(TTC)

    Vous pourrez voir dans le code que je me suis assuré que la variable TTC soit bien un nombre.
    Il y a bien plus simple que de faire une boucle.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TTC = Application.InputBox(Prompt:="Veuillez saisir le montant TTC associé - Syntaxe : 23,23", Type:=1)


    Il existe deux Inputbox : celle de VBA et celle d'Excel.
    La première est la plus utilisée parce que c'est celle reconnue par défaut par VBA.
    La seconde présente l'avantage d'avoir un paramètre Type qui permet de contrôler la nature du contenu saisie.
    https://docs.microsoft.com/fr-fr/off...ation.inputbox

    Pour ton cas, il suffit donc ce mettre ce paramètre à 2 pour obliger l'utilisateur à saisir un nombre.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Membre confirmé
    Je reviens vers toi puisque j'ai de nouveau un petit problème.

    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    C'est tout à fait normal
    La fonction Format a pour but de convertir une valeur numérique en String (chaîne de caractères) donc du texte
    Si tu écris directement la valeur numérique dans une cellule elle sera numérique (Attention de veiller à ce que la variable soit bien de type numérique).

    Maintenant si tu souhaites que la cellule ait un format numérique particulier, il y a lieu d'utiliser la propriété NumberFormat et y mettre comme valeur, le format souhaité
    Exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range("B5").NumberFormat = "#,##0.00"

    C'est exactement la même chose que de formater manuellement le format d'une cellule.
    En effet, lorsque je saisis une valeur décimale, j'ai toujours cette erreur de formatage sur Excel. Aucun souci lorsque je la saisis en tant que nombre entier, mais dès lors que je passe en nombre à virgule le problème se présente de nouveau.

  6. #6
    Rédacteur

    Bonjour,
    Il est inutile de reprendre toute une discussion en posant une question, cela pollue le fil. Une phrase suffit ou tout simplement un lien vers la discussion quand celle-ci est ancienne
    Il serai en revanche plus utile que tu nous affiches le code que tu as utilisé pour le formatage et pour l'écriture dans la cellule incriminée.

    Cependant, je t'encourage à utiliser les tableaux structurés, comme je crois on te l'a déjà suggéré, et de préformater les cellules dans le format souhaité et ainsi il suffira de simplement écrire la valeur pour visualiser le bon format.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  7. #7
    Membre confirmé
    Désolé pour la citation, je ferai attention à l'avenir !

    J'ai utilisé les tableaux structurés, ou du moins... Je pense l'avoir fait ?

    Je te partage les 2 procédures utilisant cette variable TTC.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub T_Add_TBM_Change()
        Dim TTC As Double
     
        If T_Add_TBM.Text <> "" Then
            T_Add_TBTTC.Visible = True
            T_Add_LBTTC.Visible = True
     
            Do
                'TTC = Application.InputBox(prompt:="Veuillez saisir le montant TTC associé - Syntaxe : 23,23", Type:=2)
                TTC = InputBox("Veuillez saisir le montant TTC associé - Syntaxe : 23,23")
            Loop While Not IsNumeric(TTC)
            T_Add_TBTTC.Text = TTC
        End If
    End Sub


    Dans ce cas-ci, la boucle s'effectue sans aucun souci. La valeur est bien numérique puisque je sors de la boucle.

    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
    Private Sub T_Add_CBOK_Click()
        Dim LR As Integer, test As Integer
     
        Set Wb = Workbooks(OB4.Caption & Frame1.Caption)
        Set WbO = Wb.Sheets(T_Add_TBAC.Text)
        Set t = WbO.ListObjects("MyTable" & T_Add_TBAC.Text)
     
        If vbYes = MsgBox("Confirmez-vous la saisie des données", vbYesNo) Then
            t.ListRows.Add
            LR = t.ListColumns(1).DataBodyRange.Rows.Count
            With t.DataBodyRange
                .Cells(LR, 1) = T_Add_CBSite.Value
                If T_Add_CBSite.Value = "BIC" Then
                    .Cells(LR, 2) = T_Add_CBBIC.Value
                End If
                .Cells(LR, 3) = Format(Now(), "dd/mm/yyyy")
                .Cells(LR, 4) = T_Add_TBINV.Text
     
                'Do
                    'test = Application.InputBox(prompt:="Veuillez saisir l'année de la prestation - " & T_Add_TBAC.Value & " ou " & T_Add_TBAC.Value - 1, Type:=2)
                'Loop Until test = T_Add_TBAC.Value Or test = T_Add_TBAC.Value - 1
     
                .Cells(LR, 11) = test
                .Cells(LR, 15) = T_Add_TBSAP.Text
                .Cells(LR, 16) = T_Add_TBCC.Text
                .Cells(LR, 23) = T_Add_TBTTC.Value
                .Cells(LR, 23).NumberFormat = "#,##0.00"
                .Cells(LR, 29) = T_Add_CBP4.Value
                .Cells(LR, 30) = T_Add_CBP5.Value
                .Cells(LR, 31) = T_Add_CBBG.Value
                .Cells(LR, 18) = T_Add_TBSB.Text
     
                If T_Add_OBCR.Value = True Then
                    .Cells(LR, 5) = T_Add_TBPOCR.Text
                    .Cells(LR, 12) = "C" & test
                    .Cells(LR, 13) = .Cells(LR, 12) & .Cells(LR, 5)
                Else
                    .Cells(LR, 6) = T_Add_TBPOCR.Text
                    .Cells(LR, 12) = "P" & test
                    .Cells(LR, 13) = .Cells(LR, 12)
                End If
                .Cells(LR, 7) = T_Add_TBLib.Text
                .Cells(LR, 9) = T_Add_TBSup.Text
                .Cells(LR, 10) = T_Add_TBM.Value
            End With
        Else
            LR = t.ListColumns(1).DataBodyRange.Rows.Count
            t.ListRows(LR).Delete
        End If
    End Sub


    Et voici la seconde procédure où je procède à l'affichage des résultats dans une nouvelle ligne du tableau structuré.

    L'ajout de toutes les variables se fait sans aucun souci, sauf pour la variable T_Add_TBTTC qui ne prend donc pas le .NumberFormat demandé

    (testé avec .Value ET .Text - même problème)

    La partie "Else" me permet juste de supprimer la dernière ligne lors de mes tests, m'évitant ainsi de créer une multitude de nouvelles lignes dans le tableau.

    Par ailleurs, si ma manipulation du TS est mal effectuée, pourrais-tu me guider sur les points à améliorer ?

    Merci pour ton aide !

    Révèr

  8. #8
    Rédacteur

    Bonjour,
    Dans ce cas-ci, la boucle s'effectue sans aucun souci. La valeur est bien numérique puisque je sors de la boucle
    Le test de sortie de boucle est fait sur la variable TTC mais juste après tu écris T_Add_TBTTC.Text = TTC. Je suppose qu'il s'agit d'un contrôle TextBox ? et un TextBox est de type alphanumérique donc la valeur numérique est repassée automatiquement en String


    Question : Pourquoi utiliser un InputBox alors que tu utilises un UserForm ?

    J'ajouterai que pour lever toute ambiguïté il est important d'ajouter la propriété Value de l'objet Range lors d'opération de lecture/écriture
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .Cells(LR, 23).Value = T_Add_TBTTC.Value
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  9. #9
    Membre confirmé
    J'ai apporté les modifications que tu m'as conseillées, et cela ne marche toujours pas.

    J'ai aussi effectué une autre modification :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Set newLine = t.ListRows.Add


    Ainsi, j'intègre les valeurs directement avec un .Range(,Colonne) ce qui a pas mal réduit le nombre de lignes ^^'

    J'ai par ailleurs ajouté une ligne qui m'affiche dans une cellule voisine si la valeur est numérique ou non.

    .Range(, 22) = IsNumeric(T_Add_TBTTC.Value)

    Après avoir effectué le test, la valeur inscrite dans cette cellule est "VRAI" et dans la cellule voisine, ma variable est toujours stockée sous forme de texte.

    Pour répondre à ta question j'utilise les InputBox pour pouvoir afficher un message précisant le format à respecter. Un numéro de contrat sera écrit "C + 5 digits", cela me permet de prévenir l'utilisateur de la syntaxe à respecter sans avoir à écrire en brut dans le UserForm.

  10. #10
    Rédacteur

    Bonjour,
    Test effectué sur une cellule (B5) formatée manuellement (nombre avec 2 décimales) et la ligne ci-dessous fait bien apparaître le nombre au bon format
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
       ThisWorkbook.Worksheets("Feuil1").Range("B5").Value = Me.TextBox1.Value
    End Sub


    Pour répondre à ta question j'utilise les InputBox pour pouvoir afficher un message précisant le format à respecter. Un numéro de contrat sera écrit "C + 5 digits", cela me permet de prévenir l'utilisateur de la syntaxe à respecter sans avoir à écrire en brut dans le UserForm.
    Pour moi, cela n'a aucun sens d'utiliser un InputBox lorsque l'on travaille avec une interface telle que le UserForm.
    Pour guider l'utilisateur il existe l'infobulle
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  11. #11
    Membre confirmé
    J'ai trouvé ce qui ne fonctionnait pas.

    Déjà... J'ai dimensionné ma variable TTC en tant que Double, au lieu de Currency... J'aurai par ailleurs dû donner plus d'informations quant à la valeur en tant que telle. Si j'avais précisé qu'il s'agissait d'une variable monétaire tu m'aurais sûrement alerté.

    Après avoir effectué ce test avec cette unique modification, cela ne fonctionnait toujours pas et j'ai trouvé ceci, qui fonctionne :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    .Range(, 23).Value = CCur(T_Add_TBTTC.Value)


    Je te remercie grandement pour ta patience et ton aide,

    L'infobulle... ? Je vais me renseigner de suite

    Bonne journée à toi,

    Révèr

  12. #12
    Rédacteur

    Bonjour,
    Pour l'infobulle, c'est la propriété ControlTipText du contrôle
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
      Me.TextBox1.ControlTipText = "Entrez une valeur numérique"
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  13. #13
    Membre confirmé
    J'ai retiré les InputBox pour mettre les ControlTipText. Je te remercie pour le conseil, c'est vrai que ça épure l'exécution du code, c'est visuellement plus agréable.

    Je vais faire de même avec toutes mes TextBox comprenant des InputBox pour les remplacer.

    Le formulaire de saisie prend vraiment forme, au niveau de son exécution. Cela me ravit énormément ! Il ne me reste qu'un dernier point à intégrer pour que cela soit pleinement fonctionnel...
    ...et après il ne me restera plus que 4 autres fichiers sources à travailler + le fichier de résumé