Création de champs de recherche et validation de la recherche

Bonjour,

Je rencontre un problème de programmation sur VBA, je souhaiterai effectuer quelque chose de similaire au sujet présent sur le site "Créer un champ de recherche", sauf que, la liste de donné qui m'intéresse ne se trouve pas sur la même feuille que celle sur laquelle je souhaiterai l'afficher, les données sont étalés sur plusieurs colonnes et pour finir je souhaiterai effectuer cette zone de recherche sur plusieurs lignes pour pouvoir à chacune de mes recherches valider le contenu se trouvant à l'intérieur et le laissé affiché tel quel.

Pour être peut être plus clair ma demande concerne un fichier pour de chiffrage.

Avec la désignation, les quantité, temps, etc.

J'aimerai afficher les différentes tâches sur ma mise en page de devis en recherchant la tâche sur une liste présente dans une autre page du fichier.

Ma demande est-elle possible à mettre en place ?

Merci de votre réponse.

Cordialement,

Clément

Bonjour,

Sincèrement j'ai envie de t'aider mais je comprends pas. Si tu pouvais joindre un fichier à ta demande.

Mdr d'accord je vais essayé.

En gros le fichier ci-joint comprends 2 pages, une contenant ma mise en page de devis et l'autre une liste très important de tâches avec des coûts.

Ce que je souhaiterai faire:

Quand je suis sur la première page, j'aimerai que qu'en je tape carottage dans sur une ligne de "désignation de mes travaux" cela me propose l'ensemble de la liste des tâches présentent sur ma deuxième page et contenant ce mot, je voudrais ensuite pouvoir valider la tâche que je souhaite, que celle-ci reste afficher sur la ligne en question et que du coup ça reporte le "prix unitaire totale ht" de la tâche en question

dans ma colonne "P.U." de ma page devis.

Cela est-il plus clair ? =:

24forum.xlsm (62.21 Ko)

dont acte : up !

?? Pourqoi ?

dont acte : up !

je n'ai pas compris quel est le problème ?

le message up sert à relancer le fil

tu veux faire un progiciel de devisage

étant donné que tu débutes en Excel (ça se lit sur ton fichier) et en VBA, je te propose de faire simple

  • ne pas te lancer dans VBA tout de suite
  • saisir tes données par simple copier/coller au clavier/souris depuis la feuille des descriptifs et prix standards vers le devis

dans 1 mois, on verra comment aller plus vite avec des RECHERCHEV

d'ici là, apprends les RECHERCHEV

si tu fais plus de 5 devis/jour, passe à un vrai progiciel, fiable, sécurisé (on fait vite des co...ries avec des centaines de lignes à copier)

nota : JAMAIS de cellules fusionnées dans Excel, problèmes en vue. Pour les formules et pour VBA

mise en forme grâce à "aligner sur colonnes"

nota 2 ; ici tu trouveras toujours de l'aide pour que tu fasses de bons classeurs Excel, plutôt simples et faciles.

et des complexes aussi, quand tu maîtriseras plus

le message up sert à relancer le fil

tu veux faire un progiciel de devisage

étant donné que tu débutes en Excel (ça se lit sur ton fichier) et en VBA, je te propose de faire simple

  • ne pas te lancer dans VBA tout de suite
  • saisir tes données par simple copier/coller au clavier/souris depuis la feuille des descriptifs et prix standards vers le devis

dans 1 mois, on verra comment aller plus vite avec des RECHERCHEV

d'ici là, apprends les RECHERCHEV

si tu fais plus de 5 devis/jour, passe à un vrai progiciel, fiable, sécurisé (on fait vite des co...ries avec des centaines de lignes à copier)

nota : JAMAIS de cellules fusionnées dans Excel, problèmes en vue. Pour les formules et pour VBA

mise en forme grâce à "aligner sur colonnes"

nota 2 ; ici tu trouveras toujours de l'aide pour que tu fasses de bons classeurs Excel, plutôt simples et faciles.

