XL 2013 Pré-selection automatique de cellules

osiris150

XLDnaute Occasionnel
Bonjour à tous,

Je souhaiterais réussir à faire une pré-sélection automatique de cellules en
VBA en fonction d'un certains nombres de critères en cliquant sur un bouton.
Voilà, je voudrais faire en sorte que lorsque l'on renseigne un N° en cellule T1, celui-ci s'inscrive automatiquement dans la colonne L mais en fonction d'un certains nombres de critères :
Je vous mets le fichier en pièce jointe et ci-dessous un exemple concret.

Exemple : (avec la commande 1111)

Le N° de Doc venta correspond à une commande. A partir de là il faut vérifier que sur cette commande les valeurs renseignées sur les lignes de toute la commande en colonne J et K soient identiques.
Si tel est le cas alors on vérifie ensuite que la date de livraison indiquée de la commande en Colonne C est <= à aujourd'hui + 21 jours.
Si ces critères sont tous remplies alors on remplit les cellules L6 et L7 (pour notre exemple) avec le N° inscrit en T1 soit le 4

J'espère que ma requête est faisable et pas trop compliqué.
En vous remerciant par avance pour votre aide.
Cordialement
Nicolas
 

Pièces jointes

  • préselection auto.xlsm
    19.5 KB · Affichages: 53

Modeste

XLDnaute Barbatruc
Bonjour osiris150,

Je dois t'avouer qu'à la lecture ... je n'ai pas bien compris le sens de ce que tu essaies de faire!? Comme je ne connais pas ton contexte de travail, je me dis que tu as sans doute tes raisons :confused:

Ceci étant, il reste des zones d'ombre:

  • Pourquoi utiliser un bouton? (on pourrait le faire au double-clic sur un n° de commande, par exemple?)
  • Au moment du clic sur ledit bouton, qui (à part toi) peut savoir qu'il faut "s'occuper" de la commande 1111 et pas de la 3333
  • Que deviennent les chiffres de la commande 1111 quand on s'occupera un jour de la 3333?
  • Si les quantités ne sont pas toutes identiques pour une commande, entre les colonnes J et K, que fait-on? On inscrit le chiffre de T1 dans les lignes où il y a correspondance, ou dans aucune?
  • ... il en viendra peut-être d'autres par la suite
 

Chris401

XLDnaute Accro
Bonsoir
Salut Modeste

En supposant qu'il faut s'occuper de toutes les commandes, essaye avec ce code :
VB:
Private Sub CommandButton1_Click()
Dim c As Range
Dim derlg As Integer

derlg = Range("C" & Rows.Count).End(xlUp).Row
For Each c In Range("L6:L" & derlg)
    i = c.Row
    If (Cells(i, 10) = Cells(i, 11) And Cells(i, 3) > 0 And Cells(i, 3) <= Date + 21) Then c = [T1]
Next c
End Sub

Cependant, pour la commande 1111 :

Colonne J = colonne K ==> OK

Date livraison = 15/11/2016
Date du jour = 26/09/2016 + 21 = 17/10/2016

Or 15/11/2016 est > à 17/10/2016 - Donc la cellule L ne doit pas avoir le 4 non ?
 

osiris150

XLDnaute Occasionnel
Bonjour Modeste et Chris

Merci d'avoir pris le temps de regarder ma requête.
Pour Chris -->
Or 15/11/2016 est > à 17/10/2016 - Donc la cellule L ne doit pas avoir le 4 non ?
Absolument ! on ne doit pas mettre 4 dans ce cas là. Donc ton code à priori doit être bon.
Je vais le tester et venir faire un retour.

Pour Modeste -->

Pourquoi utiliser un bouton? (on pourrait le faire au double-clic sur un n° de commande, par exemple?)
En fait dans mon vrai fichier de travail je veux que cette pré-sélection soit une possibilité à l'ouverture du fichier via une boite de dialogue. Donc le bouton c'est juste pour l'exemple.

Au moment du clic sur ledit bouton, qui (à part toi) peut savoir qu'il faut "s'occuper" de la commande 1111 et pas de la 3333
en fait il faut s'occuper de toutes les commandes

