Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel
Excel Forum d'entraide sur Excel. Vos questions sur les fonctions, formules, manipulations, et tout sujet qui ne trouve pas sa place dans un sous-forum.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 14/03/2010, 14h19   #1
Invité de passage
 
Denis Schneider
Inscription : mars 2010
Messages : 1
Détails du profil
Informations personnelles :
Nom : Denis Schneider

Informations forums :
Inscription : mars 2010
Messages : 1
Points : 0
Points : 0
Par défaut [VBA] Pb sur événement Worksheet_Change

Bonjour tout le monde,

Après avoir parcouru le forum et lu le tutoriel sur l'événement Worksheet_Change, j'avoue que je n'ai toujours pas bien compris comment utiliser correctement le paramètre Target. Je crois même avoir vu des procédures qui n'utilisent pas ce paramètre, ce qui me semble pourtant nécessaire, non ?

Donc ma première question serait de me donner un exemple TRES basique afin que je comprenne comment il est utilisé.

Ensuite, je voulais votre avis sur ma macro qui justement utilise cet événement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Worksheet_Change(ByVal Target As Range)
 
If Range("O43").Value = "IF" Then
    Application.EnableEvents = False
    Sheets("Feuille numero 3").Visible = True
 
 ElseIf Range("O43").Value = "RMF" Then
    Sheets("Feuille numero 4").Visible = True
 
End If
 
Application.EnableEvents = True
 
End Sub
L'objectif de la macro est d'afficher des onglets en fonction de la saisie dans la case O43 de la feuille active : par défaut, elle n'est pas remplie et elle comporte une liste à 2 éléments : IF ou RMF.
J'ai pensé à rajouter l'objet EnableEvents, mais j'avoue que je ne sais pas s'il est bien imbriqué dans la procédure...
Evidemment, ma macro ne marche pas... Je suis un peu embêté...

Merci d'avance pour votre aide ; d'habitude je trouve mes réponses en farfouillant sur le net, mais la, je sèche...

Denis