et des complexes aussi, quand tu maîtriseras plus

Merci pour ta réponse. =)

J'ai effectivement partagé un fichier un peu sommaire du fait que les données sur mon fichier de base ne puisse pas être rendu public, je te confirme également que je débute sur vba ... ^^

Après j'aurais quand même besoin d'effectuer cette programmation avant la fin de la période de 1 mois que tu m'annonces étant donné que j'aimerai mettre ce document dans un rapport dans le cadre de mes études...

Pourrais-tu quand même jeter un coup d'oeil au vba que j'ai commencé stp

Private Sub TextBox1_Change()

Application.ScreenUpdating = False

Sheets("BPU").Activate

Range("D12:D443").Interior.ColorIndex = 2

ListBox1.Clear

If TextBox1 <> "" Then

For ligne = 12 To 443

Sheets("DEVIS").Activate

If Cells(ligne, 1) Like "*" & TextBox1 & "*" Then

Cells(ligne, 1).Interior.ColorIndex = 43

ListBox1.AddItem Cells(ligne, 1)

End If

Next

End If

End Sub

Merci.

re

je n'ai jamais rien fait en macro, depuis 25 ans que je fais des dév professionnels sur tableur(s) !

donc pour ton code, je ne peux pas t'aider

connais-tu RECHERCHEV ?

puissant et assez facile

permet de récupérer des données d'un Tableau dans un autre

Bonjour, Salut jmd !

Je le dis tout de suite, ta méthode me paraît insuffisamment réfléchie et cela ressemble plus pour le moment à du bricolage qu'à la construction d'une application dont la conception a été pensée de bout en bout...

La conception de ta feuille BPU risque fort de te poser des problèmes ultérieurement. Elle n'y est en tout cas pas spécialement adpatée au mode de recherche que tu y utilises...

J'interviens pour la révision de ta macro, afin de t'indiquer ce qu'il y a lieu de toujours faire et ce qu'il y a lieu de toujours éviter lorsqu'on se risque à écrire du code, plus quelques autres éléments nécessaires pour un code qui non seulement fonctionne (le fait qu'un code fonctionne n'empêche pas qu'il puisse être particulièrement mauvais ! ) mais le fasse efficacement, rapidement et de la façon la plus optimale possible...

Même si cette méthode est plutôt batarde telle qu'appliquée dans ton fichier, elle peut être utilisable à d'autres fins, et cela n'empêche pas d'écrire la macro dans un code correct.

1) Tu dois être conscient qu'en programmant une procédure de type TextBox_Change, tu programmes une procédure d'évènement, soit une procédure destinée à s'exécuter automatiquement chaque fois que l'évènement survient.

L'évènement concernant un objet (TextBox) inséré dans une feuille de calcul, la procédure se trouve dans le module de document dédié à cette feuille. Ce module est un module spécifique, privé, principalement destiné à accueillir ce type de procédure qui ne pourra jamais fonctionner dans un autre module...

S'agissant d'un évènement Change, relatif à une TextBox, l'évènement apparaît dès lors qu'un changement intervient dans la valeur de la TextBox, et tu dois savoir qu'il intervient à chaque caractère que tu taperas dans la TextBox.

Il eut été préférable de ne le déclencher qu'à validation de la saisie, compte tenu de ton utilisation, mais les évènements permettant de le faire ne sont pas disponibles pour une TextBox insérée dans une feuille de calcul. Tu peux attacher la macro à un bouton pour ne la lancer qu'après saisie, c'est toi qui verra à l'usage (si tu conserves ce mode de recherche... )

2) Dans une procédure, on déclare toujours les variables locales que l'on utilisera dans la procédure en tête de celle-ci :

Private Sub TextBox1_Change()
    Dim ligne As Long

