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

osiris150

XLDnaute Occasionnel
Modeste,

Est-ce-que à tout hasard on pourrait rajouter 2 conditions dans la macro ?
J'aurai 1 colonne supplémentaire qu'on appellerait Date (colonne D)
Il faudrait que la sélection se fasse en plus que seulement si la date est supérieur à 21 jours par rapport à la date du jour .
enfin dans cette colonne si on a une erreur du type #VALEUR! cela n'arrête pas la macro.
J'ai remis en PJ le fichier avec la colonne supplémentaire.

Je cherche à le faire par moi même mais pour l'instant je sèche. Je ne désespère pas de trouver mais mes connaissances en VBA restent très limité :)

Merci d'avance.
Cordialement
 

Pièces jointes

  • préselection auto (osiris150) (1).xlsm
    23.2 KB · Affichages: 29

Modeste

XLDnaute Barbatruc
Bonsoir,

Apparemment, tu as modifié ce qu'il fallait! (sauf pour les messages d'erreurs #VALEUR!) ... le reste fonctionne, non?

En cas d'erreur, que doit-on faire? Aucune mention pour chaque ligne concernant le n° de commande concerné? Uniquement pour la ligne avec l'erreur? Ou on fait comme si la date répondait à la condition?
... À propos de condition, tu veux bien clarifier: dans ton dernier message tu dis: "la date est supérieur à 21 jours par rapport à la date du jour" et dans le code, tu écris: "tablo(x, 4) <= Date + 21"
 

osiris150

XLDnaute Occasionnel
Bonjour Modeste,

Oui effectivement j'ai réussi à modifier la macro en incluant l'histoire des 21 jours. Désolé si je n'ai pas été clair.
En fait je voulais dire que la condition est remplie si une date est comprise entre la date du jour + 21 jours et toutes les dates inférieures à la date du jour.
Après concernant l'erreur #VALEUR!, si on la rencontre sur une commande dans la colonne D, il faudrait simplement considérer que c'est comme si la condition n'était pas remplie et du coup on ne met pas de N° en colonne E.
Merci d'avance
Cordialement
 

Modeste

XLDnaute Barbatruc
Bonjour,

Ça devient franchement tiré par les cheveux ... il vaudrait mieux trouver un système pour éviter les messages d'erreur plutôt que monter une usine à gaz pour corriger tous les soucis que tu pourrais rencontrer!
Une dernière proposition (je serai absent 2 ou 3 jours ensuite):
VB:
Private Sub CommandButton1_Click()
Set liste = CreateObject("scripting.dictionary")
Dim tabloColD()
Dim tabloLignes()
tablo = Range("A5:D" & 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 IsError(tablo(x, 4)) Then GoTo sortir
                If tablo(x, 2) = tablo(x, 3) And tablo(x, 4) <> "" And tablo(x, 4) <= Date + 21 Then
                    ReDim Preserve tabloLignes(lig)
                    tabloLignes(lig) = x
                    lig = lig + 1
                Else
sortir:
                    dif = True
                    Exit For
                End If
            End If
        Next x
        If Not dif Then
            For k = 0 To UBound(tabloLignes)
                tabloColD(tabloLignes(k), 1) = [G1].Value
            Next k
        End If
        liste(tablo(i, 1)) = ""
    End If
Next i
Range("e5:E" & Cells(Rows.Count, 5).End(xlUp).Row).ClearContents
[E5].Resize(UBound(tablo), 1) = tabloColD
End Sub
 

osiris150

XLDnaute Occasionnel
OK Modeste tu n'as pas tort sur le fond...Je sais que ce je demande est assez tordu. Je vais tester ta macro et ferai un retour.
Je vais essayer de ne plus t'embêter. Tu as déjà fait énormément. Je te remercie encore.
Cordialement
Nicolas
 

osiris150

XLDnaute Occasionnel
Bonjour,

Je reviens juste pour savoir s'il serait possible de faire une petite amélioration sur la macro car je me suis rendu compte qu'à l'utilisation, j'avais une option que j'avais zappé de prendre en compte.

Voilà en fait j'aurais voulu faire en sorte que si on a déjà fait une présélection et qu'on voulait en refaire une (suite à des rajouts de commandes) on puisse juste repointer les nouvelles commandes et pas celles qui le sont déjà.
Je ne sais pas si c'est compliquer à faire ou pas.
Dans tous les cas je soumets la question.
Cordialement
Nicolas.
 

Pièces jointes

  • préselection auto (osiris150) (1) (1).xlsm
    23.2 KB · Affichages: 28

Modeste

XLDnaute Barbatruc
Bonjour,
j'avais une option que j'avais zappé de prendre en compte
Heureusement que tu trouvais que je n'avais pas tort mardi matin! :rolleyes:

Pour ne pas changer, je ne comprends pas bien la demande!? Comment déterminerait-on les commandes déjà "pointées"? Celles où quelque chose apparaît en colonne E? ... Mais si on les "repointe", comment distinguerait-on les anciennes des nouvelles? La mention en colonne E sera différente?
Autrement dit, quel est le problème si tu exécutes la macro sur des données sur lesquelles elle a déjà tourné?
 

osiris150

XLDnaute Occasionnel
Bonjour Modeste,

Désolé, mais en fait c'est à l'utilisation que je me rends compte de ce qu'il manque...

Pour t'expliquer concrètement comment ça fonctionne dans mon travail de tous les jours :

J'ai un carnet de X commandes qui sont importées dans Excel. Il y a plusieurs type de commandes (Contremarque, Stock, SAV etc...) Ensuite j'organise les chargements de ces commandes. Alors je fais un pointage selon certains critères (déjà évoqués précédemment). Pointage qui se fait de manière automatique grâce à ta macro mais uniquement sur les commandes dite de "contremarque". Toutes les autres ne sont pas pointées car elles demandent une analyse plus approfondie notamment sur les quantités à sélectionner etc... Donc du coup ce qu'il se passe c'est qu'avec la macro je vais avoir une pré-sélection des commandes contremarques (phase N°1), ensuite je fais un pointage manuellement des commandes Stocks, SAV etc (Phase N°2).. Et ce que j'aurais voulu c'est que la macro ne m'efface pas tout lorsque je la relance mais qu'elle ne pointe que les nouvelles commandes contremarques importées.
C'est vrai c'est tordu mon truc :D et je ne rends pas compte de la difficulté au niveau macro.
J'espère que comme ça c'est plus clair.
Amicalement
Nicolas
 

Modeste

XLDnaute Barbatruc
Re,

Mardi, j'avais dit que c'était la dernière proposition, non!? On va donc dire que c'était la pénultième et c'est celle-ci qui sera la dernière, sinon on est vraiment parti pour l'usine à gaz!

L'initialisation de la variable tablo devient:
VB:
tablo = Range("A5:E" & Cells(Rows.Count, 1).End(xlUp).Row)
Par ailleurs, plutôt que d'essayer de ne pas effacer, je propose de recopier l'existant.
Ajoute donc juste après For i = 1 To UBound(tablo)
La double instruction suivante (sur une seule ligne):
VB:
If tablo(i, 5) <> "" Then tabloColD(i, 1) = tablo(i, 5): GoTo sortir
 

Discussions similaires

Statistiques des forums

Discussions
312 307
Messages
2 087 097
Membres
103 468
dernier inscrit
TRINITY