OVH Cloud OVH Cloud

pb de MACRO

22 réponses
Avatar
benmat
Bonjour,

J'exporte des données à partir d'un fichier.csv et j'ai des colonnes de
chiffres à mettre en forme :
- avec un format nombre à 2 décimales, le séparateur de milliers
Et je dois aussi remplacer le . (point) (qui apparaît à l'ouverture du
fichier pour certains chiffres) par une , (virgule).

Le pb que je soulève est le suivant :
- la première colonne se met bien en forme avec la macro ci-dessous
- la seconde colonne me remplace bien le . par une , mais le format nombre
ne s'applique pas (pas de séparateur de milliers, pas de couleur rouge pour
les nombres négatifs).

Quelqu'un a-t-il une solution à me proposer ?
MERCI D'AVANCE.


Columns("D:D").Select
Selection.NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 "
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("AA:AA").Select
Selection.NumberFormat = "#,##0.00_ ;[Red]-#,##0.00 "
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

2 réponses

1 2 3
Avatar
Garette
Bonsoir,

Il existe plusieurs méthodes pour définir les zones à traiter.
En s'inspirant de la méthode déjà choisie, voici un exemple :

Sub SeparateurCSV3()
'Voir Note 1
NbLignes = Range("A65536").End(xlUp).Row
'Voir Note 2
Set MaZone = Union(Range("D1:D" & NbLignes), Range("AA1:AA" & NbLignes))

For Each X In MaZone
If InStr(1, X.Value, ".") <> 0 Then
X.Value = Str(Replace(X.Value, ".", ","))
End If
X.NumberFormat = "# ##0.00;[Red]-# ##0.00"
Next
End Sub


Note 1 :
Y donne le nombre de lignes à traiter. Normalement chaque colonne contient
le meme nb de lignes. Ici on prend la colonne A comme référence.
(Astuce : le mieux c'est de définir ici la colonne où on est sur qu'il y a
des données sans trou)

Note 2 :
La ligne Set MaZone = Union(Range("D1:D" & Y), Range("AA1:AA" & Y)) permet
de définir 2 zones à traiter.
S'il n'y a qu'une zone, on tape seulement : Set MaZone = Range("D1:D" & Y),
S'il y a 3 zones, on aura par exemple, pour la colonne K : Set MaZone =
Union(Range("D1:D" & Y), Range("K1:K" & Y), Range("AA1:AA" & Y))
etc ...
"Union" fait l'union des différentes zones "Range" le tout séparé par une
vigule.

Note 3 :
Dernier ce cas de figure, il n'est pas necessaire de traiter les lignes
d'entete s'il y en a et la colonne la plus "haute" n'est pas forcément la A.
Considérons que Z est la colonne la plus "haute" dans ce cas là le code
serait :

Sub SeparateurCSV4()
NbLignes = Range("Z65536").End(xlUp).Row
Set MaZone = Union(Range("D2:D" & NbLignes), Range("AA2:AA" & NbLignes))

For Each X In MaZone
If InStr(1, X.Value, ".") <> 0 Then
X.Value = Str(Replace(X.Value, ".", ","))
End If
X.NumberFormat = "# ##0.00;[Red]-# ##0.00"
Next
End Sub

Bon décodage ...
Avatar
benmat
Bonjour Garette,

Je te remercie une fois de plus pour ton aide précieuse.
Je garde précieusement ces conseils en archive.

BON WEEK-END


Bonsoir,

Il existe plusieurs méthodes pour définir les zones à traiter.
En s'inspirant de la méthode déjà choisie, voici un exemple :

Sub SeparateurCSV3()
'Voir Note 1
NbLignes = Range("A65536").End(xlUp).Row
'Voir Note 2
Set MaZone = Union(Range("D1:D" & NbLignes), Range("AA1:AA" & NbLignes))

For Each X In MaZone
If InStr(1, X.Value, ".") <> 0 Then
X.Value = Str(Replace(X.Value, ".", ","))
End If
X.NumberFormat = "# ##0.00;[Red]-# ##0.00"
Next
End Sub


Note 1 :
Y donne le nombre de lignes à traiter. Normalement chaque colonne contient
le meme nb de lignes. Ici on prend la colonne A comme référence.
(Astuce : le mieux c'est de définir ici la colonne où on est sur qu'il y a
des données sans trou)

Note 2 :
La ligne Set MaZone = Union(Range("D1:D" & Y), Range("AA1:AA" & Y)) permet
de définir 2 zones à traiter.
S'il n'y a qu'une zone, on tape seulement : Set MaZone = Range("D1:D" & Y),
S'il y a 3 zones, on aura par exemple, pour la colonne K : Set MaZone =
Union(Range("D1:D" & Y), Range("K1:K" & Y), Range("AA1:AA" & Y))
etc ...
"Union" fait l'union des différentes zones "Range" le tout séparé par une
vigule.

Note 3 :
Dernier ce cas de figure, il n'est pas necessaire de traiter les lignes
d'entete s'il y en a et la colonne la plus "haute" n'est pas forcément la A.
Considérons que Z est la colonne la plus "haute" dans ce cas là le code
serait :

Sub SeparateurCSV4()
NbLignes = Range("Z65536").End(xlUp).Row
Set MaZone = Union(Range("D2:D" & NbLignes), Range("AA2:AA" & NbLignes))

For Each X In MaZone
If InStr(1, X.Value, ".") <> 0 Then
X.Value = Str(Replace(X.Value, ".", ","))
End If
X.NumberFormat = "# ##0.00;[Red]-# ##0.00"
Next
End Sub

Bon décodage ...





1 2 3