IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA Evènement "Worksheet_Change" [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut VBA Evènement "Worksheet_Change"
    Bonjour à tous,


    je débute en VBA, et j'aimerais utiliser une macro "Worksheet_Change" s'activant lorsque je quitte une certaine cellule. J'ai réussi à faire celà pour des cellules "fixes" ;

    cependant, après une intéraction avec l'utilisateur, je voudrais insérer des lignes sur lesquelles je veux ensuite appliquer ma macro.

    Je suis bloqué ici :
    Est-il possible de contrôler le moment et le lieu de l'activation de cette macro ?

    Je ne sais pas si je suis assez clair, je peux donner des précisions si besoin.

    Cordialement,

    Rémi

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    le paramètre Target permet de te donner la plage de cellules modifiée

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Intersect(Target, Range("A1:C100")) Is Nothing Then MsgBox "Changement dans plage A1:C100"
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    Soit, mais si jamais une intéraction avec un utilisateur insère une nouvelle ligne, admettons la ligne 101, je suis obligé de revenir trifouiller mon code pour que la macro affecte cette dernière ?

    Merci d'avance

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Si à chaque changement dans la feuille, tu devrai changer ton code, ça ne sera plus un code mais un casse tête.
    Explique clairement ce que tu cherches à faire.

    Ma première réponse était pour expliquer la paramètre Target.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    on est d'accord !

    Voici mon projet :

    Je propose à l'utilisateur d'ajouter autant de lignes qu'il le désire. Le nombre de lignes peut donc varier.
    Pour chacune de ces lignes, il n'aura le droit que de modifier qu'une seule cellule, et c'est là que ma macro "Worksheet_Change" intervient :

    s'il modifie une cellule, je verrouille toutes les autres sur la même ligne.

    Comment, à chaque nouvelle ligne créée, indiquer que la macro doit s'occuper de cette dernière ?

  6. #6
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Juste une idée :
    • tu protèges la feuille
    • quand tu crées une nouvelle ligne, tu déverrouilles les cellules de cette ligne
    • Quand une cellule est mise à jour (c'est là qu'intervient la procédure évènementielle Worksheet_Change et que tu devras utiliser l'argument Target), tu verrouilles toute la ligne.

    Cordialement,

    PGZ

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    C'est exactement ce que je veux faire !

    Je pense que je n'ai pas encore compris comment bien exploiter la procédure évènementielle Worksheet_Change...

    Voici mon code, appliqué aux quelques cellules D6:L6.
    J'aimerais pouvoir l'appliquer, si besoin est, à D7:L7, D8:L8, etc...

    Je pense que je ne sais pas bien me servir de Target.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        Application.EnableEvents = False
        If Not Application.Intersect(Target, Range("D6:L6")) Is Nothing Then
            Call Replace0(Target)  'C'est une proc qui remplace les '0' par du vide
            If (Not IsEmpty(Target)) Then
                Range("D6:L6").Select
                Selection.SpecialCells(xlCellTypeBlanks).Select
                Selection.Locked = True
            Else
                MsgBox "Aucun changement"
            End If
        End If
        Application.EnableEvents = True
    End Sub

    Encore merci

  8. #8
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir.

    Au préalable, il est uitle de protéger la feuille par code, ce qui permet de préciser qu'on ne veut pas que cette protection s'applique aux procédures VBA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub subVerouilleFeuille1()
    ThisWorkbook.Worksheets(1).Protect "RH", , , , True
    End Sub
    A exécuter une fois et c'est bon.

    Ensuite, l'idée est de verrouiller la ligne dès qu'une cellule entre D et L est renseignée. J'ai ajouté : si une cellule renseignée est effacée, on déverrouille toute la ligne. Pour cela il faut aussi éviter de verrouiller la cellule renseignée : donc quand on parle de verrouiller une ligne, c'est toute les cellules sauf celle qui vient d'être renseignée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    'si la cellule modifiée est en dehors des col D-L, on n'a rien à faire
    If (Target.Column < 4) Or (Target.Column > 12) Then Exit Sub
     
    If Target.Value = "" Then
        'on a effacé une cellule : on déverrouille la ligne
        Me.Range("D" & Target.Row & ":L" & Target.Row).Locked = False
    Else
        'on a renseigné une cellule : on verrouille la ligne
        Me.Range("D" & Target.Row & ":L" & Target.Row).Locked = True
        Target.Locked = False
    End If
     
    End Sub
    Ca fonctionne sur toutes les lignes.

    Cordialement,

    PGZ

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    Bonjour,

    merci pour la clarté et la rapidité de vos réponses ! Je m'apprête à essayer le code que vous m'avez indiqué, mais je sens d'avance que c'est ce que je voulais faire.

    Edit : Pour verrouiller les cellules, vous utilisez la méthode Protect, n'est pas plutôt Lock dont-il faudrait se servir ?
    J'utiliserai Protect seulement à la fin de mon travail je pense.


    Edit 2 : en fait je viens de comprendre !

    Encore merci !

  10. #10
    Membre averti
    Femme Profil pro
    ingénieur
    Inscrit en
    Juin 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Juin 2018
    Messages : 15
    Par défaut changement de cellule
    Bonjour,
    je revient sur cette discussion après 8 ans mais j'ai du mal à exploiter le Worksheet Change.. en faite je veux que lorsque je change le contenu d'une cellule dans la colonne D la celulle face à elle dans la colonne C change (je vais importer le changement d'une autre feuille) et si je change la cellule de la colonne C la cellule face à elle dans la colonne D change. exemple:
    cellule D5="Max" alors cellule C5=2 / si j'ai mis C5=2 d'abord la cellule D5 devient = "Max"
    le problème c'est ça entre dans un boucle infini vu que si je change D5 alors C5 change donc le code entre dans le boucle de changement de C5 et ça roule comme ça

    comment je peux faire dans ce cas ??

  11. #11
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par maynou24 Voir le message
    Bonjour,
    je revient sur cette discussion après 8 ans mais j'ai du mal à exploiter le Worksheet Change.. en faite je veux que lorsque je change le contenu d'une cellule dans la colonne D la celulle face à elle dans la colonne C change (je vais importer le changement d'une autre feuille) et si je change la cellule de la colonne C la cellule face à elle dans la colonne D change. exemple:
    cellule D5="Max" alors cellule C5=2 / si j'ai mis C5=2 d'abord la cellule D5 devient = "Max"
    le problème c'est ça entre dans un boucle infini vu que si je change D5 alors C5 change donc le code entre dans le boucle de changement de C5 et ça roule comme ça

    comment je peux faire dans ce cas ??
    En désactivant les évènements pendant le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
      '
      ' Traitement
      '
      Application.EnableEvents = True
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete fichier .js VBA EXCEL REALTIME FX QUOTES
    Par tiuse75016 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/05/2010, 18h51
  2. Filtre VBA, problemme avec double quote
    Par choubak dans le forum VBA Access
    Réponses: 7
    Dernier message: 29/06/2007, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo