XL 2013 VBA je crois....

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Samaraxa

XLDnaute Nouveau
Bonjour à tous,

pour une première question, je l'éspère facile, et j'éspère surtout réussir à me faire comprendre.

Voilà,
dans une cellue A1 automatisé, s'affiche ou non une valeur,
la cellule A2, était elle remplie manuellement, mais il faudrait qu'elle s'efface automatiquement si A1<>0

J'imagine qu'il va falloir faire du VBA...et c'est pas vraiment mon truc...
Merci
Samaraxa
 
Solution
Et bien alors, peut être plutôt :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Me.[H3,H6,H9], Target) Is Nothing Then Exit Sub
   If Me.[A1].Value <> 0 Then Me.[A2].ClearContents
   End Sub
À condition toutefois que H3, H6 et H9 ne soient pas à leur tour des formules. L'évènement ne détecte pas un changement de valeur de formule, seulement une modification de contenu.
Déjà merci pour votre réactivité... votre code marche trés bien.

Il est vrai que la formule de la cellule A1 engendre des conséquences. Cela reste négligeable si l'utilisateur du formulaire remplit les données dans l'ordre.

D'ailleurs, est-il possible d'obliger l'utilisateur à remplir dans un certain ordre les cellules du fichier...???
 
Bonjour @Samaraxa, Dranreb,

bonne année 2021, et bienvenue sur le site XLD ! 🥳

tu as écrit : « est-il possible d'obliger l'utilisateur à remplir
dans un certain ordre les cellules du fichier...??? »

juste une piste : tu crées un formulaire (UserForm) et tu demandes
à tes utilisateurs d'utiliser la touche TAB (Tabulation) pour passer
d'un champ à un autre (un champ = une case).

bien sûr, pour chaque contrôle du UF (TextBox, ComboBox, ou autre),
tu dois avoir mis le bon n° (pas celui du loto, ni du tiercé) : celui de
la propriété TabIndex.

naturellement, il faut aussi qu'en cliquant sur le bouton OK
pour valider, les données du UserForm soient écrites dans
les bonnes cellules de la feuille de calcul. 😉




edit : ooooppps ! j'avais zappé que tu as aussi écrit : « si l'utilisateur
du formulaire remplit les données dans l'ordre. » ➯ c'est parfait !
ton UF est déjà créé ; y'a plus qu'à vérifier la propriété TabIndex
de chaque contrôle du UF.

ajout : il y a aussi Maj Tab pour retourner au champ précédent ;
ça permet de revenir en arrière pour corriger une erreur de
saisie, le cas échéant.


soan
 
Dernière édition:
Ce n'est pas ce que je disais. Ce que je disais c'est qu'au lieu d'exécuter ça systématiquement chaque fois que la feuille est recalculée pour quelque raison que ce soit n'ayant aucun rapport avec ça, il vaudrait mieux que ce soit exécuté seulement quand on change le contenu d'une cellule dont la formule en A1 dépend.
 
Merci les amis,

oui Soan, j'étais entrain de potasser la création de formulaire, pour une saisie plus claire, plus dirigé...

et oui Dranreb, on est d'accord, la feuille recalcule tout le temps... la cellule dépend de plusieurs autres, forcement :
A1=SI(ET(H3>0;H9<>"Sélectionner sa condition";H9<>"Personnalisée";H9>0);(INDEX('Données CP'!AH5:AQ107;EQUIV(H6;Emploi;0);EQUIV(H9;Condition_2;0)));"")
 
Et bien alors, peut être plutôt :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Me.[H3,H6,H9], Target) Is Nothing Then Exit Sub
   If Me.[A1].Value <> 0 Then Me.[A2].ClearContents
   End Sub
À condition toutefois que H3, H6 et H9 ne soient pas à leur tour des formules. L'évènement ne détecte pas un changement de valeur de formule, seulement une modification de contenu.
 
Bonjour samaraxa, Bernard, soan,
D'ailleurs, est-il possible d'obliger l'utilisateur à remplir dans un certain ordre les cellules du fichier...???
Voyez le fichier joint et ces macros dans le code de la feuille :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim n&, i&, c As Range
n = 9 'nombre de cellules, à adapter
For i = 1 To n
    Set c = Cells.Find("ordre " & i, , xlValues)
    If Not c Is Nothing Then If c(1, 0) = "" Then c(1, 0).Select: Exit Sub
Next
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n&, i&, c As Range, j&
n = 9 'nombre de cellules, à adapter
For i = 1 To n
    Set c = Cells.Find("ordre " & i, , xlValues)
    If Not c Is Nothing Then
        If Not Intersect(Target, c(1, 0)) Is Nothing Then
            Application.ScreenUpdating = False
            Application.EnableEvents = False 'désactive les évènements
            For j = i + 1 To n
                Set c = Cells.Find("ordre " & j)
                If Not c Is Nothing Then c(1, 0) = ""
            Next j
            Application.EnableEvents = True 'réactive les évènements
            Exit Sub
        End If
    End If
Next i
End Sub
A+
 

Pièces jointes

Dernière édition:
Et bien alors, peut être plutôt :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Me.[H3,H6,H9], Target) Is Nothing Then Exit Sub
   If Me.[A1].Value <> 0 Then Me.[A2].ClearContents
   End Sub
À condition toutefois que H3, H6 et H9 ne soient pas à leur tour des formules. L'évènement ne détecte pas un changement de valeur de formule, seulement une modification de contenu.
Genial,
je l'essaie de suite, les cellules H6 et H9 sont des listes déroulantes, ça devrait passer...merci
 
Bonjour samaraxa, Bernard, soan,

Voyez le fichier joint et ces macros dans le code de la feuille :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim n&, i&, c As Range
n = 9 'nombre de cellules, à adapter
For i = 1 To n
    Set c = Cells.Find("ordre " & i, , xlValues)
    If Not c Is Nothing Then If c(1, 0) = "" Then c(1, 0).Select: Exit Sub
Next
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n&, i&, c As Range, j&
n = 9 'nombre de cellules, à adapter
For i = 1 To n
    Set c = Cells.Find("ordre " & i, , xlValues)
    If Not c Is Nothing Then
        If Not Intersect(Target, c(1, 0)) Is Nothing Then
            Application.ScreenUpdating = False
            Application.EnableEvents = False 'désactive les évènements
            For j = i + 1 To n
                Set c = Cells.Find("ordre " & j)
                If Not c Is Nothing Then c(1, 0) = ""
            Next j
            Application.EnableEvents = True 'réactive les évènements
            Exit Sub
        End If
    End If
Next i
End Sub
A+
Déjà merci, j'essaie de compléter à bon escient et vous tient au courant...
Samaraxa
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour