Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je me forme sur VBA et j'essaie de faire l'exercice suivant, mais en vain. J'ai soit un message d'erreur, soit rien ne se passe 🙁
Ecrire une procédure qui affiche Bonjour ! dans la cellule active avec la police
suivante : taille 12, style italique, couleur rouge, à chaque fois que l’utilisateur
active la feuille de calcul FEUIL2
Voici ce que j'ai fait :
1) Je vais dans le module associé à la feuille 2
2) Je sélectionne Worksheets et Activate, ce qui m'écrit Private Sub Worksheet_Activate()
3) J'essaie d'écrire les lignes de code suivantes, en utilisant With pour éviter de me répéter 3 fois, ce qui donne au final :
Private Sub Worksheet_Activate()
Target = "bonjour!"
With Target.Interior.Font
.Size = 12
.Italic = True
.Color = RGB(255, 0, 0)
End With
End Sub
Je ne sais pas ce que j'ai mal fait, la syntaxe du with peut-être ? L'utilisation de la variable target ? Je ne vois pas :/
Private Sub Worksheet_Activate()
With ActiveCell
.Value = "Bonjour !"
With .Font
.Size = 12
.Italic = True
.Color = RGB(255, 0, 0)
End With
End With
End Sub
n'oublie pas de changer de feuille pour activer ta "Feuil2". 😉
Bonjour Shanon,
Target est une variable. Dans votre exemple elle n'est pas déclarée, ni passée en paramètre.
Donc c'est par ex :
VB:
Private Sub Worksheet_Activate()
[A1] = "bonjour!"
With [A1].Font
.Size = 12
.Italic = True
.Color = RGB(255, 0, 0)
End With
End Sub
Target s'utilise par ex dans une macro Worksheet_SelectionChange :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Fin
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("B1:O32")) Is Nothing Then
[A1] = Target.Address
With [A1].Font
.Size = 12
.Italic = True
.Bold = True
.Color = RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd))
End With
End If
Fin:
End Sub
Où Target est la variable passée en paramètres, que vous auriez pu appeler comme vous voulez, Target n'étant qu'un terme que tout le monde utilise par habitude.
Private Sub Worksheet_Activate()
With ActiveCell
.Value = "Bonjour !"
With .Font
.Size = 12
.Italic = True
.Color = RGB(255, 0, 0)
End With
End With
End Sub
n'oublie pas de changer de feuille pour activer ta "Feuil2". 😉
Merci à vous deux pour vos réponses.
Malheureusement, je ne suis pas sûre d'avoir bien compris
Sylvanu que voulez-vous dire par "target est une variable. Dans votre exemple elle n'est pas déclarée, ni passée en paramètre" ? Qu'est ce qu'une variable véritablement en vba ?
Soan, merci en effet j'ai essayé le code fonctionne bien 😀 Mais je n'ai pas compris l'imbrication des With. Le 2d With dépend du 1er ?
Re,
Dans mon premier ex Target n'est tout simplement pas utilisée.
Dans le second elle est passée en paramètre : Sub Worksheet_SelectionChange(ByVal TargetAs Range)
Re,
Ah oui oui d'accord mais dans ce cas là quand est-ce qu'on utilise target et quand est-ce que l'on peut le substituer par range ou bien activecell ?
Car dans un autre exercice j'avais vu que target était utilisé au lieu de range, et je n'avais pas bien compris pourquoi. J'ai donc pensé qu'on utilisait target au lieu de range, activecell etc lorsqu'on était dans une procédure évènementielle comme ici
hier, j'ai écrit : « Target représente la cellule active lors du déclenchement de l'événement. »
en fait, Target est effectivement la cellule active si une seule cellule est sélectionnée ; mais si la sélection comporte plusieurs cellules, alors Target est l'ensemble des cellules de la sélection ; c'est pourquoi j'écris souvent la sub selon cette « structure » :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub 'sortie s'il y a
'plus d'une cellule dans la sélection => la suite
'de la sub est exécutée QUE si UNE SEULE cellule
'est SÉLECTIONNÉE.
'suite de la sub, en général test de POSITION :
'par exemple si c'est QUE pour la cellule D5 :
If .Address <> "$D$5" Then Exit Sub
'suite de la sub, qui est UNIQUEMENT pour D5
End With
'ici, on peut mettre des instructions qui ne sont
'pas dépendantes du With de Target.
End Sub
j'aurais aussi pu écrire ainsi le test de position :
VB:
If .Address(0, 0) <> "D5" Then Exit Sub
si le test de position est pour plusieurs cellules, on peut mettre par exemple :
VB:
If Intersect(Target, [G5:G20]) Is Nothing Then Exit Sub
on sort si la cellule n'est pas dans la plage G5:G20, donc la suite de la sub est exécutée QUE si l'utilisateur modifie une cellule de G5:G20 ; autre exemple, si c'est QUE pour F8 ou une cellule en dessous :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub 'sortie si colonne AUTRE que F
If .Row < 8 Then Exit Sub 'sortie si n° ligne < 8
'suite de la sub
End With
End Sub
c'est-à-dire que c'est en colonne F, à partir de la ligne 8 (= ligne haute minimum), mais la ligne qui est sous la ligne 8 (= ligne basse maximum) est INDÉTERMINÉE (donc sans précision, ça peut être n'importe laquelle de la ligne 9 à la ligne 1 048 576).
hier, j'ai écrit : « Target représente la cellule active lors du déclenchement de l'événement. »
en fait, Target est effectivement la cellule active si une seule cellule est sélectionnée ; mais si la sélection comporte plusieurs cellules, alors Target est l'ensemble des cellules de la sélection ; c'est pourquoi j'écris souvent la sub selon cette « structure » :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub 'sortie s'il y a
'plus d'une cellule dans la sélection => la suite
'de la sub est exécutée QUE si UNE SEULE cellule
'est SÉLECTIONNÉE.
'suite de la sub, en général test de POSITION :
'par exemple si c'est QUE pour la cellule D5 :
If .Address <> "$D$5" Then Exit Sub
'suite de la sub, qui est UNIQUEMENT pour D5
End With
'ici, on peut mettre des instructions qui ne sont
'pas dépendantes du With de Target.
End Sub
j'aurais aussi pu écrire ainsi le test de position :
VB:
If .Address(0, 0) <> "D5" Then Exit Sub
si le test de position est pour plusieurs cellules, on peut mettre par exemple :
VB:
If Intersect(Target, [G5:G20]) Is Nothing Then Exit Sub
on sort si la cellule n'est pas dans la plage G5:G20, donc la suite de la sub est exécutée QUE si l'utilisateur modifie une cellule de G5:G20 ; autre exemple, si c'est QUE pour F8 ou une cellule en dessous :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub 'sortie si colonne AUTRE que F
If .Row < 8 Then Exit Sub 'sortie si n° ligne < 8
'suite de la sub
End With
End Sub
c'est-à-dire que c'est en colonne F, à partir de la ligne 8 (= ligne haute minimum), mais la ligne qui est sous la ligne 8 (= ligne basse maximum) est INDÉTERMINÉE (donc sans précision, ça peut être n'importe laquelle de la ligne 9 à la ligne 1 048 576).
Ah oui voulez-vous dire par là que selon notre besoin, il faut spécifier si l'on veut que la sub concerne une cellule ou bien un ensemble de cellules ?
oui, c'est bien selon le besoin ; la sub Worksheet_Change() est appelée en cas de modif d'une cellule ; mais c'est à toi de choisir si une seule cellule précise doit déclencher l'action, par exemple D8 ; ou si c'est une des cellules de la plage C3:G20(autre exemple).
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD