Formule VBA pour recherche via un formulaire userform

Private Sub CBRecher_Click()
If Not LDREF.Value = "" Then
Dim no_ligne As Integer
no_ligne = LDREF.ListIndex + 2
LDCiv.Value = Cells(no_ligne, 2).Value
TxPrenom.Value = Cells(no_ligne, 3).Value
TxNom.Value = Cells(no_ligne, 4).Value
TxAdr.Value = Cells(no_ligne, 5).Value
TxCP.Value = Cells(no_ligne, 6).Value
TxVille.Value = Cells(no_ligne, 7).Value
TxMel.Value = Cells(no_ligne, 8).Value
TxTel.Value = Cells(no_ligne, 9).Value
Else
End If
End Sub 

Bonjour à tous,

Je sollicite votre aide pour la création d’un formulaire de saisie en VBA via un userform.

Je n’y connais pas grand-chose. J’ai récupéré des lignes de programmation à droite à gauche, que j’ai essayé maladroitement d’adapter.

Ce que je veux faire est assez simple mais je bloque sur le CommandButton « Rechercher » (« CBRecher »).

Le but est bien entendu, via ce bouton, de faire remonter les données Excel dans le formulaire à partir d’une référence client. Ensuite, il s’agira de les modifier via ce formulaire.

Sur ce formulaire, je saisi la référence client dans une ComboBox (« LDREF »). Initialement, c’était une TextBox mais les exemples que l’ai trouvés utilisaient une ComboBox pour cette recherche.

La ligne qui pose problème est la suivante « no_ligne = LDREF.ListIndex + 2 »

Peu importe la référence renseignée, lorsque je clique sur le bouton « rechercher », les données qui remontent sont celles de l’entête du tableau.

Si je remplace « LDREF.ListIndex + 2 » par « « LDREF.ListIndex + 3 », c’est la ligne du dessous qui remonte, etc…

Quelqu’un pourrait-il m’aider pour trouver la formule qui me permettrait de faire remonter dans le formulaire les informations qui correspondent au client dont la référence est renseignée.

J’espère avoir été suffisamment clair dans l'explication de mon problème.

J’ai extrêmement simplifié mon formulaire pour cette demande d'aide. Dans le formulaire original, il y a environ 80 champs à renseigner entre les TextBox et ComboBox.

Je vous remercie par avance de votre soutien.

Bonjour

Premier point que je vois dans votre fichier.

Note : Plutot que d'utiliser Rowssource lors de l'ouverture de l'usf (évitez rowssource qui amène souvent des soucis à un moment ou un autre), mettez cette macro dans l'usf pour l'ouverture.

Private Sub UserForm_Initialize()
LDREF.List = Sheets("SOURCE").ListObjects("Source1").ListColumns(1).DataBodyRange.Value
LDCiv.List = Sheets("Listes").ListObjects("CivAs").DataBodyRange.Value
End Sub

Dans votre fichier gestionaire de noms --> Formules, j'ai renommé Source21 en Source1

Une fois fait supprimez la valeur dans Rowssource pour éviter un bug à l'ouverture

supprimé. Je te laisse la main Dan !

Hello Galopin, ok bien lu. On a dû poster ensemble...

Pour votre macro Recherche, voici le code

Private Sub CBRecher_Click()

If Not LDREF.Value = "" Then
    Dim no_ligne As Integer
    no_ligne = LDREF.ListIndex + 1
    With Sheets("SOURCE").ListObjects("Source1").DataBodyRange
        LDCiv.Value = .Item(no_ligne, 2).Value
        TxPrenom.Value = .Item(no_ligne, 3).Value
        TxNom.Value = .Item(no_ligne, 4).Value
        TxAdr.Value = .Item(no_ligne, 5).Value
        TxCP.Value = .Item(no_ligne, 6).Value
        TxVille.Value = .Item(no_ligne, 7).Value
        TxMel.Value = .Item(no_ligne, 8).Value
        TxTel.Value = .Item(no_ligne, 9).Value
    End With
End If
End Sub

Pour votre erreur, cela vient de vos références client qui montrent une erreur dans chaque cellule. Convertissez en nombre ou mettez par exemple Client1, client2

