macro qui fait et défait...

cristobal61

XLDnaute Nouveau
Bonjour,

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.
 
G

Guest

Guest
Re : macro qui fait et défait...

Bonsoir,

Sans doute:

Code:
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

A+
 

cristobal61

XLDnaute Nouveau
Re : macro qui fait et défait...

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...
 
G

Guest

Guest
Re : macro qui fait et défait...

Re,

Soit tu écris:
Code:
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.

A+
 
Dernière modification par un modérateur:

Lermiton

XLDnaute Nouveau
Re : macro qui fait et défait...

Bonsoir cristobal61, Hasco, et le forum.

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.

Bonne fin de soirée.
 

cristobal61

XLDnaute Nouveau
Re : macro qui fait et défait...

Merci Hasco et Lermiton pour vos réponses.

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 !! ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 579
Messages
2 089 900
Membres
104 300
dernier inscrit
katlynefortin