C'est une discipline à acquérir si l'on veut produire un code efficace. Cette convention permet de s'y retrouver plus facilement dans le code, mais a aussi une autre raison plus essentielle, elle permet à VBA de réserver les espaces mémoire nécessaires au fonctionnement des variables, globalement, avant de passer à la lecture du code exécutable (qui produira des actions). C'est un facteur qui contribue à la rapidité d'exécution et à l'optimisation du code.

3) On n'active jamais ni ne sélectionne au cours de l'exécution ! VBA n'en a pas besoin, et cela le ralentit ! Ces opérations ne peuvent avoir de raison d'être que lorsqu'il s'agit de montrer à l'utilisateur ce qui a été fait, soit à la fin s'il y a lieu. Avant il n'a besoin de rien voir et laisse travailler VBA : ne pas afficher la feuille BPU permettra à VBA de travailler plus rapidement.

Tu pouvais donc écrire :

    Sheets("BPU").Range("D12:D443").Interior.ColorIndex = 2

sans activer...

Mais cette ligne pose quelques autres problèmes !

4) D'abord, tu y cibles une plage définie, incluant dans l'état actuel de ton fichier quelques centaines de lignes vides ! Ce n'est jamais une bonne pratique, et autant l'abandonner tout de suite !

Ta plage ayant toutes chances d'être variable, on utilise en pareil cas un nom dynamique, dont l'utilité n'est plus à démontrer, à défaut d'un tableau Excel.

nb- Mais quand je vais regarder dans ton gestionnaire de noms, j'y trouve une grande pagaille à laquelle je ne saurais trop te conseiller de mettre de l'ordre. Notamment éliminer tes noms doublons susceptibles de générer des erreurs ultérieures. Et d'éviter de nommer n'importe quoi à tort et à travers, sous peine d'avoir ensuite du mal à les gérer. Souvent un nom suffit pour accéder à n'importe quelle plage ou cellule d'une feuille, inutile donc de les multiplier inconsidérément. Il en faut parfois un peu plus pour plus de confort en utilisation manuelle, mais comme en tout, il y a lieu de faire ce qui est nécessaire à l'objectif visé, pas plus !

5) Tu colores la plage, on ne voit pas très bien pourquoi, surtout en blanc ! Il s'agit de la plage dans laquelle tu vas chercher, elle n'a besoin d'aucun traitement particulier. On va donc laisser ça de côté.

Mais il faut te faire remarquer au passage que ColorIndex réfère à une palette de 56 couleurs représentant les seules couleurs qu'Excel pouvait afficher jusqu'à Excel 2003. Depuis Excel 2007, le système de couleurs a changé et toutes les couleurs de l'espace RGB définies en 16 bits sont affichables. Il est donc devenu préférable d'utiliser Color et la fonction RGB pour définir une couleur, l'utilité de ColorIndex demeurant marginale pour éliminer une couleur ou cibler la couleur par défaut.

6) En anticipant sur la suite, tu auras besoin de ta plage de recherche, on ne va donc pas supprimer purement et simplement cette ligne, mais ajouter une variable Range pour y affecter cette plage de recherche !

Reprenons donc la macro depuis le début :

Private Sub TextBox1_Change()
    Dim ligne As Long, PlgR As Range
    With Worksheets("BPU")
        ligne = .Range("D" & .Rows.Count).End(xlUp).Row
        Set PlgR = .Range("D12:D" & ligne)
    End With
    ListBox1.Clear

On a donc ajouté une variable detype Range. On a placé la feuille BPU sous instruction With, ce qui permet de s'y référer sans avoir à le répéter dans le code (gain d'écriture). Mais surtout VBA place sa référence en mémoire pour en quelque sorte la garder sous la main et y accéder plus rapidement. Cette instruction contribue à l'accélération du code, il est donc toujours judicieux de l'utiliser lorsqu'on doit se référer plus d'une fois à un objet

