VBA Recherche à 2 critères par rapport à userform

Pasbleau

XLDnaute Nouveau
Bonjour le forum.

J'avais fait appel à vous il y a quelques années, avec succès. C'est pour cela que je reviens, un nouveau problème sur du VBA. Je m'explique.

Je souhaite faire une recherche selon 2 critères qui se trouvent dans une userform.
Mon premier critère est une date (DTPicker) et mon deuxième une textbox.

En claire, sur mon userform, lorsque je clique sur VALIDER, je veux que soit inscrit "OK" en colonne C de la ligne qui contient, en colonne A la valeur de ma date et en colonne B la valeur de ma textbox.
Pour le tableau si dessous, j'aurais cliqué sur VALIDER en ayant dans mon DTPicker 19/08/1950 et dans ma textbox le texte Bernard.
A........................B......................C
19/08/1950.........Jean
18/08/1948.........Alain
11/01/1990.........Michel
12/02/2010.........Henri
19/08/1950.........Bernard.............OK

Voila j'ai essayé d'être le plus claire possible mais pas simple après quelques heures de recherche sur les forums ...
Merci d'avance pour vos réponses !!
 

Modeste

XLDnaute Barbatruc
Re : VBA Recherche à 2 critères par rapport à userform

Bonjour Pasbleau,

Tes explications sont assez claires, me semble-t-il. Par contre, si on doit articuler la recherche avec un UserForm existant, le mieux serait sans doute de joindre une version allégée de ton fichier (lequel sera expurgé de toute donnée à caractère confidentiel). Un fichier permettrait aussi de tester une proposition avant de la soumettre.

Ceci dit, si tu fréquentes régulièrement ce forum (ou d'autres), tu n'as jamais lu que le DtPicker posait régulièrement problème?

Deux questions aussi, si je peux:
- il risque d'y avoir des doublons dans les deux colonnes (ça semble être le cas avec les dates, mais quel sera le contenu réel de la colonne B)?
- le volume de données à traiter sera de l'ordre de quelques dizaines, centaines ... ou milliers de lignes?
 

Pasbleau

XLDnaute Nouveau
Re : VBA Recherche à 2 critères par rapport à userform

Bonjour Modeste.

Effectivement, c'est mieux avec un fichier. Je vous le mets en pièce jointe, avec un commentaire dans le menu développeur de ce que je souhaite.

Pour répondre à tes questions :
- Effectivement, je me suis rendu compte que le DTPicker posait problème. J'ai réussi à passer outre, mais si vous avez une solution meilleure, je suis preneur. Pour le moment le DTPicker n'est pas ce qui me pose problème.
- Il y aura des doublons sur les dates oui, mais pas sur les articles pour une même date : il ne pourra jamais y avoir de ligne identique dans la feuille "archive commande". Je me débrouille pour m'assurer de cela.
- Le volume de données à traiter sera de quelques centaines de lignes. Disons que dans la feuille "archives commandes", la où il faut faire la recherche, j'aurai rapidement quelque centaines de lignes oui.

Merci, en attendant votre très attendu retour :)
 

Pièces jointes

  • VBA Recherche 2 critères userform.xlsm
    28.7 KB · Affichages: 178

Modeste

XLDnaute Barbatruc
Re : VBA Recherche à 2 critères par rapport à userform

Re,

J'ai mis du temps à trouver ton commentaire :eek: ... mais je ne suis avancé qu'à moitié :(
C'est donc dans le UserForm Entrée qu'il faut aller "fouiller". Le n° de commande je vois bien où il est, mais de quelle date parles-tu? Il y en a trois, tout de même (dont une non-affichée dans cet UserForm)

Pour ce qui est de remplacer le contrôle DtPicker, par quelque chose d'autre, tu devrais pouvoir trouver des pistes ici ou encore ici
 

Modeste

XLDnaute Barbatruc
Re : VBA Recherche à 2 critères par rapport à userform

Bonjour Pasbleau,
Salut Michel :) Quand je pense que mon nom de famille est Lob! ... J'ai bien fait de ne pas te le dire :rolleyes:

Désolé Pasbleau, mais quelque chose doit m'échapper: dans le commentaire que tu avais mis dans le code du UserForm Entrée, tu indiques:
Il faut considérer qu'il n'y aura qu'une seule commande par jour
Pourquoi, dès lors, faut-il retrouver une ligne où n° de commande et date de commande seront identiques? Si on trouve le n° de commande, la date sera forcément la bonne, non :confused:
À l'inverse, pour une commande (et donc une même date de commande) on ne se préoccupe pas de savoir si l'article est celui qui a été livré???

Pourrais-tu lister les manipulations que tu ferais, dans l'utilisation quotidienne de ton fichier et ce qui devrait se passer dans les différents cas de figure? (surtout le cas qui nous occupe ici)
 

Pasbleau

