Recherche données et affichage tableau dans un UserForm

Bonjour à tous,

J'en fais appel à la communauté car mon but dépasse largement mes connaissances.

J'ai un fichier avec plusieurs feuilles : Dashboard, Stock, Commandes

J'ai créé un bouton "Recherche Article" dans Dashboard où l'utilisateur peut renseigner ce qu'il veut : code PS ou mot clé.

Je souhaite faire une recherche de ce code ou de ce mot clé dans tout le tableau dans "Stock" et afficher les résultats correspondants dans l'emplacement de ce UserForm.

J'aimerais également que pour chaque article trouvé, une recherche soit faite dans "Commandes" pour chercher s'il y a une commande en cours (donc où le statut est différent de "livrée"), et afficher la date et le numéro de la dernière commande.

Le "Code_PS" fait office d'identifiant unique pour chaque article

userform

Avec "Code_PS", "Catégorie", "Désignation" et "Stock" provenant de la feuille STOCK

Avec "Commande en cours (oui/non)", "Date dernière commande" et "N° dernière commande" provenant de la feuille COMMANDES

J'ai tenté un petit code timide à partir de ce que j'ai pu trouver par-ci par-là mais je suis à des années lumière de la solution et rien que ça m'a déjà pris une bonne dizaine d'heures (ce matin je ne savais même pas ce qu'était un UserForm)

Option Explicit

Dim recherche$
Dim Rng, c, premier
Dim i&

Private Sub CommandButton_cancel_Click()
    Unload Me    
End Sub

Private Sub CommandButton_search_Click()
        Me.ListBox1.Clear
        Set Rng = Sheets("STOCK").Range("Tableau1[#All]")
        Set c = Rng.Find(Me.TextBox1.Value, LookIn:=xlValues)
        If Not c Is Nothing Then
            premier = c.Address
            i = 0
            Do
                Me.ListBox1.AddItem
                Me.ListBox1.List(i, 0) = c.Value
                Set c = Rng.FindNext(c)
                i = i + 1
            Loop While Not c Is Nothing And c.Address <> premier
        End If
End Sub

ce qui m'affiche :

userform res

Autrement dit vraiment vraiment pas grand chose

Je vous remercie d'avance pour votre aide

Bonjour,

Essayer ce code

Option Explicit

Dim tb_stock As ListObject
Dim dic_stock As Object

Private Sub CommandButton_cancel_Click()

' Fermer le UserForm
    Unload Me

End Sub

Private Sub CommandButton_search_Click()
        Dim cell As Range, cell1 As Range
        Dim i As Integer

        Me.ListBox1.Clear

        Set dic_stock = CreateObject("Scripting.Dictionary")

        Set tb_stock = [Tableau1].ListObject
        With tb_stock
            Set cell = .Range.Find("*" & Me.TextBox1.Value & "*", Lookat:=xlWhole)
            If Not cell Is Nothing Then
                Set cell1 = cell
                Do
                    i = cell.Row - .HeaderRowRange.Row
                    dic_stock(i) = .DataBodyRange.Rows(i).Value
                    Set cell = .Range.FindNext(cell)
                Loop Until cell.Address = cell1.Address
            End If

            Me.ListBox1.ColumnCount = .ListColumns.Count            
            if dic_stock.Count > 0 then Me.ListBox1.Column = Application.Transpose(dic_stock.items)
        End With

End Sub

Bonjour thev,

Je te remercie pour ton retour rapide.

Ce code fonctionne déjà pas mal

J'aimerais savoir s'il est possible de ne sélectionner que certaines colonnes en résultat, car pour le moment c'est toute la ligne qui est recopiée dans le résultat, du coup, ce qui est affiché ne correspond pas à la sélection de données que je souhaite afficher :

res1

J'ai mis en rouge dans le fichier joint les informations des colonnes que je souhaite sélectionner.

Merci pour ton aide

Bonjour,

ci-jointe une proposition

Super !! Quelle rapidité

Si je comprends bien, c'est grâce à la propriété ControlTipText du label que tu choisis quelle colonne afficher, et l'espacement se fait en fonction de la largeur des labels, c'est ça ? Je pense que oui car j'ai essayé de rajouter la colonne fournisseur et ça fonctionne

Pour aller un peu plus loin, je cherche à ce que pour chaque article trouvé, une recherche soit faite dans "Commandes" sur la dernière commande effectuée pour cet article et afficher son statut, sa date et son numéro.

Le "Code_PS" fasant office d'identifiant unique pour chaque article, on peut se baser dessus.

En d'autres termes, pour chaque Code_PS trouvé :

- Statut dernière commande

- Date dernière commande

- Numéro dernière commande

On peut imaginer le résultat sous cette forme :

res2

J'ai également mis à jour le fichier avec les informations :

Merci pour ton aide

Si je comprends bien, c'est grâce à la propriété ControlTipText du label que tu choisis quelle colonne afficher, et l'espacement se fait en fonction de la largeur des labels, c'est ça ? Je pense que oui car j'ai essayé de rajouter la colonne fournisseur et ça fonctionne

Tout à fait. Je vois que tu te débrouilles bien avec le VBA.

réponse à venir pour la suite.

Pas aussi bien que je l'aimerais mais j'essaie de comprendre ce que tu m'envoies, même si je ne comprends pas tout, c'est le moins que je puisse faire.

En tout cas merci beaucoup, tu es super efficace

Bonsoir,

ci-jointe nouvelle version répondant à ta dernière demande

Wow, ça c'est vraiment génial !

Je te remerice pour les commentaires, même si malgré cela je t'avoue que c'est un peu dur de tout comprendre.

J'ai remarqué que si le tri des commandes ne se fait pas selon la date de la plus ancienne à la plus récente, les résultats sont différents, du coup je suppose que quelque part du doit dire de prendre en résultat les informations à partir du bas du tableau, mais je ne trouve pas où dans le code, est-ce que tu peux m'expliquer stp ?

On arrive au bout mais j'ai encore quelques petites demandes :

- une fois que l'on a fait une recherche, et que l'on veut faire une seconde recherche, est-il possible de faire en sorte de refaire une recherche sans fermer et relancer la recherche ?

Pour le moment, lorsque j'essaie, cela m'affiche cette erreur :

erreur

- je viens de remarquer que j'ai un message d'erreur lorsque je fais une recherche sur un article qui n'est pas dans le tableau de commande (par exemple "lampe"). Est-il possible de tester le tableau commande et d'afficher tout de même les informations issues du tableau stock en laissant vide, du coup, les colonnes associées à la commande ?

- parfois j'ai un message d'erreur qui je pensais être lié à un nombre minimal de caractère dans la recherche mais finalement je ne suis pas sûr.

Par exemple :

* une recherche sur "pc" me donne un résultat, mais une recherche sur "p" me donne l'erreur ci-dessous

* une recherche sur "bra" me donne un résultat, mais une recherche sur "br" me donne l'erreur ci-dessous

* une recherche sur "ali" me donne un résultat, mais une recherche sur "al" me donne l'erreur ci-dessous

erreur2

Si la recherche doit effectivement se faire sur trois caractères minimum, c'est un détail, ce n'est pas grave du tout, il faut juste le savoir.

Merci pour ton aide

J'ai remarqué que si le tri des commandes ne se fait pas selon la date de la plus ancienne à la plus récente, les résultats sont différents, du coup je suppose que quelque part du doit dire de prendre en résultat les informations à partir du bas du tableau, mais je ne trouve pas où dans le code, est-ce que tu peux m'expliquer stp ?

Il faut comprendre comment fonctionne l'objet "Dictionary".

dic_commandes(code_article) = .DataBodyRange.Rows(i).Value

Cette instruction pour le dictionnaire "dic_commandes" au niveau de sa clé, soit la crée (si elle n'existe pas) , soit la met à jour avec pour valeur, le contenu de la ligne commande.

Le tableau étant lu séquentiellement, c'est donc la dernière séquence de clé qui est retenue pour le contenu de la ligne de commande.

Mais pour fiabiliser ceci, il est vrai qu'il est plus prudent d'effectuer un tri préalable du tableau de la date de la plus ancienne à la plus récente. Je vais donc rajouter ce tri.

réponse à venir pour la suite.

Et pour info, tout ce qu'il faut savoir sur l'objet Dictionary

L'objet Dictionary (créé par l'instruction CreateObject("Scripting.Dictionary")) est une collection d'éléments associée à une clé unique. Cette clé est en général une chaîne ou un entier.

Si par exemple, "dico1" est un objet Dictionary,

Les méthodes (actions) possibles sont :

dic01.Add Ajoute une nouvelle paire clé/élément à l'objet

dico1.Exists Renvoie une valeur de type Boolean qui indique si une clé spécifiée existe dans l’objet .

dico1.Items Renvoie un tableau de tous les éléments de l'objet .

dico1.Keys Renvoie un tableau de toutes les clés de l'objet .

dico1.Remove Supprime la paire clé/élément spécifiée de l’objet .

dico1.RemoveAll Supprime toutes les paires clé/élément de l’objet .

Les propriétés possibles sont :

dico1.Count Renvoie le nombre de paires clé/élément dans l'objet .

dico1.Item Définit ou renvoie la valeur d’un élément de l'objet par son indice : dico1.item(i) ou dico1(i)

dico1.Key Définit ou renvoie la valeur d’un élément de l'objet par sa clé : dico1.key(clé) ou dico1(clé)

NB: A noter que si clé1 n'existe pas, l'instruction dico1(clé1) = élément1 est équivalente à l'instruction dico1.Add clé1, élément1

Bonjour,

Ajout tri tableau des commandes et correction bugs

Wow, c'est parfait !

Je vais étudier tout ça en détail pour essayer de comprendre et le transposer dans mon fichier final, et je te ferai un retour demain.

En tout cas un grand merci d'avoir pris le temps de faire ça et merci pour les explications

Bon alors j'ai réussi tant bien que mal à intégrer la macro dans mon fichier final, j'ai dû adapter le nom des tableaux et pas mal chercher dans le code pour adapter en fonction du nom des colonnes, mais dans l'ensemble ça fonctionne.

1. J'ai tout de même quelques erreurs que je ne comprends pas :

La recherche et l'affichage fonctionne bien, sauf sur plusieurs mots ou codes PS aléatoires où j'ai l'erreur suivante :

erreur3 erreur3bis

2. J'ai également un comportement bizarre au niveau de la taille de la fenêtre : lorsque je ferme la fenêtre d'affichage et que je l'ouvre à nouveau, elle rétrécit à chaque fois. Exemple :

Première ouverture :

fen1

Deuxième ouverture :

fen2

Troisième ouverture :

fen3

Quatrième ouverture :

fen4

A chaque fois je vois la fenêtre du UserForm se réduire dans Visual Basic.

3. Et dernière question, est-il possible d'afficher un pop-up lorsque la recherche ne donne aucun résultat ?

Le mieux serait que vous puissiez me fournir un extrait anonyme de votre fichier final et de me préciser sur quels mots de recherche, vous obtenez une erreur.

Voilà le fichier :

J'obtiens l'erreur par exemple sur le code (ou le début du code, par exemple "20" ou "199") dont les lignes sont en rouge dans ETAT-STOCK, mais également sur des mots ou une partie des mots tels que : mât, caisse, imprimante, store, écran, divers, balance, argent, câble, cordon, ba, ...

Certaines références n'ont pas de code proshop mais je l'avais aussi testé dans le fichier sur lequel tu as travaillé et ça ne posait pas de soucis donc je suppose que le problème ne vient pas de là.

Merci pour ton aide

Bonsoir,

Les erreurs proviennent des lignes de données de l'Etat du stock

1- #N/A = erreur de recherche de table : corrigé via ajout de la formule SIERREUR

2- présence d'un # dans les données qui perturbe le code car il utilise ce caractère comme séparateur : corrigé via l'utilisation d'un autre séparateur.

Je me doutais qu'il y avait quelque chose avec le # mais je ne savais pas que les #N/A poseraient problème.

Merci !

Est-ce que tu as aussi rencontré le problème du dimensionnement de la fenêtre de ton côté ou est-ce que ce n'est que de mon côté ?

Est-ce que tu as aussi rencontré le problème du dimensionnement de la fenêtre de ton côté

Après avoir ouvert et fermé le UserForm plusieurs fois, Non.

Après plusieurs tests j'ai remarqué que ce comportement ne se produit que lorsque j'ai la fenêtre Visual Basic ouverte, mais si elle est fermée, le problème ne se reproduit pas. Au final, ce n'est pas un vrai problème.

Je te remercie énormément pour le temps que tu m'as accordé et l'aide que tu m'as apportée sur ce sujet !

Merci aussi pour tes explications, ça m'a aussi permis d'en apprendre un peu plus sur le VBA même si le sujet est très très vaste et encore très complexe pour moi.

Bonne journée !

Rechercher des sujets similaires à "recherche donnees affichage tableau userform"