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 :

Confirmez-vous mon erreur pour une utilisation de worksheet_change ?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : Novembre 2023
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Confirmez-vous mon erreur pour une utilisation de worksheet_change ?
    Bonjour.
    Je souhaiterai que vous confirmiez ou non mon analyse du problème rencontré.

    J'ai un tableau colonnes paires des dates, colonnes impaires les dates s'inscrivent majorées d'un périodicité.

    Fonctionne bien en déclenchement manuel.
    Lorsque j'utilise "worksheet_selectionchange" cela fonctionne très bien. Sauf, que la macro se déclenche par une simple sélection d'une cellule (d'où son nom).
    Mais lorsque j'utilise "worksheet_change", je perds l'accès au fichier (avantage, excel se ferme tout seul )


    Je poste la macro (partielle seulement pour les 2 premières colonnes)
    ne soyez pas trop dur, svp

    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
     
       Option Explicit
        Option Compare Text
     
    'Private Sub Worksheet_Change(ByVal Target As Range)
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        Application.ScreenUpdating = False
    '-------------------------------------------------------------------------------------------------
    'DEFINTION DES VARIABLES GÉNÉRALES
        Dim prem_lig As Integer, expi_lig As Integer, der_lig As Integer, der_col As Integer
        prem_lig = 4
        expi_lig = 2
    '    der_lig = 32
        der_lig = Range("A" & Rows.Count).End(xlUp).Row
        der_col = Cells(1, Columns.Count).End(xlToLeft).Column
    '-------------------------------------------------------------------------------------------------
    'DÉFINITION DES VALEURS SPÉCIFIQUES
        Dim col_e As Range, col_f As Range, col_g As Range, col_h As Range, col_j As Range, col_k As Range
        Set col_e = Range(Cells(prem_lig, 5), Cells(der_lig, 5))
     
        Dim exp_f As Integer, exp_h As Integer, exp_k As Integer
        exp_f = Cells(expi_lig, 6)
    '-------------------------------------------------------------------------------------------------
    'ColonneF()
        For Each col_f In col_e
                col_f.Offset(0, 1).ClearContents
            If IsDate(col_f.Value) Then
                col_f.Offset(0, 1).Formula = DateAdd("m", exp_f, col_f)
                If col_f.Offset(0, 1).Value < Date Then
                    col_f.Offset(0, 1).Font.Color = RGB(192, 0, 0)
                    Else
                End If
            Else
                If IsEmpty(col_f.Value) Then
                col_f.Interior.Color = RGB(255, 255, 255)
                Else
                col_f.Offset(0, 1).Value = col_f.Offset(0, 0).Value
               End If
            End If
        Next col_f
    '-------------------------------------------------------------------------------------------------
       Debug.Print der_lig
       Debug.Print "mise à jour effectuée"
    '-------------------------------------------------------------------------------------------------
    End Sub
    Cependant, opter pour l'effacement de la cellule et ainsi de forcer le "re-calcul", est-ce cela qui provoque ce dysfonctionnement avec "change" (une boucle infinie ?) ?


    Merci à vous par avance.
    Steph


    ps: l'utilisation de "Range("A" & Rows.Count).End(xlUp).Row" provoque aussi un dysfonctionnement avec "change" mais pas avec "selectionchange". (... pile insuffisante)

  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 787
    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 787
    Points : 28 661
    Points
    28 661
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La procédure Worksheet_SelectionChange se déclenche lorsque l'on sélectionne une cellule dans la feuille alors que Worksheet_Change survient lorsque le contenu d'une cellule est modifiée dans la feuille donc si vous écrivez dans une cellule de la feuille à l'aide du code VBA la procédure est à nouveau déclenchée. C'est un peu comme le chien qui cherche à attraper sa queue.
    Pour éviter cela on désactive l'événement en mettant la valeur de la propriété EnableEvents de l'objet Application à False

    Faites un test en mettant ce code dans le module d'une feuille et ensuite écrivez un nombre dans une cellule quelconque de cette feuille. Il va soit lever une erreur soit fermer le classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      With Target
      .Offset(ColumnOffset:=1).Value = .Value + 100
      End With
    End Sub
    ensuite mettez ce code et refaite la même opération

    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
      With Target
      .Offset(ColumnOffset:=1).Value = .Value + 100
      End With
      Application.EnableEvents = True
    End Sub
    Je vous conseille la lecture de ces deux tutoriels pour mieux appréhender le sujet
    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
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : Novembre 2023
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour.
    Merci beaucoup pour la réponse.

    Je testerai cet après-midi.


    Merci encore.
    Steph

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2023
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : Novembre 2023
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour

    Bon j'ai fait le test, en supposant que les lignes 2,3 et 4 étaient à insérer entre private et "ma" macro.
    Donc, et j'ai trouvé cela drôle, car la première ligne s'est remplie au delà du tableau (avec des dates s'incrémentant toutes seules) ...

    Pour le deuxième code, oui le classeur s'est fermé (mais je ne compte plus les fois où il s'est fermé ou les recours à Alt Tab ).


    Nous en revenons à votre confirmation de ma mauvaise approche du projet.
    Avec change, il ne doit y avoir action que s'il y a eu une modification (et pas effacer pour ré-écrire, c'était absurde).

    J'avais déjà lu les tutoriels que vous indiquez, cependant mes lacunes sont encore trop pénalisantes (j'ai bien vu qu'il me faudrait utiliser Target" mais ...)
    Merci pour l'information sur "EnableEvents"

    De nouveau, tous mes remerciements.
    Steph

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/03/2017, 10h47
  2. Réponses: 10
    Dernier message: 05/08/2010, 12h02
  3. Quel CMS pour une utilisation personnelle ?
    Par lennelei dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 30/08/2009, 11h21
  4. [Wamp] Quel logiciel utilisez-vous pour une utilisation local
    Par gtraxx dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 07/01/2007, 22h49
  5. Quels SGBD sont gratuits pour une utilisation commerciale ?
    Par laffreuxthomas dans le forum Décisions SGBD
    Réponses: 28
    Dernier message: 15/03/2005, 16h51

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