XL 2016 [VBA] procédure évènementielle

shanon7

XLDnaute Junior
Bonjour,

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

Merci!

Shanon
 
Solution
Bonjour Shanon, sylvanu,

VB:
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". ;)

soan

sylvanu

XLDnaute Barbatruc
Supporter XLD
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.
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Shanon, sylvanu,

VB:
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". ;)

soan
 

shanon7

XLDnaute Junior
Bonjour,

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 :D Mais je n'ai pas compris l'imbrication des With. Le 2d With dépend du 1er ?
 

shanon7

XLDnaute Junior
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
 

soan

XLDnaute Barbatruc
Inactif
@shanon7

regarde ces 2 subs événementielles :

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'...
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
'...
End Sub

Target apparaît comme argument de la sub :

ByVal Target As Range

c'est seulement à ce moment-là que tu peux l'utiliser dans le corps de la sub.

Target représente la cellule active lors du déclenchement de l'événement.

soan
 
Dernière édition:

shanon7

XLDnaute Junior
@shanon7

regarde ces 2 subs événementielles :

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'...
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
'...
End Sub

Target apparaît comme argument de la fonction :

ByVal Target As Range

c'est seulement à ce moment-là que tu peux l'utiliser dans le corps de la sub.

Target représente la cellule active lors du déclenchement de l'événement.

soan
aaaah mais oui c'est très clair maintenant merci encore !!!
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Shanon, sylvanu,

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).​

soan
 

shanon7

XLDnaute Junior
Bonjour Shanon, sylvanu,

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).​

soan
Bonjour,

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 ?
 

soan

XLDnaute Barbatruc
Inactif
@shanon7

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).​

soan
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 183
Membres
112 677
dernier inscrit
Justine11