Dernière modification par Pierre Fauconnier ; 14/03/2010 à 15h45. Motif: Balises de code svp (sélection du code puis bouton #au dessus du message). Merci
Denisrv75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 17h09   #2
Membre expérimenté
 
Inscription : décembre 2006
Messages : 610
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 610
Points : 556
Points : 556
Envoyer un message via Skype™ à ESVBA
Par défaut bonjour et bienvenue denisrv75,

La procédure évènementielle "Worksheet_Change" ne se produit que lorsqu'il y a un changement dans la feuille de calcul (dans laquelle se trouve la procédure).

Donc si on modifie la cellule "AZ123" sur la feuille, le code dans la procédure "Worksheet_Change" est exécuté.


Dans notre cas, si la cellule "O43" contient une valeur (IF ou RMF) alors la feuille active devient la feuille "feuille numéro x" à chaque modification sur la feuille de départ. Pas pratique !

Il ne faut donc appliquer le code que si la dernière cellule changée est "O43".
On est d'accord ?

Et comment connaitre la dernière cellule ou plage modifiée ? Par la valeur de "Target".

Dans ce cas je mettrais un code du genre :
Code :
If Target = Range("O43") Then...

ESVBA
ESVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 17h36   #3
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut Denisrv75 et le forum
Juste une rélexion : si un code ne fonctionne pas comme tu l'espère, comment doit-on trouver son fonctionnement, si on ne sait même pas réellement le but à atteindre et qu'on ne connaît pas "l'erreur" qu'il génère ?
Tout ce qui est évident... ne l'est que pour celui qui travaille avec le fichier et la macro.
Rien n'est évident. Ce qui est le plus difficile à démontrer en maths est toujours ce qui te semble évident.

Worksheet_Change, à un paramètre système appelé Target. Il contient la ou les cellules (dans le cas d'un coller ou effacement) qui sont passées en mode édition (qui ont été modifiées, même si on a rien changé).
Citation:
Je crois même avoir vu des procédures qui n'utilisent pas ce paramètre, ce qui me semble pourtant nécessaire, non ?
Pas toujours, mais souvent, si tu veux optimiser le travail de ta macro, et que ce travail concerne la modification.
Citation:
Donc ma première question serait de me donner un exemple TRES basique afin que je comprenne comment il est utilisé.
Plus basique, ça doit être dur :
Code :
1
2
3
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Target =" & Target.Address(0, 0)
End Sub
Mon avis sur la macro
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("O43") = "IF" Then
'si la cellule O43 est égale au texte IF
    Application.EnableEvents = False
    'bloquer la gestion des évènements
    Sheets("Feuille numero 3").Visible = True
    'rendre l'onglet "Feuille numero 3" visible
ElseIf Range("O43").Value = "RMF" Then
'Sinon si O43 = RMF
    Sheets("Feuille numero 4").Visible = True
    'rendre l'onglet "Feuille numero 4" visible
End If
Application.EnableEvents = True
'Remettre la gestion des évènements
End Sub
Alors comme on travaille sur du code, il faut se rappeler qu'un code est très personnel et dépend des habitudes et du vécu. Donc ce n'est qu'une opinion personnelle et des conseils par rapport à une utilisation, pas une "Loi".

Application.EnableEvents : Bloque les évènements quand il est à False.
À utiliser avec précaution : c'est une instruction de portée "Excel" et si tu as un autre fichier d'ouvert, il est concerné. Ou tout autre tant qu'Excel n'est pas fermé ou que EnableEvents est remis à True. À case de ça, je m'oblige à faire une gestion d'erreur avec une seule sortie, qui remet les évènement en route.

L'exemple typique, c'est une macro change qui augmente de 1 une cellule :
Target=Target+1
La cellule lance la macro qui modifie la cellule qui lance la macro etc...

Sur ta macro : EnableEvents n'a pas besoin d'être bloqué puisqu'on ne touche pas à la feuille.

2 conditions : O43="IF" ou O43="RMF". Donc, ElseIf semble indiqué. Sauf que moi, j'en vois un supplémentaire : O43<>IF" AND O43<>"RMF" (un simple Else dans ce cas suffit).
En informatique, je ne laisse aucune zone de flou dans mes codes.

Si tu mets une feuille en visible... il me semble qu'avant elle était invisible.
Donc le code devrait prévoir de remettre la feuille 3 en invisible si c'est la 4 qui est mise en visible ou inversement.

Mettre en visible me semble vouloir dire qu'on va travailler sur la feuille. Or les modules lié au feuilles n'autorisent pas ça.
Au lieu du module et de Worksheet_Change, j'utiliserai le module ThisWorkBook et la macro Workbook_SheetChange, qui admet deux variable système Sh qui représente la feuille qui subit une modif et Target les cellules modifiées.
Un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name <> "Menu" Or Target.Address(0, 0) <> "43" Then Exit Sub
'si le nom de l'onglet n'est pas Menu, qui contient la cellule O43
'ou si l'adresse de la plage modifiée n'est pas O43, sortir
If UCase(Target) = "IF" Then
'si target (mise en majuscules) = IF alors
    Sheets("Feuille numero 3").Visible = True
    'rendre visible l'onglet "Feuille numero 3"
    Sheets("Feuille numero 4").Visible = False
    'rendre invisible l'onglet "Feuille numero 4"
    Sheets("Feuille numero 3").Activate
    'aciver l'onglet "Feuille numero 3"
ElseIf UCase(Target) = "RMF" Then
    Sheets("Feuille numero 4").Visible = True
    Sheets("Feuille numero 3").Visible = False
    Sheets("Feuille numero 4").Activate
Else
'Dans les autres cas
    Sheets("Feuille numero 3").Visible = False
    Sheets("Feuille numero 4").Visible = False
End If
End Sub
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 23h37   #4
Invité de passage
 
Homme Michel
Développeur Web
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Tarn (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web
Secteur : Bâtiment

Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 3
Points : 3
Par défaut Plus simple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Worksheet_Change(ByVal Target As Range)
 
If Target.Address(0,0)= "O43" Then
   If [O43]= "IF" Then 
       Sheets(3).Visible = True
       Sheets(4).Visible = False
   ElseIf [O43]= "RMF" Then
       Sheets(4).Visible = True
       Sheets(3).Visible = False
   Else
       Sheets(4).Visible = False
       Sheets(3).Visible = False       
   End If
End If
 
End Sub
L'objectif de la macro est d'afficher des onglets en fonction de la saisie dans la cellule "O43" de la feuille active : par défaut, elle n'est pas remplie et elle comporte une liste à 2 éléments : IF ou RMF.
micanto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2010, 00h20   #5
Invité de passage
 
Homme Michel
Développeur Web
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Tarn (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web
Secteur : Bâtiment

Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 3
Points : 3
Par défaut Ou encore

Citation:
Envoyé par micanto Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 
If Target.Address(0,0)= "O43" Then
   Cancel= True
   Select Case [O43]
       Case "IF"
          Sheets(3).Visible = False
          Sheets(4).Visible = True
          [O43]= "RMF"
       Case "RMF"
          Sheets(3).Visible = False
          Sheets(4).Visible = False
          [O43]= ""
       Case ""
          Sheets(3).Visible = True
          Sheets(4).Visible = False 
          [O43]= "IF"      
   End case
End If
 
End Sub
L'objectif de la macro est d'afficher des onglets en fonction de la saisie dans la cellule "O43" de la feuille active : par défaut, elle n'est pas remplie et elle comporte une liste à 2 éléments : IF ou RMF.
micanto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2010, 11h05   #6
Membre Expert
 
Inscription : juillet 2007
Messages : 2 134
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2 134
Points : 2 154
Points : 2 154
Salut micanto et le forum
Ta seconde proposition :
Tu fais une préparation de "boucle" (Vide->IF->RMF->Vide->etc...)
Avec Worksheet_BeforeDoubleClick Tu entres dans la cellule pour modifier : Il faudrait mettre un Cancel=True pour éviter de passer un mode édition.

Juste une une remarque : tu supposes que "Feuille numero 3" est en position 3 et que "Feuille numero 4" et en position 4. Et si ce n'est pas le cas ? Surtout que le questionneur est en plein apprentissage !

Ce n'est pas une critique, juste une remarque. Et un nouveau venu sur le forum qui commence par répondre au lieu de questionner est forcément bienvenu à bras ouverts
A+
Gorfael est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 21h30.


 
 
 
 
Partenaires

Hébergement Web