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

20exemple.xlsm (15.04 Ko)

Merci à tous.

Bonjour,

A tester

26linpro.xlsm (17.51 Ko)

A+

Merci Frangy !

Ca marche très bien Mais tu utilises des codes que je ne comprends pas. Tu pourrais essayer de m'expliquer pour que je sache refaire ?

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

psdi a écrit :

Cells(Lig, "C") = Replace(Cells(Lig, "C"), ",", ".")

devrait fonctionner et éviter l'écriture plus lourde
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

que j'avais proposée.

==> 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 !

Rechercher des sujets similaires à "vba amelioration programme"