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
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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 13 juin 2013 à 11:52
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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 "# ### €*".
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.
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
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