Fonction rechercher sous vba avec Excel 2007

Nikky 74 Messages postés 44 Statut Membre -  
 ManubL -
Bonjour à vous.

Je débute en VBA et je suis en train de faire une application sur Excel pour faire de la gestion des stocks et un fichiers clientèle.

Je commence par programmer l'insertion, modification, suppression de mes fiches clientes mais aussi de la recherche par nom.

Donc dans mon code, j'ai réussi à faire s'afficher les informations que je voulais en tapant un nom seulement j'ai deux soucis :

- Si j'ai deux fois ou plus le même nom, il ne me recherche que le premier et comme je sais déjà par avance que certaines personnes ont le même nom, il faut pouvoir avoir une liste de choix. Voici mon code pour valider la recherche :

Private Sub Rechercher_Click()

Dim plge As Range
Set plge = Sheets("Clientes").Range("A2:A" & Range("A65536").End(xlUp).Row).Find(Nom.Value)
    If Not plge Is Nothing Then
    Prénom = plge.Offset(0, 1).Value
    Datedenaissance = plge.Offset(0, 2).Value
    Numérocliente = plge.Offset(0, 3).Value
    Adresse = plge.Offset(0, 4).Value
    Codepostal = plge.Offset(0, 5).Value
    Ville = plge.Offset(0, 6).Value
    Pays = plge.Offset(0, 7).Value
    Téléphone = plge.Offset(0, 8).Value
    Portable = plge.Offset(0, 9).Value
    Email = plge.Offset(0, 10).Value
    Fournisseuraccès = plge.Offset(0, 11).Value
    Typedepeau = plge.Offset(0, 12).Value
    Taille = plge.Offset(0, 13).Value
    Poids = plge.Offset(0, 14).Value
    Commentaires = plge.Offset(0, 15).Value
    Else
    MsgBox "N'éxiste pas"
    Call Efface_Tout
    End If

End Sub


Et mon deuxième soucis, je voudrais que, toujours à la recherche de mes noms, que si je tape un numéro de cliente, les infos s'affiche aussi. Donc j'ai essayer de réinsérer le même code en modifiant mes champs mais il m'a fait un bug ! Donc si vous savez comment je peux présenter ça,je suis preuneuse.

Voici un imprim écran de mon userform qui devra effectuer les recherches :

http://img170.imageshack.us/img170/9126/sanstitre1qy9.jpg

Merci d'avance pour votre aide ^^
--
Petite étudiante deviendra grande... Nikky informaticienne... Qui l'eu crû, l'eu cuit
La tête  dans le chariot, le coeur dans la roulotte  
Configuration: Windows Vista
Internet Explorer 7.0