Idée. Ne serait-il pas intéressant que lorsque vous changez de ref client, toutes les textbox soient vidées automatiquement ?

Merci pour vos réponses.

Je regarde, et je vous fais un retour.

Cordialement

Désolé pour ce temps de réponse, j’ai dû traiter une urgence.

Je suis navré. Je pense avoir très mal interprété vos conseils.

Vous m’avez recommandé de mettre une macro dans l’usf pour l’ouverture.

J’ai intégré le module 1 où il y a la macro pour lancer le formulaire.

J’ai modifié Source21 en Source1 dans le gestionnaire des noms.

J’ai sur allé dans propriété de la ComboBox « LDCiv » pour retirer la valeur de la Rowssource.

J’ai remplacé mon code par le vôtre pour le CommandButton « CBRecher »

Dans mon tableur, j’ai sélectionné la colonne A « REF CLIENT », format de cellule – nombre – sans aucune décimale.

Cela n’a pas fonctionne mais j’imagine que cela ne vous étonne pas. J’ignore si cette interprétation de vos conseils, vous donne envie de rire ou de pleurer.

J'ai également essayé d'intégrer votre 1er code en haut de l'UserForm1, sans succès.

S’agissant de votre proposition, pour la référence client, de la remplacer par Client 1, Client 2, je ne peux pas l’appliquer.

La référence client est une donnée qui m’est imposée. Elle est composée, selon les cas, de 10 ou de 8 chiffres.

S’il y a une possibilité que le fait de remplir le champ "référence client" vide automatiquement les autre champs serait effectivement intéressant.

Cependant, si cela était sous entendu dans votre proposition, je pense que je dois conserver un bouton « réinitialiser » car je serait amené à enregistrer plusieurs clients à la suite.

Une autre précision, ce fichier doit contenir plusieurs centaines de clients.

Eurêka !

J'ai trouvé une solution en cliquant sur « Rechercher des sujets similaires »

Merci de vos conseils.

Merci aux administrateurs du site.

Re

Vous m’avez recommandé de mettre une macro dans l’usf pour l’ouverture. J’ai intégré le module 1 où il y a la macro pour lancer le formulaire.

Désolé je n'avais pas précisé. Il faut la mettre dans L'userform

Pour faire plus simple, prenez le fichier joint et repartez de celui là.

Dans l'attente de votre retour

En reprenant votre fichier, il ne faut pas agrandir votre tableau sans données dans la feuille Source. Comme vous travaillez en tableau structuré les lignes vont s'ajouter automatiquement.

Seul chose c'est qu'il faudra un peu changer le code d'ajout.

S’il y a une possibilité que le fait de remplir le champ "référence client" vide automatiquement les autre champs serait effectivement intéressant.

faite le test sur le fichier et si ok, je modifie pour ce point

Le code de recherche fonctionne, sauf si la référence client est exclusivement composée de chiffre.

En pratique cela ne pose pas de difficulté. Il suffit de mettre une lettre devant la référence et ca fonctionne.

En revanche, si crée un nouveau client, étonnamment il vient se placer sous le tableau existant. Une nouvelle ligne n'est pas créée dans le tableau.

Le nouveau client enregistré n'est pas accessible en faisant une recherche via le formulaire.

J'ai donc laissé une ligne vide dans le tableau. Suite à cela tous les nouveaux enregistrements ont ajouté une nouvelle ligne tableau.

Pour autant, ces nouveaux ajouts ne sont pas davantage accessible via la fonction recherche du formulaire.

Je vous remercie.

Je poursuis la déclinaison du code que j'ai trouvé sur une autre page dans mon formulaire original.

Je vous tiens informés

En revanche, si crée un nouveau client, étonnamment il vient se placer sous le tableau existant. Une nouvelle ligne n'est pas créée dans le tableau.

Oui c'est normal pour l'instant. Il faut adapter le code Creer

Le code de recherche fonctionne, sauf si la référence client est exclusivement composée de chiffre. En pratique cela ne pose pas de difficulté. Il suffit de mettre une lettre devant la référence et ca fonctionne.