Si les quantités ne sont pas toutes identiques pour une commande, entre les colonnes J et K, que fait-on? On inscrit le chiffre de T1 dans les lignes où il y a correspondance, ou dans aucune?
Dans ce cas on ne met rien
 

osiris150

XLDnaute Occasionnel
Je viens de tester le code de Chris401 et ça marche partiellement !
en fait si dans une commande il y a par exemple 4 lignes et si en colonne J ou K il y a une différence sur 1 ligne alors il ne faut pas mettre le 4.
J'ai noté aussi que parfois la macro plante. En effet en colonne C il se peut que de temps en temps j'ai au lieu d'avoir une date de livraison un message d'erreur du type #VALEUR! et du coup cela plante la macro. Est-ce que par VBA on a moyen de contourner cette erreur si elle est présente sur une commande en colonne C ?
Merci d'avance
Cordialement
 
Dernière édition:

osiris150

XLDnaute Occasionnel
Bonjour à tous,

Peut-être mon explication n'est pas claire. Je vais la reformuler de manière plus simple.
J'ai 3 colonnes A, B et C et D
En colonne A je mets des N° de commandes (ex: 1,2,3 etc...) en colonne B Je mets des quantités commandées(ex : 20, 30, 40 etc...) et en colonne C je mets aussi des quantités mais on va les appeler des quantités réservées (ex : 20,30, 40 etc...).

Un même N° de commande peut avoir plusieurs lignes avec plusieurs quantités commandées et plusieurs quantités réservées.
maintenant ce que je cherche à faire c'est en cliquant sur un bouton mettre un N°, par exemple le 4, en colonne D si et seulement si, une commande remplit le critère suivant, à savoir que toutes les lignes doivent avoir en colonne B et C la même quantité, sinon on ne met pas le 4 en colonne D.
Je remets un fichier simplifié en PJ.
Merci d'avance.
Cordialement
 

Pièces jointes

  • préselection auto.xlsm
    13.6 KB · Affichages: 48

osiris150

XLDnaute Occasionnel
Bon je viens de trouver la formule sous excel mais par contre je ne sais pas la retranscrire en VBA.
Est-ce que quelqu'un saurait le faire ?

=SI(A6="";"";SI(SOMME.SI.ENS($C$6:$C$260;$A$6:$A$260;A6)<>SOMME.SI.ENS($B$6:$B$260;$A$6:$A$260;A6);"";$F$1))

Merci d'avance.
Cordialement
 

osiris150

XLDnaute Occasionnel
Bonjour

Je viens de retranscrire la formule
=SI(A6="";"";SI(SOMME.SI.ENS($C$6:$C$260;$A$6:$A$260;A6)<>SOMME.SI.ENS($B$6:$B$260;$A$6:$A$260;A6);"";$F$1))

avec l'enregistreur de macro et ça me donne ça :