A noter aussi que l'on a remplacé Sheets par Worksheets. Sheets ne fonctionne généralement que parce que la plupart des classeur que l'on utilise ne contiennent que des feuilles de calcul (Worksheets). Ceux qui l'utilisent systématiquement, sans doute pour s'économiser 4 lettres (mais qui le plus souvent truffent à côté leur code de tas d'expressions inutiles et de noms longs ) s'exposent à se demander un jour pourquoi ils ont une erreur qu'ils n'avaient pas auparavant...

7) L'objet de ta recherche consiste à trouver dans ta plage de recherche les lignes contenant l'expressions saisie dans ta TextBox, et d'ajouter cette ligne dans la ListBox.

Or, tu commençais par activer la feuille DEVIS ! Inutile, parce qu'elle est toujours active (on n'en a pas activer d'autre) et parce qu'on n'a nul besoin de l'activer pour intervenir.

NB- Au passage, dans un module d'objet (ou de document), l'objet référent auquel est dédié le Module se désigne par le mot-clé Me. Il faut l'utiliser, parce que c'est plus court, mais surtout plus clair et évite des cafouillages.

Ensuite, tu procédais à cette activation dans une boucle ! donc quelques centaines de fois ! Ouf !

Et tu faisais ta recherche dans DEVIS au lieu de BPU ! En voulant de plus colorer en vert les lignes trouvées !

Aucune chance d'en trouver, et aucune raison de colorer.

Il faut rétablir la recherche sur la plage de recherche, et se contenter d'alimenter la ListBox, comme prévu.

    If TextBox1 <> "" Then
        Application.ScreenUpdating = False
        With PlgR
            For ligne = 1 To .Rows.Count
                If .Cells(ligne, 1) Like "*" & TextBox1.Value & "*" Then
                    ListBox1.AddItem .Cells(ligne, 1)
                End If
            Next ligne
        End With
    End If
End Sub

On teste donc qu'il y a une valeur saisie dans la TextBox. A ce moment là, il convient de désactiver l'affichage car on va intervenir sur la feuille active.

On va boucle sur les lignes de la plage de recherche : on la place sous instruction With, avant la boucle, évidemment !

On teste chaque ligne avec l'expression saisie, si on la trouve on ajoute la ligne à la liste de la ListBox.

Voilà qui fournira déjà un résultat cohérent, mais pas vraiment optimal !

D'abord, tu dois savoir que par défaut les comparaisons de texte réalisées par VBA tiennent compte de la casse.

Tu tapes carottage, on ne trouveras pas Carottage !

Là tu as le choix, tapant tes expressions à chercher en minuscules de chercher sur la ligne convertie en minuscules:

    If LCase(.Cells(ligne, 1)) Like "*" & TextBox1.Value & "*" Then

Ou bien de placer en tête du module :

Option Compare Text

Option qui conduira à ce que les comparaisons se fassent en mode texte sans différencier la casse.

J'ai modifié la ligne, mais si tu choisis l'option au niveau module, il conviendra de supprimer la conversion.

En second lieu, devant sélectionner une ligne de ta ListBox ensuite, il te faudra alors la chercher pour retrouver la ligne dans BPU...

Ce que tu aurais pu éviter en définissant une ListBox à 2 colonnes, la seconde accueillant la liste de valeurs (lignes trouvées), et dans la première, masquée, tu mettais le numéro de ligne. En plaçant la propriété BoundColumn de la ListBox sur 1, la propriété Value renvoyait alors le contenu de la colonne masquée...

Un prochain exercice ! Mais digère d'abord celui-ci.

Cordialement.

re

je n'ai jamais rien fait en macro, depuis 25 ans que je fais des dév professionnels sur tableur(s) !

donc pour ton code, je ne peux pas t'aider

connais-tu RECHERCHEV ?

puissant et assez facile

permet de récupérer des données d'un Tableau dans un autre

Ok nickel j'ai réussi à faire ce que je souhaitais.

Merci. =)

Rechercher des sujets similaires à "creation champs recherche validation"