Empêcher macro évènementielle si choix dans liste déroulante Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
Avatar du membre
Curtis Newton
Membre fidèle
Membre fidèle
Messages : 226
Inscrit le : 19 avril 2015
Version d'Excel : FR 2010

Message par Curtis Newton » 9 mai 2018, 12:56

Bonjour,

Je fais appel à vos lumières.

Dans le fichier joint, je sélectionne une personne dans un menu déroulant. Automatiquement, son numéro de téléphone et son email sont rapatriés depuis une base de données (feuille cachée).

Occasionnellement, la personne choisie assure une permanence. Une validation de donnée (liste déroulante) "PERMANENCE" peut être sélectionnée et la cellule est colorée.

Si je sélectionne un nom, les données sont rapatriées mais il ne m'est pas possible de faire apparaître "PERMANENCE".

Pourriez-vous m'aiguiller ou m'aider?

Bonne journée.
TEST.xlsm
(63.99 Kio) Téléchargé 8 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 9 mai 2018, 13:13

Bonjour,

Je ne vois pas le rapport entre ton titre et tes explications ???
1 membre du forum aime ce message.
Avatar du membre
Curtis Newton
Membre fidèle
Membre fidèle
Messages : 226
Inscrit le : 19 avril 2015
Version d'Excel : FR 2010

Message par Curtis Newton » 9 mai 2018, 13:39

A me relire, je ne me comprends pas moi-même...

La macro évènementielle ci-après, automatise le remplissage de cellules liées à une cellule, où le nom d'une personne est sélectionné.

Dans la colonne du numéro de téléphone ou de l'email, je souhaiterais pouvoir modifier la cellule en sélectionnant "PERMANENCE" dans une liste déroulante, tout en empêchant l'action de la macro évènementielle.
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Dim i, j As Integer
    DernLigneBdd = ThisWorkbook.Sheets("Base de données").Range("B308").End(xlUp).Row
    i = ActiveCell.Row
    If ThisWorkbook.ActiveSheet.Cells(i, 3) <> "" Then
    Application.EnableEvents = False
        For j = 1 To DernLigneBdd
            If ThisWorkbook.ActiveSheet.Cells(i, 3) = ThisWorkbook.Sheets("Base de données").Cells(j, 1) Then
                ThisWorkbook.ActiveSheet.Cells(i, 4) = ThisWorkbook.Sheets("Base de données").Cells(j, 2).Value
                ThisWorkbook.ActiveSheet.Cells(i, 5) = ThisWorkbook.Sheets("Base de données").Cells(j, 3).Value
                j = DernLigneBdd
            End If
            Next j
        End If
        Application.EnableEvents = True
        ActiveCell.Select
        Application.ScreenUpdating = True
End Sub
Avatar du membre
Curtis Newton
Membre fidèle
Membre fidèle
Messages : 226
Inscrit le : 19 avril 2015
Version d'Excel : FR 2010

Message par Curtis Newton » 9 mai 2018, 14:18

Cette solution fonctionne :

J'ai remplacé la portion de code :

If ThisWorkbook.ActiveSheet.Cells(i, 3) <> "" then...

par

If ThisWorkbook.ActiveSheet.Cells(i, 3) <> "" And ThisWorkbook.ActiveSheet.Cells(i, 4) <> "PERMANENCE" then...

Bonne journée
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 9 mai 2018, 14:32

Re,
Il faut cadrer ton évènementielle, qu'elle ne se lance pas à chaque changement sur la feuille !
Ici les conditions à mettre (en utilisant Target, cellule modifiée que VBA met à ta disposition) : qu'une seule cellule soit concernée, à partir ligne 4 et uniquement sur la colonne 3.
Ainsi la macro ne se déclenchera que si changement en C à partir de C4. Donc suite à son intervention, tu pourras ensuite modifier le téléphone en PERMANENCE, car l'intervention en D ne la lancera plus.

Si en C..., tu testes alors qu'il y a une valeur, si oui elle fait son job, si non elle efface par précaution les 2 cellules concernées.

Autres éléments :
- les variables doivent être typées individuellement (en mettant le type à la fin d'une énumération, tu ne types que la dernière, les autres demeurent en type Variant). Pour raccourcir tu peux utiliser les caractères de déclaration de type pour les types qui en ont.
J'ai aussi déclaré les variables qui ne l'étaient pas...
- J'en ai ajouté une pour ta feuille BDD, cela t'évite des répétitions d'une longue expression.
La mise sous bloc With (je ne l'ai pas fait ici) peut aussi s'avérer utile pour raccourcir le code et l'accélérer.

- Dans un module d'objet, l'objet auquel il est dédié, c'est Me. Ce mot clé suffit à l'identifier sans ambiguïté et évite une expression longue.
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i%, j%, DernLigneBdd%, wsBD As Worksheet
    If Target.Count > 1 Or Target.Row < 4 Or Target.Column <> 3 Then Exit Sub
    If Target <> "" Then
        Set wsBD = ThisWorkbook.Sheets("Base de données")
        DernLigneBdd = wsBD.Range("B308").End(xlUp).Row
        i = Target.Row
        Application.ScreenUpdating = False
        For j = 1 To DernLigneBdd
            If Me.Cells(i, 3) = wsBD.Cells(j, 1) Then
                Me.Cells(i, 4) = wsBD.Cells(j, 2).Value
                Me.Cells(i, 5) = wsBD.Cells(j, 3).Value
                Exit For
            End If
        Next j
    Else
        Target.Offset(, 1).Resize(, 2).ClearContents
    End If
End Sub
Cordialement.
curtisnewton_TEST.xlsm
(63.99 Kio) Téléchargé 7 fois
1 membre du forum aime ce message.
Avatar du membre
Curtis Newton
Membre fidèle
Membre fidèle
Messages : 226
Inscrit le : 19 avril 2015
Version d'Excel : FR 2010

Message par Curtis Newton » 9 mai 2018, 14:56

Merci pour l'effort d'écriture et les précisions apportées. Je l'adapte de facto dans mon fichier.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 9 mai 2018, 15:08

J'en profite pour préciser que tu as intérêt à laisser faire ton évènementielle, après mise de gardes-fous, et intervenir manuellement ensuite si nécessaire, ça te fait au total moins de manipulation.

Pour les modifications, j'avais oublié de préciser que la cellule déclencheuse étant ciblée et la proc. n'y retouchant pas, tu n'as plus besoin d'interrompre les évènements.
Et la remise à True de ScreenUpdating en fin de macro est inutile, Excel le fait d'office (de même pour DisplayAlerts, mais pas les autres...) La remise à True ne peut s'avérer utile que sur une longue procédure où tu peux trouver judicieux de mettre à jour l'affichage alors que l'exécution se poursuit...

Bonne continuation. (°v°)°
1 membre du forum aime ce message.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message