Format personnalisé monétaire avec une étoile [Résolu]

fabiendag - 12 juin 2013 à 17:00 - Dernière réponse :  fabiendag
- 13 juin 2013 à 12:03
Bonjour a tous,
j'ai un soucis avec mon code VBA sur excel. En fait, j'ai écrit ce code pour pouvoir affiché une valeur entière si la cellule contient un nombre entier et une valeur à deux décimales si la cellule ne contient pas un nombre entier. Le problème est que j'ai certaines de mes cellules contiennent une * à la fin.
J'arrive bien à faire quand même à mettre le sigle "euro", mais l'étoile ne veut pas se mettre.
Si quelqu'un a une idée.
For ligne =  19 To 22
    For colonne = 2 To 12
        If IsNumeric(Cells(ligne, colonne)) = True Then
            If Cells(ligne, colonne) = Int(Cells(ligne, colonne)) Then
                Cells(ligne, colonne).NumberFormat = "# ### €"
            Else
                Cells(ligne, colonne).NumberFormat = "# ###.00 €"
            End If
        Else
            Cells(ligne, colonne) = Left(Cells(ligne, colonne), Len(Cells(ligne, colonne)) - 1)
            If Left(Cells(ligne, colonne), Len(Cells(ligne, colonne)) - 1) = Int(Left(Cells(ligne, colonne), Len(Cells(ligne, colonne)) - 1)) Then
                 Cells(ligne, colonne).NumberFormat = "#\ ###\ \€ " & "" * "" 
            Else
                Cells(ligne, colonne).Format  = "#\ ###\.00 \€ " & "" * ""
            End If
        End If
    Next colonne
Next ligne


En fait le problème se situe sur les deux lignes en gras, il me met bien la valeur de la cellule en format monétaire avec le sigle €, mais ne m'ajoute pas l'étoile à la fin

Fabien
Afficher la suite 

8 réponses

Répondre au sujet
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 12 juin 2013 à 18:27
+3
Utile
Peut-être que tu pourrais essayer avec Chr(42)
Cells(ligne, colonne).Format = "#\ ###\.00 \€ " & Chr(42)

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MPi
Utilisateur anonyme - 12 juin 2013 à 19:21
+3
Utile
Bonjour,

C'est juste normal. Ils disent cela dans l'aide de VBA - Excel.

Début de copie:

NumberFormat, propriété

Cette propriété renvoie ou définit le code de format pour l'objet. Elle renvoie la valeur Null si les cellules de la plage spécifiée n'ont pas toutes le même format de nombre. Type de données String en lecture-écriture pour tous les objets, excepté pour l'objet Range, qui est un type de données Variant en lecture-écriture.

Fin de copie

Puisque ton étoile n'est pas reconnue comme un nombre ou un symbole monétaire, ton étoile vaut Null et ne peut pas être affichée comme un nombre.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 13 juin 2013 à 11:52
+3
Utile
L'événement Change sera toujours rappelé parce que tu apportes un changement. Une façon de pallier à ça est d'utiliser une variable booléenne en entête de module et de jouer avec sa valeur True/False

Tu peux essayer ce bout de code en pas à pas et tu verras comment ça réagit

Dim Modification As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    If Modification = True Then Exit Sub
    
    Modification = True   'premier passage
    ActiveCell = "test"   'ça va rappeler la procédure
    Modification = False  '2e passage
End Sub


PS: quand tu mets du code, sélectionne-le puis utilise le 3e icône à partir de la droite pour le formater de façon plus lisible et indente correctement ton code.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_MPi
fabiendag - 13 juin 2013 à 10:03
0
Utile
bonjour et merci pour votre aide :)
oui c'est vrai cmarcotte, c'est logique.
Par contre, je viens de voir un autre soucis que vous pouviez pas deviner. En fait, j'ai mis cette procédure sur le change de la feuille, or quand je modifie la valeur d'une cellule après le else du milieu :
Cells(ligne, colonne) = Left(Cells(ligne, colonne), Len(Cells(ligne, colonne)) - 1)
la procédure recommence du début, c'est pour cela je pense que j'ai les étoiles qui disparaisent.
Je cherche une solution pour palier à cela. Je vous tiens au courant.