ActiveCell.FormulaR1C1 = _
"=IF(RC[-3]="""","""",IF(SUMIFS(RC[-1]:R[254]C[-1],RC[-3]:R[254]C[-3],RC[-3])<>SUMIFS(RC[-2]:R[254]C[-2],RC[-3]:R[254]C[-3],RC[-3]),"""",R[-5]C[2]))"

J'avoue que ce n'est pas simple à comprendre... Est-ce qu'il y aurait une syntaxe plus simple en vba ?
Merci par avance
Cordialement
 

Modeste

XLDnaute Barbatruc
Bonsoir osiris150,
Bonsoir aussi à Chris401 que je n'avais pas salué,

Je m'étais dit que la demande n'étant pas claire au départ, puis se transformant en cours de route, j'allais m'abstenir de répondre, mais bon, l'opiniâtreté d'Osiris m'a sorti de ma réserve :rolleyes:

Tout ceci pour dire que la solution trouvée par l'intéressé à son souci à l'aide de SOMME.SI.ENS ne me semble pas non plus répondre à (ce que j'ai compris de) la demande initiale: prenons l'exemple du fichier fourni au message #7. Pour la commande n° 2, les quantités commandées et réservées sont respectivement de 25 - 25 et 30 - 30.
Si on les modifie en 15 - 25 et 30 - 20, les deux lignes ne sont plus en égalité, mais le résultat de la formule donnera à croire le contraire ... ou je me trompe?
 

osiris150

XLDnaute Occasionnel
Bonjour Modeste,

c'est vrai que je suis persévérant :) En fait c'est pour mon travail et cela pourrait me faciliter beaucoup la tâche au quotidien si j'arrive à exploiter cette demande.
Pour en revenir à ta dernière question, effectivement si on met 15-25 et 30-20 sur la commande N°2 mon raisonnement ne marche pas... Du coup je ne sais plus comment faire.
Je pensais avoir en partie réussi... Si tu as une idée je suis partant.
En te remerciant d'avoir pris le temps de te pencher sur mon problème.
Cordialement
Nicolas
 

Modeste

XLDnaute Barbatruc
Bonjour,

Si tu as une idée je suis partant.
Oh, une proposition, oui ... mais sans macro, donc tu ne vas pas aimer ;)

Inscrire la valeur à recopier en F1
En E6, saisir cette formule:
Code:
=SI(A6="";"";SI(C6=B6;A6;""))
... recopier vers le bas.
En D6, écrire:
Code:
=SI(E6<>"";SI(NB.SI($A$6:$A$30;A6)=NB.SI($E$6:$E$30;A6);$F$1;"");"")
... recopier vers le bas également,



Comme indiqué dans la pièce jointe, la colonne E peut être masquée.

Bonne journée,
 

Pièces jointes

  • préselection auto (osiris150).xlsm
    17.3 KB · Affichages: 40

osiris150

XLDnaute Occasionnel
Bonjour Modeste,

Ta proposition marche parfaitement et réponds tout à fait à ce que je recherche !
Un très grand merci à toi pour avoir pris le temps de de pencher sur ma demande.

Par contre effectivement il faudrait pouvoir la retranscrire en VBA car je dois intégrer cela dans une macro qui fait d'autres traitements.
J'espère que quelqu'un pourra trouver une solution.
Cordialement
Nicolas
 

Modeste

XLDnaute Barbatruc
Bonjour,

Toujours pas intimement persuadé de l'intérêt de la démarche ... copie ces lignes dans la fenêtre de code de la feuille concernée, inscris la valeur à recopier en F1 et teste:
VB:
Private Sub CommandButton1_Click()
Set liste = CreateObject("scripting.dictionary")
Dim tabloColD()
Dim tabloLignes()
tablo = Range("A5:C" & Cells(Rows.Count, 1).End(xlUp).Row)
ReDim tabloColD(1 To UBound(tablo), 1 To 1)
For i = 1 To UBound(tablo)
    If tablo(i, 1) <> "" And Not liste.exists(tablo(i, 1)) Then
        ReDim tabloLignes(0)
        lig = 0
        dif = False
        For x = i To UBound(tablo)
            If tablo(x, 1) = tablo(i, 1) Then
                If tablo(x, 2) = tablo(x, 3) Then
                    ReDim Preserve tabloLignes(lig)
                    tabloLignes(lig) = x
                    lig = lig + 1
                Else
                    dif = True
                    Exit For
                End If
            End If
        Next x
        If Not dif Then
            For k = 0 To UBound(tabloLignes)
                tabloColD(tabloLignes(k), 1) = [F1].Value
            Next k
        End If
        liste(tablo(i, 1)) = ""
    End If
Next i
Range("D5:D" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
[D5].Resize(UBound(tablo), 4) = tabloColD
End Sub
 

osiris150

XLDnaute Occasionnel
Alors là un grand bravo à toi ! c'est parfait ! ça marche impeccable.

Toujours pas intimement persuadé de l'intérêt de la démarche

En fait, le but c'est de pouvoir faire une pré-sélection de commandes de manière automatique et en fonction de certains critères dans un fichier qui en comporte plus de 2000 lignes. Cela afin d'automatiser un processus que je faisais manuellement avant.

Cela va beaucoup m'aider.

Seul hic je ne comprends rien à la macro en VBA... Bon j'essaierai de la décortiquer tranquillement.

Cordialemeent
Nicoals
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa