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 :

erreur sur l'execution de Private Sub Worksheet_Change(ByVal Target As Range)


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    support Excel
    Inscrit en
    Novembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : support Excel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut erreur sur l'execution de Private Sub Worksheet_Change(ByVal Target As Range)
    bonjour,

    J'ai l'habitude de lire les discussions sur ce forum, mais c'est la première fois que je pose une question....car je suis bloquée depuis 2 jours sur le même problème...
    Je souhaite que lorsqu'on modifie une des cellules C6, C8, C10, C12, C14 cela change les cellules correspondantes 2 colonnes plus loin. Voici donc ce que j'ai écrit:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Dim i As Byte
    Dim LIGNE As Byte
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ERREUR
     
    Application.ScreenUpdating = False
    Application.EnableEvents = False
     
    LIGNE = 6
    For i = 1 To 5
     
    ActiveSheet.Unprotect
        If Range(Cells(LIGNE, 3), Cells(LIGNE, 3)).Value <> "" Then
            Range(Cells(LIGNE, 5), Cells(LIGNE, 5)).Select
                With Selection.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="OUI,NON"
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
                End With
            Selection.Locked = False
     
        Else
     
            Range(Cells(LIGNE, 5), Cells(LIGNE, 5)).Select
            Selection.ClearContents
            Selection.Validation.Delete
            Selection.Locked = True
            Selection.FormulaHidden = False
     
        LIGNE = LIGNE + 2
        End If
    Next i
     
        Call Protect1
        Range("C6").Select
     
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowFiltering:=True, AllowUsingPivotTables:=True
     
    Application.ScreenUpdating = True
    Application.EnableEvents = True
     
    ERREUR:
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowFiltering:=True, AllowUsingPivotTables:=True
     
    Application.ScreenUpdating = True
    Application.EnableEvents = True
     
    MsgBox "Erreur", vbOKOnly
    End Sub
    Mais après plusieurs modifications, soit j'ai un message d'erreur, soit la macro ne s'exécute pas...Quelqu'un aurait-il une solution ?
    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais après plusieurs modifications, soit j'ai un message d'erreur, soit la macro ne s'exécute pas...Quelqu'un aurait-il une solution ?
    Si ce n'est pas trop demandé. Quel est ce message d'erreur ?
    En attendant ta réponse, lorsque l'on utilise la procédure événementielle Worksheet_Change, il faut avoir à l'esprit que si on écrit dans une ou plusieurs cellules de cette même feuille lorsque l'événement Change se déclenche, on provoque à l'écriture un nouvel événement qui enclenche lui même une nouvelle écriture, qui....
    Il faut donc utiliser cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False
    pour empêcher l'interception des événements lors de l'écriture.
    Attention de remettre la propriété à TRUE à la fin de l'instruction d'écriture

    Exemple tiré de l'aide VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents = False
    ActiveWorkbook.Save
    Application.EnableEvents = True
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Candidat au Club
    Femme Profil pro
    support Excel
    Inscrit en
    Novembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : support Excel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour Philippe,

    J'ai bien mis Application.EnableEvents = False et true, mais peut-être est-ce que je ne les ai pas mis au bon endroit ?
    Sinon, pour l'instant, il m'affiche la msgbox que j'ai défini pour ERREUR:.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai bien mis Application.EnableEvents = False et true
    C'est vrai, je n'avais pas lu le code en profondeur attendant le n° de cette erreur.
    Sinon, pour l'instant, il m'affiche la msgbox que j'ai défini pour ERREUR:.
    Règle n° 1, en cours de développement il faut éviter de placer un On Error qui forcément masque les erreurs inévitables de conception mais si l'erreur est renvoyée à une étiquette de ligne il suffit d'utiliser l'objet ERR et ses propriétés Description et Number

    A lire La gestion des erreurs dans Excel

    Il te suffit donc maintenant de publier le n° et message d'erreur ainsi que la ligne où le code bug afin que l'on puisse t'aider efficacement.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Points : 377
    Points
    377
    Par défaut
    Bonjour à tous,

    Ce n'est pas la source d'erreur, mais tu peux éclaircir ton code. Tu utilises une boucle For i de 1 à 5 avec la Variable fixée à 6 que tu ajoutes + 2 à chaque boucle. i ne sert à rien. Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For LIGNE = 6 to 14 Step 2
    ...
    Next LIGNE

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Points : 377
    Points
    377
    Par défaut
    Dans une procédure événementielle du type "Private Sub Worksheet_Change(ByVal Target As Range)", on peut facilement utiliser l'instruction "Application.Intersect".
    On obtiendrait cela à tester :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    Dim Plage As Range
    Set Plage = Range("C6,C8,C10,C12,C14")
     
    If Not Application.Intersect(Target, Plage) Is Nothing Then
    ActiveSheet.Unprotect
        If Range(Cells(Target.Row, 3), Cells(Target.Row, 3)).Value <> "" Then
            Range(Cells(Target.Row, 5), Cells(Target.Row, 5)).Select
                With Selection.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="OUI,NON"
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
                End With
            Selection.Locked = False
        Else
            Range(Cells(Target.Row, 5), Cells(Target.Row, 5)).Select
            Selection.ClearContents
            Selection.Validation.Delete
            Selection.Locked = True
            Selection.FormulaHidden = False
         End If
    End If

  7. #7
    Candidat au Club
    Femme Profil pro
    support Excel
    Inscrit en
    Novembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : support Excel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci à tous pour ces précieuses informations que j'ignorais...je teste et je reviens vers vous !

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Teste ceci :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
     
        If Intersect(Target, Range("C6,C8,C10,C12,C14")) Is Nothing Then Exit Sub
        If Target.Count > 1 Then Exit Sub
     
        ActiveSheet.Unprotect
     
        If Target.Value <> "" Then
     
            With Target.Offset(, 2).Validation
     
                .Delete
                .Add xlValidateList, xlValidAlertStop, xlBetween, "OUI,NON"
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
     
            End With
     
            Target.Offset(, 2).Locked = False
     
        Else
     
            With Target.Offset(, 2)
     
                Application.EnableEvents = False
                .ClearContents
                Application.EnableEvents = True
     
                .Validation.Delete
                .Locked = True
                .FormulaHidden = False
     
            End With
     
        End If
     
        Call Protect1
     
    End Sub
    Sache aussi que ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range(Cells(Target.Row, 3), Cells(Target.Row, 3))
    ne sert à rien car c'est la même cellule qui borne la plage, ça revient tout simplement à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Cells(Target.Row, 3)

  9. #9
    Candidat au Club
    Femme Profil pro
    support Excel
    Inscrit en
    Novembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : support Excel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    bonsoir,

    Effectivement, j'ai testé et ça marche très bien aussi avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Cells(Target.Row, 3).Value <> "" Then
            Cells(Target.Row, 5).Select
    Merci pour ces précieux conseils !

    Sylvie

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2015, 11h55
  2. [XL-2007] Ajouter une "Target" à Private Sub Worksheet_Change(ByVal Target As Range)
    Par 'OTM' dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 19/12/2014, 14h21
  3. [Toutes versions] Private Sub Worksheet_Change(ByVal Target As Range) et protection
    Par Giantrick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2013, 10h21
  4. [XL-2007] petit soucis avec un Private Sub Worksheet_Change(ByVal Target As Range)
    Par dris974 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/03/2011, 12h57

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