Cherchant à perfectionner mon tout petit niveau en vba, je bute sur le problème suivant...
J'ai rédigé pour m'entraîner une macro très élémentaire permettant d'appliquer en seule une opération les attributs gras et italique au contenu d'une cellule.
La macro fonctionne bien lorsque je ne sélectionne qu'une seule cellule, chaque clic sur le bouton associé permet de passer de non formaté à gras-italique, et vice versa.
En revanche, lorsque je sélectionne une plage de plusieurs cellule, je n'obtiens pas forcément le résultat escompté.
Je remarque que la macro ne fonctionne que quand la plage sélectionnée contient un nombre impair de cellules. Lorsque il y en a un nombre pair, la macro applique puis retire le formatage dans la même exécution.
Code:
Sub GrasItalique()
Dim plage As Range
Dim cel As Range
Set plage = Selection
For Each cel In plage
If Selection.Font.Bold = False Or Selection.Font.Italic = False Then
Appliquer_GrasItalique
Else: Enlever_GrasItalique
End If
Next cel
End Sub
Sub Appliquer_GrasItalique()
Selection.Font.Italic = True
Selection.Font.Bold = True
End Sub
Sub Enlever_GrasItalique()
Selection.Font.Italic = False
Selection.Font.Bold = False
End Sub
Comment puis-je améliorer le code pour m'affranchir de ce problème ?
La solution est probablement évidente mais elle ne saute pas à mes yeux peu expérimentés.
Merci par avance à qui pourra m'éclairer.
Sub GrasItalique()
Dim plage As Range
Dim cel As Range
Set plage = Selection
For Each cel In plage
If [SIZE=3][COLOR=red][B]cel[/B][/COLOR][/SIZE].Font.Bold = False Or [SIZE=3][COLOR=red][B]cel[/B][/COLOR][/SIZE].Font.Italic = False Then
Appliquer_GrasItalique
Else: Enlever_GrasItalique
End If
Next cel
End Sub
Merci de ta réponse rapide.
Ta précision est probablement nécessaire effectivement, mais en l'état le problème n'est pas résolu.
Le souci provient du fait que la commande Next cel implique que la boucle est effectuée plusieurs fois, en particulier un nombre pair de fois lorsque la plage contient un nombre pair de cellules.
Je pense que l'instruction For Each cel... Next cel n'est pas appropriée dans mon cas, la boucle n'est pas requise. I faut juste appliquer la Sub adéquate sur toutes les cellules de la plage, indépendamment de leur nombre... mais là, je sèche...
Sub GrasItalique()
Dim plage As Range
Dim Cel As Range
Set plage = Selection
For Each Cel In plage
If Cel.Font.Bold = False Or Cel.Font.Italic = False Then
Appliquer_GrasItalique cel
Else: Enlever_GrasItalique Cel
End If
Next Cel
End Sub
Sub Appliquer_GrasItalique(Cel As Range)
Cel.Font.Italic = True
Cel.Font.Bold = True
End Sub
Sub Enlever_GrasItalique(Cel As Range)
Cel.Font.Italic = False
Cel.Font.Bold = False
End Sub
soit tu écris:
Code:
Sub GrasItalique()
Dim plage As Range
Dim cel As Range
Set plage = Selection
For Each cel In plage
Cel.Select
If Cel.Font.Bold = False Or Cel.Font.Italic = False Then
Appliquer_GrasItalique
Else: Enlever_GrasItalique
End If
Next cel
End Sub
Sub Appliquer_GrasItalique()
Selection.Font.Italic = True
Selection.Font.Bold = True
End Sub
Sub Enlever_GrasItalique()
Selection.Font.Italic = False
Selection.Font.Bold = False
End Sub
Mais personnellement j'écrirais:
Code:
Sub GrasItalique()
Dim Cel As Range
If TypeOf Selection Is Range Then
For Each Cel In Selection
With Cel
.Font.Bold = Not .Font.Bold
.Font.Italic = Not .Font.Italic
End With
Next
End If
End Sub
Pour gérer indépendament le gras et l'italic
Sinon
Code:
With Cel
.Font.Bold = Not .Font.Bold
.Font.Italic = .Font.Bold
End With
Pour que l'italic soit et le gras soit dépendant l'un de l'autre.
Je ne vous pas l'utilité d'une boucle dans ce cas. Partant du principe que les critères "gras" et "italique" vont de pair, il me semble qu'il suffit :
- de tester l'état "gras" de la cellule "haut-gauche" ("Selection.Cells(1, 1)") de la plage en cause,
- d'appliquer à l'ensemble de cette plage le format voulu en fonction de l'état de la cellule "haut-gauche" de la plage :
Code:
Sub Bascule_Gras_Italique()
If Selection.Cells(1, 1).Font.Bold = True Then
Selection.Font.Bold = False
Selection.Font.Italic = False
Else
Selection.Font.Bold = True
Selection.Font.Italic = True
End If
End Sub
Cela fonctionne chez moi (Excel 2003) même pour une plage de cellules disjointes.
Dans mon esprit, le formatage G-i devait s'appliquer à toutes les cellules de la plage, indépendamment de leur format initial, de la même façon que peuvent le faire les boutons Gras, Italique ou Souligné de la barre d'outils Mise en Forme.
L'exécution suivante retire ensuite les attributs G-i à toutes les cellules de la plage.
C'est pourquoi je pense que l'instruction "For Each cel..." n'est pas la plus appropriée, et qu'il faudrait pouvoir traiter directement l'intégralité de la plage, et non chaque cellule individuellement.
Je vous remercie en tous cas pour toutes vos indications, qui constituent de nouvelles pistes d'exploration pour moi dans mon auto-apprentissage balbutiant...
J'y retourne !!