Fabien
Commenter la réponse de fabiendag
fabiendag - 13 juin 2013 à 10:22
0
Utile
J'ai créé un bouton pour lancer le code.
J'ai un message d'erreur sur la ligne suivante :
Cells(ligne, colonne).Format = "# ### €" & Chr(42)
"Propriété ou méthode non gérée par cet objet"
Et si je met numberformat à la place de format, j'ai l'erreur : "Impossible de définir la propriété NumberFormat de la classe Range".
Même problème si je met "# ### €*".

Fabien
Commenter la réponse de fabiendag
fabiendag - 13 juin 2013 à 10:31
0
Utile
Alleluia, j'ai trouvé lol
Dim ligne As Double, colonne As Double

For ligne = 19 To 22
If ligne <> 21 Then
For colonne = 2 To 12
If IsNumeric(Cells(ligne, colonne)) = True Then
If Cells(ligne, colonne) = Int(Cells(ligne, colonne)) Then
Cells(ligne, colonne).NumberFormat = "# ### €"
Else
Cells(ligne, colonne).NumberFormat = "# ###.00 €"
End If
Else
Cells(ligne, colonne) = Left(Cells(ligne, colonne), Len(Cells(ligne, colonne)) - 1)
If Cells(ligne, colonne) = Int(Cells(ligne, colonne)) Then
Cells(ligne, colonne).NumberFormat = "# ### €""*"""
Else
MsgBox Cells(ligne, colonne)
Cells(ligne, colonne).NumberFormat = "# ###.00 €""*"""
End If
End If
Next colonne
End If
Next ligne

J'avais essayé avec l'enregistreur de macro pour avoir ce format, mais hier j'avais un message d'erreur. Je pense que ca venait de la façon d'exécuter le code (dans worksheet.change) qui fait que ca plantait. Là sur le clique d'un bouton cela fonctionne. C'est ce que je voulais, car il faut que le programme s'exécute après avoir choisi un pourcentage de remise.

Merci MPi et cmarcotte de votre aide

Fabien
Commenter la réponse de fabiendag
fabiendag - 13 juin 2013 à 11:59
0
Utile
Pardon MPi, petit oubli de ma part pour l'indentation.
On peut pas remodifier un post ?
En fait, je l'ai changé de place. J'avais besoin de ce bout de code lorsque effectivement des changements étaient effectués dans cette feuille.
Comme les changements se faisaient à partir d'une autre procédure qui calculait une remise, j'ai créé une procédure dans laquelle j'ai mis ce code et que j'apelle cette dernière dans la procédure qui calcule les remises.
Je sais pas si je suis clair.
En gros, j'ai une procédure remise et cette procédure formatage_données. J'appelle donc formatage_données dans remise après avoir calculé la remise sur les cellules


Fabien
Commenter la réponse de fabiendag
fabiendag - 13 juin 2013 à 12:03
0
Utile
Sub etoile(plage)
    Dim ligne As Double, colonne As Double
    
    Dim cellule As Range
    For Each cellule In plage
        If IsNumeric(cellule) = True Then
            If cellule = Int(cellule) Then
                cellule.NumberFormat = "# ### €"
                cellule.Font.Color = vbBlack
            Else
                cellule.NumberFormat = "# ###.00 €"
                cellule.Font.Color = vbBlack
            End If
        Else
            cellule = Left(cellule, Len(cellule) - 1)
            If IsNumeric(cellule) = True Then
                If cellule = Int(cellule) Then
                    cellule.NumberFormat = "# ### €""*"""
                    cellule.Font.Color = vbBlack
                Else
                    cellule.NumberFormat = "# ###.00 €""*"""
                    cellule.Font.Color = vbBlack
                End If
            End If
        End If
    Next cellule
End Sub

Sub calculer()
    Call etoile(Worksheets("91").Range("B19:L22"))
end sub


Je fais un test supplémentaire isnumeric parce que dans les cellules de la plage j'ai une ligne où les cellules contiennent du texte
Fabien
Commenter la réponse de fabiendag

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.