C'est juste que les chiffres envoyés sur la feuille depuis l'userform sont au format Texte. Cela peut s'arranger si vous voulez conserver uniquement des chiffres. Dites moi.

Par contre j'ai pensé à une autre approche. Je vous explique ci-dessous

A l'ouverture de l'USF, le bouton Modifier est désactivé et la liste des références clients est vide

1. créer un nouveau client --> vous complétez les rubriques. Si vous cliquez sur le bouton :

  • Modifier est inactif
  • Réinitialiser : efface tout
  • Créer : pour ajouter le nouveau client
  • Rechercher : efface tout et alimente la boite réf client

2. Rechercher un client. Cliquez sur le bouton rechercher et cela alimente la boite Ref client avec les clients existants et rend les boutons Modifier Actif et Créer Inactif

3. le bouton réinitialiser remet tout à 0

Si cela ne vous convient pas, je modifie les points dont vous parlez dans la version précédente

Bonsoir,

Merci de votre réponse.

La référence client ne sera composée que de chiffre.

Il n’y a effectivement pas d’intérêt particulier à que le bouton modifier soit actif à l’ouverture de l’userform.

A y réfléchir, il serait peut-être plus logique qu’il y ait un ComboBox dédié à la recherche de façon à se que la recherche s’exerce sur le tableau et que je puisse également retrouver un client à partir de n’importe quelle info, son nom par exemple.

Merci pour le conseil pour les Rowssource.

Je vais essayer votre méthode pour intégrer des menus déroulant au ComboBox.

Bonjour,

A y réfléchir, il serait peut-être plus logique qu’il y ait un ComboBox dédié à la recherche de façon à se que la recherche s’exerce sur le tableau et que je puisse également retrouver un client à partir de n’importe quelle info, son nom par exemple.

Possible à faire mais c'est aussi un peu tout refaire. Plutot que de créer une combobox, vous pourriez aussi profiter d'une userform spécifique pour la consultation ou la recherche.

A titre d'info, regardez un peu un projet en téléchargeant le fichier que j'ai posté ici (version 2) --> https://forum.excel-pratique.com/s/goto/834954
Une fois ouvert, cliquez sur le bouton Rechercher. Dans la zone recherche, tapez une lettre pour avoir la liste. Une fois la liste montrée, un double click sur une donnée dans la liste vous renverra sur l'userfom saisie où vous avez le choix de modifier.

Votre avis ?

Bonsoir,

Le VBA est très frustrant.

Je pensais avoir trouvé une méthode que j’arriverai à appliquer à mes besoins, tout avait l’air de bien se passer, puis tout à coup tout s’est mis à dérailler sans que je ne comprenne pourquoi.

J’ai commencé à développer un formulaire. La fonction créer, réinitialiser, rechercher fonctionnent parfaitement. La fonction modifier a fonctionné jusqu’à un certain point.

Private Sub CBModif_Click()
Dim no_ligne As Integer
Sheets("SOURCE").Select
no_ligne = LDREF.ListIndex + 2
If LDREF.Value = " " Then
MsgBox (" RENSEIGNER REFERENCE ")
Else
Cells(no_ligne, 2) = LDCiv.Value 
…
End If
End Sub

J’ai ajouté des TextBox et des ComboBox. Sans que j’en trouve la raison, le CommandButton modifier modifie parfois non pas la ligne sélectionnée mais l’entête du tableau. C’est à en devenir fou.

J’avais ajouté un ComboBox pour faire la fonction recherche.

J’ai tenté votre méthode pour les associer des menus déroulant aux ComboBox. Je ne parviens pas à comprendre pourquoi je n’y arrive pas.

Le fichier en exemple est vachement sympa. Je vais essayer de comprendre comment ça marche. Je vais peut-être y trouver la solution à mon problème.

Dans le fichier original, il y a une colonne avec des dates qui est utilisée comme agenda. Pensez-vous qu’il soit possible d’intégrer dans cet userform de recherche une fonction qui permette d’afficher les clients dont la date est arrivée à échéance.

Bonjour

