XL 2016 condition case a cocher

christ77000

XLDnaute Occasionnel
Bonsoir à tous, je reviens vers vous parce que je n'arrive pas à trouver une solution au vrai/faux d'une case à cochés si un cellule contient 0.

j'édite des bons de préparation de commande, par défaut toutes les cases à cochées sont actives. L'utilisateur doit fait l'inventaire avant de valider le bon et décocher les cases à cochées des lignes à 0 afin de ne pas envoyer des lignes avec 0.

par exemple sur la ligne 1, j'affiche le nombre de ramette de papier qu'il me faudrait. on m'en demande 20 j'en possède 15 donc il en manque 5 (résultat en cellule E15) la case a cochée maintient cette ligne avec VRAI (cellule Y15)
maintenant j'en possède 20 il en manque 0 la case à cocher devrait passer à FAUX donc plus d'affichage de cette ligne sur le bon.

L'utilisateur aujourd'hui imprime des bons avec des lignes avec 0 en commande, ce qui est une perte de temps pour le magasinier sauf si l'utilisateur décoche manuellement la case à cochée, mais comme personne ne le fait ca rouspète. En faite je voudrais palier à de la fainéantise de certains. Merci pour votre aide.
 

Pièces jointes

  • appro.xlsm
    46 KB · Affichages: 14
Solution
Bonjour,

Un changement de B8:B37 ou F8:G37 entraine un recalcul de la formule de la colonne E correspondante.(=B?-SOMME(F?:G?)) C'est donc le changement d'une cellule de B8:B37 ou F8:G37 qu'il faut intercepter :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Intersect(Target, Range("B8:B37,F8:G37")) Is Nothing Then
            If Range("E" & Target.Row) < 1 Then Cells(Target.Row, Range("Tests").Column) = False
    End If
End Sub

Cordialement

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le code de la feuille du fichier joint vous trouverez ces lignes :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Intersect(Target, Range("B8:B37")) Is Nothing Then
        If Range("E" & Target.Row) < 1 Then Cells(Target.Row, Range("Tests").Column) = False
    End If
End Sub

Dans la feuille elle-même :
  1. la zone y8:y37 a été nommée "Tests"
  2. dans les cellules P8:p37 vous trouverez la formule :
    =SI(LIGNE(1:1)<=NB.SI(Tests;VRAI);INDEX($C$8:$C$37;AGREGAT(15;6;LIGNE($1:$30)/(Tests);LIGNE(1:1)));"")
    qui retourne les lignes (sans vide) pour lesquelles Tests est vrai
  3. le bouton lançant la macro de transfert a été supprimé
les cellules renvoyant les tests de checkbox pourrait être placées en colonne A et leurs valeurs (VRAI/FAUX) masquées par le format personnalisé : ;;; (trois point-virgules)

N'oubliez pas que ces cellules doivent se nommées 'Tests'

Cordialement
 

Pièces jointes

  • appro.xlsm
    51.6 KB · Affichages: 9

christ77000

XLDnaute Occasionnel
Bonjour et surtout un grand merci pour votre aide. Je viens de lancer le fichier et effectivement le résultat je ne comprend pas tout mais au moins c'est très efficace. Par contre le faite que j'ai des lignes a 0 ne change pas la condition vrai faux des cases a cochées ou alors j'ai pas tout compris. En faite si je prends par défaut toutes les cases à cochées en active Dans E14 il y a 0 donc la condition vrai en Y14 devrait passer en FAUX et donc me désactiver en auto la ligne et du coup la case a cochée. Je sais pas si je suis claire
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Il faut changer les valeurs en "B8:B37" pour que la macro se lance, puisque ce sont les quantités (QTE) qui détermine la valeur de la cellule correspondante en E
J'ai fait quelques tests sur deux ou trois lignes, mais c'est tout. A vous de faire le reste

Macro commentée

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Si une cellule de B8:B37 a changé de valeur'
    If Target.Count = 1 And Not Intersect(Target, Range("B8:B37")) Is Nothing Then
        ' Si après calcul la valeur de la cellule correspondante en E est inférieur à 1'
        ' Alors mettre Faux dans la cellule de tests à la même ligne'
        ' sinon, ne rien faire
        If Range("E" & Target.Row) < 1 Then Cells(Target.Row, Range("Tests").Column) = False
    End If
End Sub



Cordialement
 

christ77000

XLDnaute Occasionnel
RE ha oui pour B8:B37 ok effectivement cela modifie le vrai/faux sauf que B8:B37 se sont des valeurs fixe demandées. celles qui bougent ce sont celles en E8:E37 dans "A prendre", si E8 = 0 Y8=faux j'ai donc modifié votre code mais cela ne fonctionne pas. Et E8:E37 est le résultat d'un calcul donc pas une valeur direct.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Si une cellule de B8:B37 a changé de valeur'
    If Target.Count = 1 And Not Intersect(Target, Range("E8:E37")) Is Nothing Then
        ' Si après calcul la valeur de la cellule correspondante en E est inférieur à 1'
        ' Alors mettre Faux dans la cellule de tests à la même ligne'
        ' sinon, ne rien faire
        If Range("E" & Target.Row) < 1 Then Cells(Target.Row, Range("Tests").Column) = False
    End If
End Sub
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Un changement de B8:B37 ou F8:G37 entraine un recalcul de la formule de la colonne E correspondante.(=B?-SOMME(F?:G?)) C'est donc le changement d'une cellule de B8:B37 ou F8:G37 qu'il faut intercepter :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Intersect(Target, Range("B8:B37,F8:G37")) Is Nothing Then
            If Range("E" & Target.Row) < 1 Then Cells(Target.Row, Range("Tests").Column) = False
    End If
End Sub

Cordialement
 

christ77000

XLDnaute Occasionnel
Bonsoir, cela fonctionne a merveille. un grand merci à vous.
Vu que vous avez des macro miracle. comment faire pour remettre en auto toutes les cellules de Y8:Y37 les "Tests" après envoie car moi je ne connais que le copier/coller. Valeur d'une colonne avec des VRAI que je colle en colonne Y8:Y37. Ca fonctionne mais pas terrible au niveau codage.

Encore un grand merci pour le temps que vous avez passé à m'aider c'est sympa.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le fichier joint la macro suivante pour cocher ou décocher tout est attribuée à un bouton :

VB:
Sub CocherDecocher()
    With ThisWorkbook.Sheets("ListeAppro").Range("Tests")
        .Value = Application.CountIf(.Cells, True) = 0
    End With
End Sub

Cordialement
 

Pièces jointes

  • appro.xlsm
    55.1 KB · Affichages: 13
Dernière édition:

Discussions similaires

Réponses
5
Affichages
100
Réponses
10
Affichages
417

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 812
dernier inscrit
abdouami