Aide pour macro modifiant le format de nombre
Bonjour,
j'essaye d'apprendre a mes servir des macro mais il y a un cas pratique que je n'arrive pas a faire.
Cela parait simple (facile a faire en mise en forme conditionnelle) mais je crois que ce qui me bloque c'est de ne pas savoir me servir des variables.
objectifs : sur une liste de données faire afficher le bon nombre de décimale en fonction de la valeurs affiché dans la cellule.
Dans l'exemple joint ce qu'il me faut modifier sont les colonnes B, E, F ( avec un maximum de 200 lignes)
j'ai commencé a faire une base de macro, mais je ne sais pas du tout comment faire pour affecter le format à la cellule :
Sub decimale()
Dim c As Range
For Each c In Range("B7:B200")
If IsNumeric(c) Then
If c = 0 Then
NumberFormat = "0"
If c < 0.01 Then
NumberFormat = "0.00000"
ElseIf c < 0.1 Then
NumberFormat = "0.0000"
ElseIf c < 1 Then
NumberFormat = "0.000"
ElseIf c < 10 Then
NumberFormat = "0.00"
ElseIf c < 100 Then
NumberFormat = "0.0"
Else
NumberFormat = "0"
End If
Else
End If
Next
End Sub
ou je pensais utiliser plusieurs sub, avec la fonction case, mais le problème reste le même :
Sub decimale2()
Select Case Target.Value
Case Is = 0: format0
Case Is > 100: format0
Case 10 To 100: format1
Case 1 To 10: format2
Case 0.1 To 1: format3
Case 0.01 To 0.1: format4
Case 0.001 To 0.01: format5
End Select
End Sub
Sub format0()
c.NumberFormat = "0"
End Sub
Sub format1()
c.NumberFormat = "0.0"
End Sub
Sub format2()
c.NumberFormat = "0.00"
End Sub
Sub format3()
c.NumberFormat = "0.000"
End Sub
Sub format4()
c.NumberFormat = "0.0000"
End Sub
Sub format5()
Set c.NumberFormat = "0.00000"
End Sub
Merci beaucoup pour votre aide
point bonus: je ne me suis pas encore penché dessus, mais il faut que je trouve comment faire en sorte d'appliquer les meme format aux cellules qui sont placés a côté de min et max, avec des si une cellule en B contient "min" alors appliquer une macro precedente a la cellule C
Bonjour,
Vous étiez sur la bonne piste, il suffisait d'un mix de vos deux solutions :
Sub decimale()
Dim c As Range
For Each c In Application.Union(Range("B7:B200"), Range("C23:C26"))
If IsNumeric(c) Then
Select Case c
Case 0: c.NumberFormat = "0"
Case Is > 100: c.NumberFormat = "0"
Case 10 To 100: c.NumberFormat = "0.0"
Case 1 To 10: c.NumberFormat = "0.00"
Case 0.1 To 1: c.NumberFormat = "0.000"
Case 0.01 To 0.1: c.NumberFormat = "0.0000"
Case 0.001 To 0.01: c.NumberFormat = "0.00000"
End Select
End If
Next
End Sub
Cdlt,
PS : Pour votre question bonus j'ai utilisé Application.Union pour inclure une deuxième range dans la macro. Il vous suffirait de nommer cette range et ramener son nom dans la macro pour qu'elle soit inclue de façon dynamique :
For Each c In Application.Union(Range("B7:B200"), Range("MA_PLAGE"))
Merci beaucoup Ergotamine,
Merci beaucoup pour votre aide et cette reponse super rapide, il me manquait si peu
Pour le bonus je n'ai pas donné le détail contraignant :
Le fichier que j'ai mis en exemple n'est pas le vrai fichier, les cellules ne sont pas toujours sur la même ligne, et sont sur une colonne où je ne dois pas modifier le format des nombre... c'est pour ça que c'était plus complexe. Je pensais aussi à partir sur une piste de fonction recherche.
Merci encore :)
Bonjour,
Dans ce cas on peut aussi envisager ça, même si c'est un peu long (et surement optimisable) :
Sub decimale()
Dim c As Range
For Each c In Range("B7:B200")
If IsNumeric(c) Then
Select Case c
Case 0: c.NumberFormat = "0"
Case Is > 100: c.NumberFormat = "0"
Case 10 To 100: c.NumberFormat = "0.0"
Case 1 To 10: c.NumberFormat = "0.00"
Case 0.1 To 1: c.NumberFormat = "0.000"
Case 0.01 To 0.1: c.NumberFormat = "0.0000"
Case 0.001 To 0.01: c.NumberFormat = "0.00000"
End Select
End If
If c Like "*min*" Or c Like "*max*" Then 'On regarde si la cellule contient min ou max dans ce cas
Select Case c.Offset(0, 1) 'On regarde la valeur de droite en décalant d'une colonne
Case 0: c.Offset(0, 1).NumberFormat = "0"
Case Is > 100: c.Offset(0, 1).NumberFormat = "0"
Case 10 To 100: c.Offset(0, 1).NumberFormat = "0.0"
Case 1 To 10: c.Offset(0, 1).NumberFormat = "0.00"
Case 0.1 To 1: c.Offset(0, 1).NumberFormat = "0.000"
Case 0.01 To 0.1: c.Offset(0, 1).NumberFormat = "0.0000"
Case 0.001 To 0.01: c.Offset(0, 1).NumberFormat = "0.00000"
End Select
End If
Next
End Sub
Cdlt,
ça marche au top !!
Merci beaucoup pour votre aide,
bonne soirée et bonne semaine