XL 2013 VBA je crois....

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.

Samaraxa

XLDnaute Nouveau
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...???
 

soan

XLDnaute Barbatruc
Inactif
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:

Dranreb

XLDnaute Barbatruc
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.
 

Samaraxa

XLDnaute Nouveau
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)));"")
 

Dranreb

XLDnaute Barbatruc
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.
 

job75

XLDnaute Barbatruc
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

  • Ordre(1).xlsm
    17.5 KB · Affichages: 9
Dernière édition:

Samaraxa

XLDnaute Nouveau
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
 

Samaraxa

XLDnaute Nouveau
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
 

Discussions similaires

Statistiques des forums

Discussions
312 027
Messages
2 084 758
Membres
102 655
dernier inscrit
STA82700