Macro lancée quand changement de valeur d'une cellule

Lisette

XLDnaute Junior
Bonjour à tous !
Je bloque sur un point en VBA....
J'ai un petit formulaire à remplir.

En L15, j'ai une validation de choix dans ma cellule ("OUI"/"NON")
Je souhaiterais que quand on choisit "NON", ça supprime le contenu de certaines cellules.
J'ai tenté ceci :

VB:
  Private Sub Worksheet_Change(ByVal Target As Range)
If Range("L15") = "NON" Then
Range("J18:L21,E18:G21,G22,L22,E24:G27,G28,J24:L27,L28,E30:G33,G34,J30:L33,L34" _
        ).Select
    Range("L34").Activate
    Selection.ClearContents
Range("L15").Activate
End If
End Sub

Et ça me fait planter excel direct ! :D
Pourriez-vous me dire où est mon erreur s'il vous plaît ?
Merciiiii
 
Dernière édition:

Lisette

XLDnaute Junior
Ah ! C'est bon, j'ai trouvé !
VB:
Private Sub Worksheet_change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Range("L15").Value = "NON" Then
    
Application.ScreenUpdating = False
Range("J18:L21,E18:G21,G22,L22,E24:G27,G28,J24:L27,L28,E30:G33,G34,J30:L33,L34" _
        ).ClearContents

Application.ScreenUpdating = True
Else
Exit Sub
End If     
End Sub
 

ThierryP

XLDnaute Occasionnel
Bonjour,

Dans ton cas, le screenupdating n'apporte rien (d'ailleurs tu n'es pas obligée de le mettre à true en fin de procédure, Excel le fait tout seul !).
Par contre, mettre application.enableevents=false en début de procédure et remettre à true en fin de proc évitera à Excel de boucler sur cette procédure.

Cordialement,

ThierryP
 

Jacky67

XLDnaute Barbatruc
Ah ! C'est bon, j'ai trouvé !
Cliquez pour agrandir...
Bonjour,
Perso, pour que le serpent ne se morde pas la queue je ferais comme ceci
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$L$15" Then Exit Sub
    Application.EnableEvents = False
    If UCase([L15]) = "NON" Then Range("J18:L21,E18:G21,G22,L22,E24:G27,G28,J24:L27,L28,E30:G33,G34,J30:L33,L34").ClearContents
    [L15] = "": Range("L34").Activate
    Application.EnableEvents = True
End Sub
 

Lisette

XLDnaute Junior
Bonjour à tous !
je relance le sujet, car j'ai un petit souci :)
Dans la même page, j'ai maintenant plusieurs valeurs soumises à condition et je galère à écrire un code propre.
Je vous mets mon fichier ultra simplifié en copie, si vous pouviez m'aider s'il vous plaît !
 

Pièces jointes

  • question.xlsm
    38.3 KB · Affichages: 8

Lisette

XLDnaute Junior
Désolée si ce n'était pas clair ;(

Quand dans une cellule grise, on note "Responsable" ou "Signataire delegue", cela conditionne la cellule dessous. Soit un report de nom, soit une cellule vide.
J'ai donc bêtement réécrit le code en croisant les doigts, mais cela fonctionne de manière extrêmement aléatoire.

Je recolle ici le code qui est dans l'onglet :
VB:
Private Sub Worksheet_change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub

If Range("F8").Value = "RESPONSABLE" Then
 
Application.EnableEvents = False
    Range("F9").Value = "=z1"
Application.EnableEvents = True

Else
If Range("F8").Value = "SIGNATAIRE DELEGUE" Then
Application.EnableEvents = False
    Range("F9").Value = ""
Application.EnableEvents = True
End If

'*****

If Target.Count > 1 Then Exit Sub

If Range("F10").Value = "RESPONSABLE" Then
 
Application.EnableEvents = False
    Range("F11").Value = "=Z2"
Application.EnableEvents = True

Else
If Range("F10").Value = "SIGNATAIRE DELEGUE" Then
Application.EnableEvents = False
    Range("F11").Value = ""
Application.EnableEvents = True
End If

'*****

If Target.Count > 1 Then Exit Sub

If Range("F12").Value = "RESPONSABLE" Then
Application.EnableEvents = False
    Range("F13").Value = "=Z3"
Application.EnableEvents = True

Else
If Range("F12").Value = "SIGNATAIRE DELEGUE" Then
Application.EnableEvents = False
    Range("F13").Value = ""
Application.EnableEvents = True
End If

'*****
If Target.Count > 1 Then Exit Sub

If Range("F14").Value = "RESPONSABLE" Then
 
Application.EnableEvents = False
    Range("F15").Value = "=Z4"
Application.EnableEvents = True

Else
If Range("F14").Value = "SIGNATAIRE DELEGUE" Then
Application.EnableEvents = False
    Range("F15").Value = ""
Application.EnableEvents = True
End If

'*****
Exit Sub
End If
End If
End If
End If

End Sub
 

James007

XLDnaute Barbatruc
Bonjour à tous,

A tester

VB:
Private Sub Worksheet_change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("F8,F10,F12,F14")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
    If .Value = "RESPONSABLE" Then
        .Offset(1, 0) = "=Z" & IIf(.Row = 8, "1", IIf(.Row = 10, "2", IIf(.Row = 12, 3, 4)))
    ElseIf .Value = "SIGNATAIRE DELEGUE" Then
        .Offset(1, 0).ClearContents
    End If
End With
Application.EnableEvents = True
End Sub
 

Lisette

XLDnaute Junior
Désolée Jacky, j'ai dû mal m'expliquer. Quand on a la tête dans son fichier, on a parfois tendance à prendre des raccourcis.
C’est une feuille de signatures : parfois, le responsable signe et auquel cas, je vais chercher l’info dans un autre onglet.
Si c’est un signataire délégué, je laisse la cellule vide.

Du coup, en F8, j’ai une validation de données, ou je choisis « RESPONSABLE » ou « SIGNATAIRE DELEGUE »
En F9, je cherche à avoir soit :

  • Le nom du responsable qui est repris sur un autre onglet quand on choisit « RESPONSABLE »
  • Un champs vide quand on choisit « SIGNATAIRE DELEGUE »

Ensuite, idem en dessous, mais avec F10 et F11
Puis en-dessous avec F12 et F13
Sachant que les noms des responsables ne sont pas les mêmes en fonction des F.

Si je n'ai pas fait simplement une formule en F9, c'est que je souhaite que dans cette cellule, on puisse noter un nom librement quand c'est "SIGNATAIRE DELEGUE" mais que ma formule revienne quand c'est "RESPONSABLE"
 
Dernière édition:

James007

XLDnaute Barbatruc
Re,

Le moins que l'on puisse dire ... c'est que tu ne te simplifies vraiment pas la vie ...!!!

VB:
Private Sub Worksheet_change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("F8,F10,F12,F14")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
    If .Value = "RESPONSABLE" Then
        .Offset(1, 0) = "='01'!" & IIf(.Row = 8, "E10", IIf(.Row = 10, "E19", IIf(.Row = 12, "J19", "E25")))
    ElseIf .Value = "SIGNATAIRE DELEGUE" Then
        .Offset(1, 0).ClearContents
    End If
End With
Application.EnableEvents = True
End Sub
 

Statistiques des forums

Discussions
312 206
Messages
2 086 201
Membres
103 156
dernier inscrit
Ludo94130