XLDnaute Nouveau
Re : VBA Recherche à 2 critères par rapport à userform

Effectivement, je me suis trompé dans l'explication. C'est bien sur en fonction du numéro de commande et du nom de l'article (label1) qu'il faut faire la recherche.
La manipulation que je souhaite faire :
Lorsque je double clique sur une ligne, les infos sont affichés dans l'userform "Entrée". Lorsque j'ajoute la date de livraison par exemple, ou la quantité reçue, et que je clique sur valider, je voudrais que ces nouvelles valeurs soient copiés collés dans la feuille "archives commande", à la ligne correspondante (donc à la ligne qui a le même n° de commande et le même nom de produit).
En faite, on saisi des valeurs depuis la feuille "Inventaire" en double cliquant sur une ligne. Et quand on valide, ça remplit les données, mais dans la feuille "archives commandes".
 

Modeste

XLDnaute Barbatruc
Re : VBA Recherche à 2 critères par rapport à userform

Avec ce que j'ai compris, commence par tester ce qui suit:
VB:
Private Sub CommandButton1_Click()
With Sheets("Archives commandes")
    tablo = .[B4].CurrentRegion 'on recopie le tableau d'archive dans un tableau en mémoire
    For lig = 1 To UBound(tablo) 'pour chaque ligne de ce tableau
        'si num commande et désignation sont identiques aux champs du UserForm,
        'numéro de ligne dans la feuille = numéro de ligne dans le tableau + 2 lignes vides
        If tablo(lig, 1) = Val(TextBox1) And tablo(lig, 2) = Label1 Then ligne = lig + 2: Exit For
    Next lig
    .Cells(ligne, 10) = Val(TextBox2) 'à adapter, pour recopier les autres infos (dates, ...)
End With
End Sub
Mais ... que se passe-t-il si on double-clique, en feuille inventaire, sur une ligne pour laquelle la quantité reçue a déjà été renseignée?
 

Pasbleau

XLDnaute Nouveau
Re : VBA Recherche à 2 critères par rapport à userform

Super, ça à l'air de correspondre à ce que je souhaite. Mais, le code bug lorsque je ferme mon userform avec la croix rouge, ou quand je valide parfois, Excel plante et se ferme (message "Excel à rencontré une erreur ... machin machin", sans plus de précision.

J'essaie d'adapter ton code à mon fichier, mais pas évident quand Excel se ferme dès que je fais une manip ...

Pour infos, si on double clique sur une ligne déja renseignée, ce sont les infos déjà renseignés qui apparaissent dans l'userform ... ;) ça c'est une autre partie de mon code, que je n'ai pas mise pour alléger le tout ...
 

Pasbleau

XLDnaute Nouveau
Re : VBA Recherche à 2 critères par rapport à userform

Désolé, le bug était sur mon "vrai" fichier. Il manquait un petit "cancel = true".

Je m'en sors à peu près avec ton code pour le moment, donc merci beaucoup.
Une petite dernière (?) question quant à ce code : comment faire pour afficher une msgbox avec un message d'erreur si le numéro de commande n'est pas trouvé par exemple ?
Je n'arrive pas à intégrer cela dans ton code ...
 

Modeste

XLDnaute Barbatruc
Re : VBA Recherche à 2 critères par rapport à userform

Bonsoir,

En fait je n'ai pas prévu de message d'erreur, puisque le n° de commande en feuille Inventaire est donné par une formule ... en faisant une SOMME :)confused:) de ce qui figure en feuille Archive, avec la même désignation et la même date de commande ... comment un n° de commande pourrait-il être inconnu (me suis-je donc demandé in petto)?
Je dois t'avouer que c'est ce passage d'infos d'une feuille à l'autre (et retour) qui me laisse un peu perplexe :)

Quoi qu'il en soit, voici une adaptation possible:
VB:
Private Sub CommandButton1_Click()
With Sheets("Archives commandes")
    tablo = .[B4].CurrentRegion 'on recopie le tableau d'archive dans un tableau en mémoire
    For lig = 1 To UBound(tablo) 'pour chaque ligne de ce tableau
        'si num commande et désignation sont identiques aux champs du UserForm,
        'numéro de ligne dans la feuille = numéro de ligne dans le tableau + 2 lignes vides
        If tablo(lig, 1) = Val(TextBox1) And tablo(lig, 2) = Label1 Then ligne = lig + 2: Exit For
    Next lig
    If IsEmpty(ligne) Then
        MsgBox "N° de commande non-répertorié"
    Else
        .Cells(ligne, 10) = Val(TextBox2)
        ' ... autres instructions éventuelles ...
    End If
End With
End Sub
 

Discussions similaires

Réponses
9
Affichages
433

Membres actuellement en ligne

Statistiques des forums

Discussions
312 489
Messages
2 088 854
Membres
103 975
dernier inscrit
denry