VBA - amélioration d'un programme
Bonjour à tous,
J'ai fais un programme pour :
1) Supprimer la colonne A
2) Supprimer la ligne 1
3) Pour la colonne C :
- changer les points en virgules
- multiplier par -1 les valeurs
- Changer les virgules en points
Pour cela j'ai utilisé des macros ...
J'aimerais améliorer mon programme au niveau du points 3).
--> Dans cette colonne, je peux avoir des valeurs positives, nulles ou négatives :
- Si ma valeur est inférieure à 0, je veux la multiplier par -1
- Si ma valeur est nulle je peux ne rien faire ou la multiplier par -1 ...
- Si ma valeur est positive, je veux tout simplement la supprimer (la remplacer par rien).
Mais les séparateurs des décimales sont des points, or pour les calculs il me faut des virgules, et mon fichier final doit être en point.
Avez-vous des idées ?
Je vous mets en pièce jointe mon travail
Merci à tous.
Merci Frangy !
Ca marche très bien
Sub XYZ()
Dim LigEnd As Integer, Lig As Integer
Dim Valeur As Double
'Pour connaître le rang de la dernière ligne non vide --> OK
LigEnd = Range("C" & Rows.Count).End(xlUp).Row
'Pour convertir les valeurs négatives en valeurs positives
For Lig = 1 To LigEnd
If IsNumeric(Replace(Range("C" & Lig), ".", ",")) Then '--> = "Si ma valeur est numérique ... " Je ne comprends pas ce qu'il y a dans les parenthèses ... juste que tu veux remplacer les points par les virgules ...
Valeur = CDbl(Replace(Range("C" & Lig), ".", ",")) '--> CDbl ? Je ne connais pas, je viens de voir sur internet que c'est un fonction qui permet de transformer une chaîne de texte en nombre "double". Mais je ne comprends toujours pas comment utiliser ce qu'il y a dans les parenthèses.
Select Case Valeur
Case Is < 0
Range("C" & Lig) = Format(-Valeur, "0.000") '--> le "-" sert à rendre positives les valeurs négatives, et "0.000 permet de garder une valeur avec 3 chiffes significatifs et un point comme séparateur des décimales. C'est ça ?
Range("C" & Lig).NumberFormat = "@" '--> Je ne comprends pas non plus :(
Range("C" & Lig) = Replace(Range("C" & Lig), ",", ".") '--> et ça non plus ...
Case Is > 0
Range("C" & Lig) = "" '--> OK
End Select
End If
Next Lig
End Sub
Merci d'avance
Bonjour,
Une autre solution qui utilise la fonction 'Val' (voir aide VBA).
Elle reconnaît le point comme séparateur décimal.
Cdlt
Sub XYZ_1()
Dim LigEnd As Integer, Lig As Integer
Application.ScreenUpdating = False
LigEnd = Range("C" & Rows.Count).End(xlUp).Row
For Lig = 1 To LigEnd
Select Case Val(Cells(Lig, "C"))
Case Is < 0
Cells(Lig, "C") = Val(Cells(Lig, "C")) * -1
Case 0
Cells(Lig, "C") = Val(Cells(Lig, "C"))
Case Else
Cells(Lig, "C") = ""
End Select
Next Lig
End Sub
Jean-Eric a écrit :Bonjour,
Une autre solution qui utilise la fonction 'Val' (voir aide VBA).
Elle reconnaît le point comme séparateur décimal.
Cdlt
Merci Jean-Eric,
Le code que tu me proposes fonctionne très bien, a un détail près : mes valeurs finales ont des virgules. Je me permet donc de compléter ta proposition pour que le fichier final ne comporte pas de virgules (ça pourra peut-être en aider certains !):
Dim LigEnd As Integer, Lig As Integer
Application.ScreenUpdating = False
LigEnd = Range("C" & Rows.Count).End(xlUp).Row
For Lig = 1 To LigEnd
Select Case Val(Cells(Lig, "C"))
Case Is < 0
Cells(Lig, "C") = Val(Cells(Lig, "C")) * -1
Case 0
Cells(Lig, "C") = Val(Cells(Lig, "C"))
Case Else
Cells(Lig, "C") = ""
End Select
Next Lig
For Lig = 1 To Range("C" & Application.Rows.Count).End(xlUp).Row
Range("C" & Lig) = Replace(Range("C" & Lig), ",", ".")
Next Lig
End Sub
Encore merci
Initialement, les valeurs de la colonne C sont de type texte.
On applique l’instruction
Replace(Range("C" & Lig), ".", ","))
qui remplace le point par une virgule. Si la cellule ne contient pas de point, elle n’a aucun effet.
Cela permet qu’une valeur telle que 10.000 puisse être reconnue comme numérique.
If IsNumeric(Replace(Range("C" & Lig), ".", ",")) Then
Ce test permet de s’assurer que la valeur peut être transformée en valeur numérique, ce qui permet d’isoler les cellules qui ne contiennent pas une valeur numérique (cellule vide par exemple).
Valeur = CDbl(Replace(Range("C" & Lig), ".", ","))
La variable "Valeur" est déclarée de type Double. On lui affecte la valeur de la cellule transformée en valeur numérique de type Double.
Range("C" & Lig) = Format(-Valeur, "0.000") --> le "-" sert à rendre positives les valeurs négatives, et "0.000 permet de garder une valeur avec 3 chiffes significatifs.
Range("C" & Lig).NumberFormat = "@" --> Applique un format Texte à la cellule
Range("C" & Lig) = Replace(Range("C" & Lig), ",", ".") --> Remplace la virgule par un point pour revenir à la présentation initiale avec des points.
A+
Pour rester dans le style de jean Eric, il me semble qu'on doit pouvoir écrire :
Dim LigEnd As Integer, Lig As Integer
Application.ScreenUpdating = False
LigEnd = Range("C" & Rows.Count).End(xlUp).Row
For Lig = 1 To LigEnd
Select Case Val(Cells(Lig, "C"))
Case Is < 0
Cells(Lig, "C") = Val(Cells(Lig, "C")) * -1
Cells(Lig, "C") = Replace(Cells(Lig, "C"), ",", ".")
Case 0
Cells(Lig, "C") = Val(Cells(Lig, "C"))
Case Else
Cells(Lig, "C") = ""
End Select
Next Lig
End Sub
Re,
Sub XYZ_1()
Dim LigEnd As Integer, Lig As Integer
Application.ScreenUpdating = False
LigEnd = Range("C" & Rows.Count).End(xlUp).Row
For Lig = 1 To LigEnd
Select Case Val(Cells(Lig, "C"))
Case Is < 0
Cells(Lig, "C") = Replace(Val(Cells(Lig, "C")) * -1, ",", ".")
Case 0
'
Case Else
Cells(Lig, "C") = ""
End Select
Next Lig
End Sub
Merci frangy pour ces explications !
Merci aussi à psdi. Je n'ai pas encore testé ton code. Mais
devrait fonctionner et éviter l'écriture plus lourdepsdi a écrit :Cells(Lig, "C") = Replace(Cells(Lig, "C"), ",", ".")
que j'avais proposée.linpro.lalaland a écrit :For Lig = 1 To Range("C" & Application.Rows.Count).End(xlUp).Row
Range("C" & Lig) = Replace(Range("C" & Lig), ",", ".")
Next Lig
==> Je viens de voir que Jean-Eric a vérifié tout ça ;p
Grâce à vous tous, mon programme est carrément plus simple, ne serait-ce qu'à comprendre pour déceler d'éventuels problème, et pour être complété par la suite !!
Re,
La réponse de Frangy n'est pas à ignorer...
La fonction 'Val' n'est efficace que si on certain de récupérer une valeur 'texte', 'numérique'.
Cdlt.
Jean-Eric a écrit :La réponse de Frangy n'est pas à ignorer...
J'ai testé le code de Frangy puisque je l'ai complété
C'est le complément de psdi que je n'ai pas testé, et que tu as intégré différemment dans le code de Frangy.
J'essaye au contraire d'enregistrer le plus d'informations possibles de vos propositions. ce qui me sera certainement très utile par la suite !