13 réponses

  1. amigo
     
    bonjour

    Je me suis souvenu que j'avais déjà eu à programmer un cas similaire voici comment:
    Faire une recherche dans la colonne Nom et memoriser l'emplacement ou se trouvent les noms recherchés.
    On peut entrer seulement quelques caractères du début, pratique si on ne se souvient plus de l'orthographe exacte.

    pour ça, ajoute à ta feuille une ListBox là ou il y a de la place ou juste en dessous du champ nom.
    c'est sans importance car tu lui donne la propriété Visible=False, donc elle ne s'affichera pas à l'execution.

    Si plus d'un nom est trouvé, la listbox est affichée, fait un double_clic sur le nom choisi, la listbox disparait.

    Colle dans le code de ta feuille ce qui suit , et adapte le à ton cas.
    '*****************************************************
    'bouton Rechercher
    Private Sub Rechercher_Click()
    Dim l1 As Integer, l2 As Integer, ltxt0 As Integer
    Dim i As Integer, txt0 As String, txt1 As String

    'effacer la listbox
    ListBox1.Clear

    'lire le champ nom
    'adapter TextBox1.Text d'aprés ta Form
    'tu peut entrer un nom partiel
    'Ex: pour "dup" on recupere "DUPONT" "DUPIUS" "DUPALAIS"..
    txt0 = TextBox1.Text
    'longueur de la chaine à comparer
    ltxt0 = Len(txt0)
    'si la chaine est vide on ne fait rien
    If ltxt0 = 0 Then Exit Sub

    'on commence la recherche
    'l1 est le numéro de la ligne ou commence la recherche
    'si l1 est connue remplacer par sa valeur
    'l1=1 'par exemple
    l1 = ActiveCell.Row

    'on regarde ou se trouve la dernière ligne du taleau
    'si l2 est connue remplacer par sa valeur
    'l2=254 'par exemple
    ActiveCell.SpecialCells(xlLastCell).Select
    l2 = ActiveCell.Row

    'revient en haut du tableau
    Range("A1").Select

    'de la première à la dernière ligne
    'on suppose que les noms sont dans la colonne 1
    'sinon ajuster Celles(i,..)
    For i = l1 To l2
    'placer le contenu de la cellule dans txt1
    txt1 = Cells(i, 1).Text
    'comparer en majuscules avec le nom cherché
    If UCase(Left(txt1, ltxt0)) = UCase(txt0) Then
    'si c'est bon on l'ajoute a la ListBox1
    'je conserve en préfixe la valeur de la ligne ou il se trouve
    ListBox1.AddItem (Str(i) & " : " & txt1)
    End If
    Next

    'on regarde le contenu de ListBox1
    Select Case ListBox1.ListCount
    Case 0 ' vide
    MsgBox "N'éxiste pas"

    Case 1 ' un seul correspond
    'lire l'enregistrement 0
    txt1 = ListBox1.List(0)
    'recuperer la n° de la ligne ou se trouve le nom dans le tableau
    'c'est le préfixe que j'ai conservé plus haut
    i = Val(txt1)
    'lire les valeur de la ligne du taleau (Nom,Prenom...)
    'pour tester j'ai juste affiché les valeurs
    'remplace ces deux lignes par ton propre code
    txt1 = Cells(i, 1).Text & "," & Cells(i, 2).Text
    MsgBox txt1
    '
    '
    Case Else 'sinom montre la listbox pour faire un choix
    ListBox1.Visible = True
    End Select
    End Sub

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim lig As Integer, ind As Integer
    Dim txt As String
    'indice du choix
    ind = ListBox1.ListIndex
    'texte choisi
    txt = ListBox1.List(ind)
    'recuperer la n° de la ligne ou se trouve le nom dans le tableau
    'c'est le préfixe que j'ai conservé plus haut
    lig = Val(txt)
    'faire disparaire la listbox
    ListBox1.Visible = False
    'lire les valeur de la ligne du taleau (Nom,Prenom...)
    'pour tester j'ai juste affiché les valeurs
    'remplace ces deux lignes par ton propre code
    txt = Cells(lig, 1).Text & "," & Cells(lig, 2).Text
    MsgBox txt
    End Sub
    '*****************************************************

    Voilà, j'espère que ça pourra te servir.
    Salut Nikki74
    0
  2. Nikky 74 Messages postés 44 Statut Membre
     
    Bonsoir et merci pour ta réponse. Je test demain et je te dit si ça à marcher ou non. Merci beaucoup
    0
  3. Nikky 74 Messages postés 44 Statut Membre
     
    Bonsoir à tous. Alors voilà, j'ai essayé d'adapter mon code mais je n'ai pas réussi :s Je ne savais pas trop où insérer quoi ! Donc au final ça me marquait toujours "n'éxiste pas" ! Pas facile de débuter dans la vie :(
    0
  4. amigo
     
    Bonjour,

    Peux - tu me poster la macro qui rempli ta userform, c'est-à-dire qui rempli toutes les textbox sur ta userform?
    Avec ça je devrai pouvoir adapter la macro Rechercher_Click().

    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Nikky 74 Messages postés 44 Statut Membre
     
    Voici tous le code de mon bouton valider :

    Private Sub Quitter_Click()
    Dim Q As Integer
    Q = MsgBox("Voulez-vous quitter ?", vbYesNo + vbQuestion)
    If Q = 7 Then Exit Sub
    If Q = 6 Then
    Unload Me
    End If
    End Sub
    
    Private Sub UserForm_Initialize()
    
    With Pays
    .AddItem "SUISSE"
    .AddItem "RUSSIE"
    .AddItem "ITALIE"
    .AddItem "IRLANDE"
    .AddItem "HOLLANDE"
    .AddItem "FRANCE"
    .AddItem "DANEMARK"
    .AddItem "BELGIQUE"
    .AddItem "ALLEMAGNE"
    
    End With
    
    With Typedepeau
    .AddItem "Normal"
    .AddItem "Grasse"
    .AddItem "Sèche"
    .AddItem "Acnéique"
    .AddItem "Sensible"
    End With
    
    With Fournisseuraccès
    .AddItem "wanadoo.fr"
    .AddItem "orange.fr"
    .AddItem "hotmail.fr"
    .AddItem "hotmail.com"
    .AddItem "yahoo.fr"
    .AddItem "bluewin.fr"
    End With
    
    End Sub
    
    Private Sub Valider_Click()
    
    Dim Z As Integer
    Z = Sheets("Clientes").Range("A65536").End(xlUp).Row + 1
        If Me.Nom.Value = "" Then
            MsgBox "Il faut au moins mettre le nom !", vbCritical + vbOKOnly
        Exit Sub
        End If
            Sheets("Clientes").Range("A" & Z).Value = Nom.Value
            Sheets("Clientes").Range("B" & Z).Value = Prénom.Value
            Sheets("Clientes").Range("C" & Z).Value = Datedenaissance.Value
            Sheets("Clientes").Range("D" & Z).Value = Numérocliente.Value
            Sheets("Clientes").Range("E" & Z).Value = Adresse.Value
            Sheets("Clientes").Range("F" & Z).Value = Codepostal.Value
            Sheets("Clientes").Range("G" & Z).Value = Ville.Value
            Sheets("Clientes").Range("H" & Z).Value = Pays.Value
            Sheets("Clientes").Range("I" & Z).Value = Téléphone.Value
            Sheets("Clientes").Range("J" & Z).Value = Portable.Value
            Sheets("Clientes").Range("K" & Z).Value = Email.Value
            Sheets("Clientes").Range("L" & Z).Value = Fournisseuraccès.Value
            Sheets("Clientes").Range("M" & Z).Value = Typedepeau.Value
            Sheets("Clientes").Range("N" & Z).Value = Taille.Value
            Sheets("Clientes").Range("O" & Z).Value = Poids.Value
            Sheets("Clientes").Range("P" & Z).Value = Commentaires.Value
            MsgBox "Fiche rajoutée !", vbInformation + vbOKOnly
        Call Efface_Tout
    End Sub
    
    Sub Efface_Tout()
    Dim ctl As Control
        For Each ctl In NouvelleCliente.Controls
        If TypeName(ctl) = "TextBox" Then ctl.Value = ""
        If TypeName(ctl) = "ComboBox" Then ctl.Value = ""
        Next ctl
    End Sub


    Et sinon, pendant que j'ai un sujet ouvert, autant poser ma question ici ^^

    Quand je vais rajouter mes produits à vendre, il y a des textbox qui doivent recevoir le prix unitaire et la tva. Y'a t'il un moyen pour que le montant ttc apparaisse automatiquement. En fait, faire une compil de vba et de formules excel.

    Merci pour la réponse.
    0
  7. amigo
     
    Bonsoir, Nikky 74

    Je crois que j'ai réussi à adapter la macro Rechercher() à ton cas.

    Comment ça marche:
    - Saisir un Nom dans le champ Nom (meme un nom partiel)
    -lancer la recerche
    -si aucun nom -> Message
    -si 1 nom -> affichage immediat
    -Si plus d'un nom -> Afficher listBox double clic sur choix
    -si aucun ne convient double clic sur Fermer liste

    '--------------------------------------------------------------------------
    'bouton Rechercher
    Private Sub Rechercher_Click()
    Dim l1 As Integer, l2 As Integer, ltxt0 As Integer
    Dim i As Integer, txt0 As String, txt1 As String

    'effacer la listbox
    ListBox1.Clear

    'lire le champ nom
    'adapter TextBox1.Text d'aprés ta Form
    'tu peut entrer un nom partiel
    'Ex: pour "dup" on recupere "DUPONT" "DUPIUS" "DUPALAIS"..
    txt0 = Nom.Text

    'longueur de la chaine à comparer
    ltxt0 = Len(txt0)
    'si la chaine est vide on ne fait rien
    If ltxt0 = 0 Then Exit Sub

    'on commence la recherche
    Sheets("Clientes").Select
    'l1 est le numéro de la ligne ou commence la recherche
    l1 = 2 'par exemple

    'on regarde ou se trouve la dernière ligne du taleau
    ActiveCell.SpecialCells(xlLastCell).Select
    l2 = ActiveCell.Row

    'revient en haut du tableau
    Range("A2").Select

    'de la première à la dernière ligne
    For i = l1 To l2
    'placer le contenu de la cellule dans txt1
    txt1 = Sheets("Clientes").Cells(i, 1).Text
    'comparer en majuscules avec le nom cherché
    If UCase(Left(txt1, ltxt0)) = UCase(txt0) Then
    'si c'est bon on l'ajoute a la ListBox1
    'je conserve en préfixe la valeur de la ligne ou il se trouve
    txt1= txt1 & " " & Sheets("Clientes").Cells(i,2).Text ' on accole le prénom
    ListBox1.AddItem (Str(i) & " : " & txt1)
    End If
    Next

    'on regarde le contenu de ListBox1
    Select Case ListBox1.ListCount
    Case 0 ' vide
    MsgBox "N'éxiste pas"

    Case 1 ' un seul correspond
    'lire l'enregistrement 0
    txt1 = ListBox1.List(0)
    'recuperer la n° de la ligne ou se trouve le nom dans le tableau
    'c'est le préfixe que j'ai conservé plus haut
    i = Val(txt1)
    'lire les valeur de la ligne du taleau (Nom,Prenom...)
    Nom.Value = Sheets("Clientes").Range("A" & i).Value
    Prénom.Value = Sheets("Clientes").Range("B" & i).Value
    Datedenaissance.Value = Sheets("Clientes").Range("C" & i).Value
    Numérocliente.Value = Sheets("Clientes").Range("D" & i).Value
    Adresse.Value = Sheets("Clientes").Range("E" & i).Value
    Codepostal.Value = Sheets("Clientes").Range("F" & i).Value
    Ville.Value = Sheets("Clientes").Range("G" & i).Value
    Pays.Value = Sheets("Clientes").Range("H" & i).Value
    Téléphone.Value = Sheets("Clientes").Range("I" & i).Value
    Portable.Value = Sheets("Clientes").Range("J" & i).Value
    Email.Value = Sheets("Clientes").Range("K" & i).Value
    Fournisseuraccès.Value = Sheets("Clientes").Range("L" & i).Value
    Typedepeau.Value = Sheets("Clientes").Range("M" & i).Value
    Taille.Value = Sheets("Clientes").Range("N" & i).Value
    Poids.Value = Sheets("Clientes").Range("O" & i).Value
    Commentaires.ValueCase = Sheets("Clientes").Range("P" & i).Value

    Case Else 'sinom montre la listbox pour faire un choix
    ListBox1.AddItem (" 0 : Fermer la liste")
    ListBox1.Visible = True

    End Select

    End Sub

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Integer, ind As Integer
    Dim txt As String
    'indice du choix
    ind = ListBox1.ListIndex
    'texte choisi
    txt = ListBox1.List(ind)
    'recuperer la n° de la ligne ou se trouve le nom dans le tableau
    'c'est le préfixe que j'ai conservé plus haut
    i = Val(txt)
    'faire disparaire la listbox
    ListBox1.Visible = False
    'lire les valeur de la ligne du taleau (Nom,Prenom...)
    Nom.Value = Sheets("Clientes").Range("A" & i).Value
    Prénom.Value = Sheets("Clientes").Range("B" & i).Value
    Datedenaissance.Value = Sheets("Clientes").Range("C" & i).Value
    Numérocliente.Value = Sheets("Clientes").Range("D" & i).Value
    Adresse.Value = Sheets("Clientes").Range("E" & i).Value
    Codepostal.Value = Sheets("Clientes").Range("F" & i).Value
    Ville.Value = Sheets("Clientes").Range("G" & i).Value
    Pays.Value = Sheets("Clientes").Range("H" & i).Value
    Téléphone.Value = Sheets("Clientes").Range("I" & i).Value
    Portable.Value = Sheets("Clientes").Range("J" & i).Value
    Email.Value = Sheets("Clientes").Range("K" & i).Value
    Fournisseuraccès.Value = Sheets("Clientes").Range("L" & i).Value
    Typedepeau.Value = Sheets("Clientes").Range("M" & i).Value
    Taille.Value = Sheets("Clientes").Range("N" & i).Value
    Poids.Value = Sheets("Clientes").Range("O" & i).Value
    Commentaires.ValueCase = Sheets("Clientes").Range("P" & i).Value
    End Sub

    J'ai testé chez moi et ça fonctionne

    Pour ta deuxième question, on peut invoquer l'évènement Enter pour faire une action quand on tape sur Entrer.
    Bonne soirée.
    0
  8. Nikky 74 Messages postés 44 Statut Membre
     
    Ca marche ! Merci, merci infiniment ! Tu sais pas l'épine du pied que tu m'enlève, un grand soulagement ! Y'a juste un tout petit détail, quand je regarde la liste dans la liste box, à la fin des choix, il y a 0=effacer la liste. Quand je double clic dessus, ça me met une erreur. Quelle ligne de code je doit enlever pour supprimer ce choix ? Il ne me servira pas trop ! Si on peut pas, c'est pas grave ! Merci encore !

    Et pour ma deuxième question, en fait, c'est un peu complexe. Je pense que c'est faisable mais je sais pas trop par ou commencer ! Je te fais quelque imprim écran pour te montrer ce que j'aimerais !

    http://img517.imageshack.us/img517/2792/ficheproduitbq9.png

    Donc voici ce que j'aimerais faire :

    En noir ~> C'est nous qui entrons le montant correspondant

    En rouge ~> Je l'insererai dans la racine de ma textbox seulement, il ne faut pas qu'il puisse être modifié ! Je préfererai l'insérer en textbox plutôt qu'en label pour la présentation ! La fille pas chiante !

    En bleu ~> C'est ce qui est censé être calculé automatiquement ! Dans le prix d'achat ttc, c'est prix de vente par la tva ! Prix de vente ht, c'est prix d'achat ht multiplié par le coeff et ensuite le prix de vente ht par la tva pour nous donner le prix de vente ttc.

    Est ce que tu voit un peu ce que je veux faire ? Parce que je ne voudrais pas insérer à chaque fois les formules dans ma feuille excel car après je risque de ne plus m'y retrouver entre formule et vba !

    Voilà à peu près ! Merci encore pour ta réponse, merci pour tout.

    Nikky
    0
  9. amigo
     
    Bonsoir,

    Au départ je pensais pouvoir cacher la listbox en appuyant sur la touche Esc mais ça me faisait aussi une erreur à l'execution . Alors j'ai pensé à cette astuce, avec Excel2003 je n'ai pas de problème.

    La ligne à modifier se trouve dans la macro Rechercher_Click()

    Case Else 'sinom montre la listbox pour faire un choix
    '------>ListBox1.AddItem (" 0 : Fermer la liste")
    ListBox1.Visible = True
    Tu la met en commentaire comme e l'ai fait ci dessus ou bien tu la supprime.

    Puis dans la macro ListBox1_DblClick() tu met en commentaire ou tu supprime la ligne

    '---->If i = 0 Then Exit Sub 'cette ligne ne sert plus à rien.

    Pour ce qui est de ta fiche Produits, les controles textbox qui ne doivent pas etre modifies doivent avoir la propiété Locked=True. Ainsi l'utilisateur ne peut pas en modifier le contenu.

    Enfin pour calculerautomatiquemen les PrixAchatTTC, PrixVenteHT, PrixVenteTTC colle cette procedure dans le code du formulaire Fiche Produits

    '--------------------------------------------------
    Private Sub Nom_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim pa_ht As Double, pa_ttc As Double, coef As Double
    Dim pv_ht As Double, pv_ttc As Double
    Dim tva_A As Double, tva_V As Double

    If KeyCode = 13 Then
    'Changer PrixAchatHT par le nom du cotrole correspondant
    pa_ht = Val(PrixAchatHT.Text)
    'Changer Coeff par le nom du cotrole correspondant
    coef = Val(Coeff.Text)
    'Changer TVA_Achat par le nom du cotrole correspondant
    tva_A = Val(TVA_Achat.Text) / 100
    'Changer TVA_Vente par le nom du cotrole correspondant
    tva_V = Val(TVA_TVA_Vente.Text) / 100
    'Changer PrixAchatTTC par le nom du cotrole correspondant
    pa_ttc = pa_ht + (pa_ht * tva_A)
    PrixAchatTTC.Text = Str(pa_ttc) & " CHF"
    'Changer PrixVenteHT par le nom du cotrole correspondant
    pv_ht = pa_ht + (pa_ht * coef)
    PrixVenteHT.Text = Str(pv_ht) & " CHF"
    'Changer PrixVenteTTC par le nom du cotrole correspondant
    pv_ttc = pv_ht + (pv_ht * tva_V)
    PrixVenteTTC.Text = Str(pv_ttc) & " CHF"
    End If

    End Sub

    Pour les nom des controles textbox j'ai inventé, à toi de les mettre en concordance.

    Bonne soirée et à bientot.
    0
  10. amigo
     
    PS: Il faut appuyer sur la touche Enter pour faire les calculs et mettre à jour les champs
    Attention au point décimal, ça dépend des paramètres régionaux que tu peux régler dans le panneau de configuration de Windows. Faire des essais pour voir.

    A+
    0
  11. Nikky 74 Messages postés 44 Statut Membre
     
    Merci pour tout ! Je vais tester tout ça. Pour la listbox, c'est pas trop important pour le moment ! Je vais d'abord essayer pour mes prix d'achat et compagnie !

    Merci vraiment pour l'aide que tu m'apporte !
    0
  12. amigo
     
    Encore une chose, tant que j'y pense, le nom de la procedure n'est pas coorect.

    Il faut lui donner le nom du controle PrixAchatHT_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Courage.
    0
  13. Nikky 74 Messages postés 44 Statut Membre
     
    Bonjour à tous. Je me permet de remonter ce sujet afin de ne pas en refaire un puisque mon problème concerne un peut tout ça... En fait, j'en reviens à mes fonctions rechercher.

    Mon code marche très bien, sans soucis ! Seulement, afin de voir les produits que mes clientes on acheté, j'ai fait ma fiche avec trois onglets... Un pour les renseignements généraux, un pour les soins effectués et un pour les produits acheté. J'aimerais que quand je recherche une cliente, on puisse voir aussi les produits et soins achetés.

    Et ensuite, toujours pour mes formules de calcul de tva, je n'ai pas réussi... Et comme je suis partie sur mes autres userforms, je ne suis plus revenu dessus depuis un moment. Mais je vais devoir m'y repencher.

    Merci d'avance pour l'aide que vous pourrez m'apportez...
    0
  14. Nikky 74 Messages postés 44 Statut Membre
     
    S'il vous plaît :(

    Et pour mes formules de calcul, j'y arrive mais deux soucis. Le premier est qu'il me met un seul chiffre après la virgule alors que j'en veux deux. Et ensuite, il me ait un très grand arrondi. Par exemple pour un produit à 20 CHF il me met une tva de 1,4 CHF (je ne sais pas la suite du chiffre) au lieu de 1,52 CHF.

    Merci à ceux qui pourront m'aider, c'est vraiment important pour moi et pour le travail de ma mère.

    Merci...
    0
    1. ManubL
       
      salut, pourrais tu m envoyer ton projet une fois terminé, je suis debutant et j aimerais voir et comprendre ton projet car dans mon ca pourrait m aider pour faire un projet d enregistrement de personne et passage horaire
      merci
      bonne journée
      0