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 :

Evenement pour détecter modification contenu de cellule depuis menu déroulant


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut Evenement pour détecter modification contenu de cellule depuis menu déroulant
    Bonjour,

    Je souhaite qu'il soit impossible de modifier n'importe quelle cellule de la feuille nommée "réf." - la sélection de la cellule "W4" doit néanmoins rester possible pour lancer une procédure de recopie de la feuille de référence (qui sera automatiquement renommée avec une date).

    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)
    'Dim date_test As Date
     
        If ActiveSheet.Name = "réf." And Intersect(Range("W4"), Target) Is Nothing Then
            MsgBox "Onglet de référence - Modification impossible !", vbCritical
            Exit Sub
        End If
    Ça semble fonctionner, à un détail près :
    Si je clique sur la flèche d'un menu déroulant, le contenu de la cellule concernée change !

    J'ai mis le même code dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_selectionChange(ByVal Target As Range)
    Question : Est-il possible de détecter le changement de contenu d'une cellule si celui-ci résulte d'un menu déroulant ?

    Je vous remercie d'avance pour votre aide.
    Cordialement,
    jpma75

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pourquoi ne pas faire ça en utilisant les outils classiques de Excel ?
    Sélection de W4 > Clic droit > Format de cellule > Protection > Décocher "Verrouillée" > Ok
    Ruban Révision > Icone Protéger la feuille
    Si tu le souhaites , tu peux mettre (ou pas) un mot de passe et contrôler quelles procédures tu souhaites empêcher (format, insertion, etc.).

    C'est bien plus sûr que de le faire par macro.

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je me "régale" quant à moi de lire dans l'évènement Change d'une feuille que l'on y met ... une condition de vérification que l'on est sur ... cette feuille !

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Dim date_test As Date

    If ActiveSheet.Name =

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Salut Jacques !

    Exactement comme ceux ordonnant la sauvegarde dans l'évènement Workbook_BeforeSave ! …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut
    Je sais bien que la protection de la feuille est une solution, mais cette feuille est dupliquée et c'est uniquement sur les copies que l'on doit faire tout ajout ou toute modification. Je peux effectivement déprotéger la copie d'une feuille protégée...
    Par ailleurs, si la feuille teste son nom (SheetName) et qu'elle y trouve "réf.", cela empêche la macro de la supprimer, ce qui n'est pas le cas d'une feuille renommée...

    A ma question, peut-on détecter la sélection d'un menu déroulant, il n'y a manifestement pas de réponse ?!

    Cdt

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut
    J'ai trouvé (je crois...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If ActiveSheet.Name = "réf." Then
            MsgBox "Onglet de référence - Modification impossible !", vbCritical
            Application.EnableEvents = False
            Application.Undo
            Application.EnableEvents = True
        End If
    End Sub
    Ça m'évite une protection de la feuille de référence (réf.) et une dé-protection de la feuille dupliquée (sachant par ailleurs que les plages de cellules protégées sont éparses, ce qui rendrait la (re)protection de la feuille dupliquée un peu compliquée).

    Cdt

  7. #7
    Membre Expert

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    et pourquoi tu n'enregistre pas un XLTm?

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 663
    Par défaut
    Eriic

    "question bête : pourquoi tu ne mets pas xlSheetVeryhidden ta feuille ref si elle ne sert que de modèle à copier ?
    Et de quel menu déroulant parles-tu ?"


    Cette feuille "réf." doit être visible car l'utilisateur doit pouvoir modifier des valeurs de quotas (valeurs récurrentes qu'il doit retrouver dans les duplications de la feuille "réf."). Sachant par ailleurs que ces quotas doivent être repérables par rapport aux futures plages à remplir. Je rends donc accessible certaines plages comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_selectionChange(ByVal Target As Range)
     
        If ActiveSheet.Name = "réf." Then
            If Intersect(Range("W4,W8,W15,F9:I15,K9:P15,R9:U15,N79:P84,R79:U84,W25"), Target) Is Nothing Then
     
                MsgBox "Onglet de référence - Modification impossible !", vbCritical
                Application.EnableEvents = False  'attention
                [w25].Select
                Application.EnableEvents = True
                Exit Sub
            End If
        End If
    Avec ce code, je résous le problème du menu déroulant (dont l'objet est d'affecter une date à la nouvelle feuille créée). Sachant que la date issue du menu déroulant va être récupérée pour renommer la feuille (SheetName), ma feuille "réf." ne serait plus protégée de l'effacement (car toutes les autres feuilles peuvent être supprimées exceptées celle-ci, bien sûr).
    Comme le faisait remarquer l'un d'entre vous, je comprends qu'il ne soit pas judicieux de tester le nom d'une feuille dans le module-même de la dite feuille, mais comme cette feuille est dupliquée et renommée, je préviens un effacement accidentel de la feuille "réf.".

    Cdt

    Daranc,

    pourquoi tu n'enregistre pas un XLTm ?

    Parce que je ne me suis jamais penché sur la question. Mais peut-être faudrait-il...

    Cdt

    Menhir,

    Tu est ingénieur ?! Je suis fonctionnaire ! et mes applications sont destinées à mes semblables...

    Si ça ne fonctionne pas, ce sont des centaines d'heures d'optimisation de temps de travail que je "nous" fais perdre.

    Dans ma page d'accueil (la seule visible au lancement de l'application), il y a une copie écran avec une flèche qui pointe sur "Activer le contenu" (Avertissement de sécurité - Les macrons ont été désactivées).

    Le responsabilité de l'utilisateur (environ une cinquantaine), c'est de cliquer sur ce bouton ; il a le choix de jouer le jeu ou pas. S'il ne le fait pas... pas d'appli !).

    Oui, on peut sans doute tout détourner et "killer".

    L'utilisateur devant toujours utiliser le même classeur (accessible par tous...), j'ai ajouté ceci pour éviter les copies intempestives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
        If SaveAsUI Then
            MsgBox "Désolé, l'option Enregistrer sous... est impossible !", _
                vbExclamation, " Veuillez utiliser Fichier / Fermer "
            Cancel = True
        Else
            Call Options_Enregistrement
        End If
        Application.WindowState = xlNormal
    End Sub
    puis 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
    Option Explicit
    Option Private Module
    Sub Options_Enregistrement()
    Dim Sh As Worksheet
    Dim Répertoire As String, Fichier As String, FichierIndexé As String
     
        Application.EnableEvents = True
        ThisWorkbook.Unprotect "blabla"
     
        Répertoire = ThisWorkbook.Path
        Fichier = ActiveWorkbook.Name
        FichierIndexé = Format(Now, "yyyymmdd-hh""h""nn") & " " & Fichier
     
        With Sheets("accueil")
            .Visible = True
            .Activate
        End With
     
        For Each Sh In ThisWorkbook.Sheets
            If Sh.CodeName <> "Feuil01" Then Sh.Visible = xlSheetVeryHidden
        Next
     
        ThisWorkbook.Protect "blabla", True, True
        ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé
    End Sub
    Evidemment, j'ai ajouté quelques lignes de code dans Workbook_Open pour empêcher l'ouverture d'un fichier de sauvegarde (certes contournables mais pour l'instant, ça fonctionne).

    Comme le classeur de travail et les sauvegardes sont en réseau, je fais quelques sauvegardes externes de temps en temps. Pour l'instant, ça fonctionne avec fiabilité.

    (Précision pour devancer une éventuelle question : J'ai mis quelques lignes de code supplémentaires dans Workbook_Open qui suggère à l'utilisateur de refermer le classeur après un certain laps de temps s'il n'en a plus besoin pour le laisser accessible à ses collègues...).

    Cdt

    Désolé pour cette réponse un peu longue. Mais puisque je ne suis plus à quelques mots près, mon rêve serait d'avoir un contributeur talentueux (mais pas trop sarcastique...) pour critiquer chacune des lignes de codes de mes principales applications. Certaines en ont plus de 2.000 ! Même si ça fonctionne (manifestement), inutile de dire qu'il doit y avoir du ménage à faire...

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

Discussions similaires

  1. Détecter modification d'une cellule
    Par tAKAmAkA dans le forum Excel
    Réponses: 2
    Dernier message: 22/01/2012, 19h36
  2. [XL-2007] Code VBA pour remplacer le contenu de cellules
    Par tomlapomme dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 25/08/2010, 14h39
  3. Lien vers frame depuis menu déroulant (erreur)
    Par mhflash dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2008, 12h52
  4. Code VBA pour effacement de contenu de cellules
    Par MAMANHOU dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/03/2008, 15h51
  5. [MySQL] Récupération champs depuis menu déroulant
    Par tsm128 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/04/2007, 21h39

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