Le VBA est très frustrant.
Je pensais avoir trouvé une méthode que j’arriverai à appliquer à mes besoins, tout avait l’air de bien se passer, puis tout à coup tout s’est mis à dérailler sans que je ne comprenne pourquoi.
J’ai commencé à développer un formulaire. La fonction créer, réinitialiser, rechercher fonctionnent parfaitement. La fonction modifier a fonctionné jusqu’à un certain point

Le principal souci est que lorsque l'on démarre un projet, il faut mettre à plat ce que l'on souhaite avoir au final. C'est souvent là que le bas blesse et je comprends que, le cas échéant, la programmation peut devenir frustrante.

Pour ce qui est de la fonction "modifier", vous pouvez tester ce code

Private Sub CBModif_Click()
Dim no_ligne As Long

If LDREF.Value = "" Then MsgBox (" RENSEIGNER REFERENCE ")
no_ligne = LDREF.ListIndex + 1
With Sheets("SOURCE").ListObjects("Source1").DataBodyRange
    .Item(no_ligne, 2).Value = LDCiv.Value
    .Item(no_ligne, 3).Value = TxPrenom.Value
    .Item(no_ligne, 4).Value = TxNom.Value
    .Item(no_ligne, 5).Value = TxAdr.Value
    .Item(no_ligne, 6).Value = TxCP.Value
    .Item(no_ligne, 7).Value = TxVille.Value
    .Item(no_ligne, 8).Value = TxMel.Value
    .Item(no_ligne, 9).Value = TxTel.Value
End With
End Sub

Vous dites avoir ajouté des textbox et combobox ?? C'est là votre souci, vis a vis de VBA. D'abord en premier, finalisez ce que vous voulez faire. Sans quoi, vous risquez de recommencer tout chaque fois ou mettre des pastilles à droite et à gauche.

Exemple : vous voulez une userform pour créer et modifier, une userform recherche, etc....

Dans le fichier original, il y a une colonne avec des dates qui est utilisée comme agenda. Pensez-vous qu’il soit possible d’intégrer dans cet userform de recherche une fonction qui permette d’afficher les clients dont la date est arrivée à échéance.

Quand vous dites "fichier original", vous parlez de l'exemple que je vous ai donné ? Dans votre projet, on peut très bien intégrer l'userform Recherche que vous voyez dans l'exemple que je vous ai donné. Seule chose que je dois savoir, ce sont les rubriques que vous voulez mettre la liste qui découlera de la recherche

Sinon déjà comme cela, votre userform fonctionne dans les 3 cas

Bonjour

Cordialement

Je continue à avancer sur mon projet. Je vous ferai un retour lorsque je serai parvenu à une version aboutie. C'est une question de jours. Vos conseils ont été précieux. Effectivement, les rowsources mettent le bazar.

Cordialement

Merci pour votre aide et désolé pour cette réponse tardive.

Il est vrai que mon projet est parti dans tous les sens. Au fil de mes recherches et de mes découvertes, j'ai eu envie de le modifier.

Je suis parvenu à une version stable et fonctionnelle.

Je vais ajouter les autres idées dans d'autres userformes.

Merci de m'avoir indiqué que les RowSources pouvait être la source de mes problèmes. Je n'aurai pas trouvé cela seul.

Je ne comprends pas pourquoi je ne suis pas parvenu à utiliser votre code pour associer des listes à des ComboBox. J'ai donc gardé les RowSources mais j'en ai fait un usage plus modéré.

Merci pour tout

Bonjour

Je ne comprends pas pourquoi je ne suis pas parvenu à utiliser votre code pour associer des listes à des ComboBox. J'ai donc gardé les RowSources mais j'en ai fait un usage plus modéré.

Il faudrait que je vois l'état de votre projet pour vous donner des infos. Pour éviter les Rowssources, utilisez la méthode ADDITEM, cela fonctionnera toujours.

Je vais ajouter les autres idées dans d'autres userformes.

Attention qu'avec Excel on arrive vite "une usine à gaz"... donc il vaut mieux éviter trop d'userform. Le cas échéant cela part dans tous les sens et lorsque vous voulez faire évoluer votre projet, il est bien souvent utile de tout recommencer.

Si besoin d'aide dites moi

Cordialement

Rechercher des sujets similaires à "formule vba recherche via formulaire userform"