[VB excel] fonction recherche et combobox

Résolu
Salut amis et amies du codage

Si vous le voulez bien, rentrons directement dans le vif du sujet.

J'ai plusieurs feuilles de tableaux dans un fichier excel.
Ces tableaux référencent des statistiques fournisseurs. Du genre: JeanMichel a livré 3455 lignes de commandes avec un moyenne de de 6 jours de retard etc etc

J'ai créé un useform parce que je veux pouvoir rechercher un fournisseur parmi tout ce sac de noeuds (j'ai plus de 200 entrées) et q'une jolie page s'affiche pour me synthétiser les informations.

J'ai donc mit une superbe textbox dans laquelle j'inscrit le nom du routier ou le numéro de compte du fournisseur puis je clique sur un joli bouton commandbutton, la recherche se lance selon le critère de la textebox et un listing des résultats de la recherche s'affiche dans un highfrontkick combobox.

Et là bam! crochet à la machoire Erreur d'exécution '1004' La méthode active de la classe range a échoué. J'en tombe KO.

Vous l'aurez compris pour l'instant j'en suis juste à l'écriture d'une liste à l'intérieur d'une combobox

Voici mon code. Attention ça pique les yeux.

---------------------------------

'affiche le bouton de lancement de recherche quand on écrit dans la textbox
Private Sub TextBox1_Change()
ok1.Visible = True
End Sub

'Surligne le texte de la textbox au lancement du fichier. Si vous avez mieux que enter() pour que la textbox soit le premier élément actif je sui preneur
Private Sub TextBox1_enter()

TextBox1.SelStart = 0
TextBox1.SelLength = TextBox1.TextLength

End Sub

Private Sub ok1_Click()
Dim ro As Long
Dim col As Long
Dim flag As Boolean
Dim feuil As String
Dim compt As Integer

ComboBox1.Clear

feuil = "Délais demandés & AR"
ro = 0
col = 0
compt = 0

ok1.Visible = False

Do While compt < 2

flag = True

Sheets(feuil).Cells.Find(what:=TextBox1, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False).Activate


ComboBox1.AddItem ActiveCell.Value

Do While flag = True

'on enregistre les coordonnées de la cellule active
If flag = True Then
ro = ActiveCell.Row
col = ActiveCell.Column
End If

Sheets(feuil).Cells.FindNext(After:=ActiveCell).Activate

'On vérifie la présence d'un doublon
If ActiveCell.Row <> ro And ActiveCell.Column <> col Then
ComboBox1.AddItem ActiveCell.Value
End If

' Si le flag est faux, la fonction recherche a exécuté une boucle
If ActiveCell.Row = ro And ActiveCell.Column = col Then
flag = False
End If

Loop

compt = compt + 1
feuil = "Délais AR & livraison"

Loop

End Sub

----------------------------

Mon problème est que les deux commandes en gras ne fonctionnent pas. Apparemment la recherche est juste mais je ne peux pas affecter de .activate ou de .select.

Clairement j'aimerai créer une liste combobox à partir de recherches par mots clefs. Chaque item de la liste me renvoyant aux coordonnées de la cellule contenant le mot clef recherché. Ca ne doit pas être bien compliqué mais personnelement je galère -_-
Configuration: Windows XP
Internet Explorer 7.0

4 réponses

  1. Contributeur
    bonjour

    Je te propose de corriger ainsi
     ro = 1
    col = 1
    compt = 0
    ok1.Visible = False
    dim resultat as object
    Do 
    
    set resultat = Sheets(feuil).Cells.Find(what:=TextBox1,  After:=Sheets(feuil).Cells(ro,col), _
    LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= False)
    
    if resultat is nothing then exit do
    
    'On vérifie la fin de la boucle
    If resultat.Row < ro Then exit do
    If resultat.Row = ro And resultat.Column <= col Then exit do
    ComboBox1.AddItem resultat.Value
    
    ro = resultat.Row
    col = resultat.Column
    Loop 
    
    0
    1. Wahou!!! je suis très impressionné.

      Ca a l'air de fonctionner super bien.
      Franchement merci! tu me sors une grosse épine du pied.

      Je retiens tout particulièrement plusieurs astuces très intéressantes notament :

      After:=Sheets(feuil).Cells(ro, col) dans la fonction find ... Le genre de trucs qui te fait dire: "Mais pourquoi je n'y ai pas pensé ??"

      Dim as object ... je cherchai justement à définir une variable pour contenir des coordonnées. (oui je débute ^^)

      Exit do ... ça évite les sacs de noeuds sans fin

      Bien .. maintenant je vais pouvoir passer aux joies de la combobox

      (petite question au passage: comment savoir quel item sélectionne l'utilisateur?)
      0
      1. Contributeur
        bonjour

        Avec selection = combobox1 tu as la valeur.
        Avec selection = combobox1.listindex tu as la position qui commence à zéro.
        0
        1. Et hop! c'est finissssh

          pour ceux que ça pourrait aider (si vous avez envie de faire un truc similaire) voila mon code ... et une image pour y voir plus clair. http://img338.imageshack.us/img338/5325/prtscxt4.png

          --------------------------------------------------------

          Private Sub ok2_Click()

          Dim fourn1 As Object
          Dim fourn2 As Object

          Dim compte As String
          Dim fournisseur As String
          Dim commandes As Integer
          Dim ardmd As Integer
          Dim ecart As Integer
          Dim respect As String
          Dim livar As Integer
          Dim retard As Integer
          Dim livr As String
          Dim Tex As String
          Dim Texx As String
          Dim indice As Integer
          Dim facture As Integer

          UserForm1.Hide

          Set fourn1 = Sheets("Délais demandés & AR").Cells.Find(what:=ComboBox1, After:=Sheets("Délais demandés & AR").Cells(1, 1), _
          LookIn:=xlFormulas, LookAt:= _
          xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)

          Set fourn2 = Sheets("Délais AR & livraison").Cells.Find(what:=ComboBox1, After:=Sheets("Délais AR & livraison").Cells(1, 1), _
          LookIn:=xlFormulas, LookAt:= _
          xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)

          If fourn1.Column = 2 Then

          c = 0

          Else

          c = 1
          End If

          compte = fourn1.Offset(0, c - 1)
          commandes = fourn1.Offset(0, c + 1)
          fournisseur = fourn1.Offset(0, c)
          ardmd = fourn1.Offset(0, c + 2).Value * 100
          ecart = fourn1.Offset(0, c + 3)
          respect = fourn1.Offset(0, c + 4)
          livar = fourn2.Offset(0, c + 2).Value * 100
          retard = fourn2.Offset(0, c + 3)
          livr = fourn2.Offset(0, c + 4)
          indice = fourn2.Offset(0, c + 5)
          facture = fourn2.Offset(0, c + 6).Value * 100

          Tex = fournisseur & " a traité " & commandes & " lignes de commandes." & Chr(10) & Chr(10) & " Pour ces commandes, " & ardmd & "% des délais accusés en réception par le fournisseur sont égaux aux délais demandés par Solem. " & Chr(10) & " ( En moyenne, le fournisseur accuse " & ecart & " jour(s) d'écart) " & Chr(10) & " " & livar & "% des livraisons respectent les délais accusés par le fournisseur. " & Chr(10) & " ( Une moyenne de " & retard & " jour(s) de retard a été observé.) " & Chr(10) & " " & fournisseur & " respecte " & respect & " les délais demandés par Solem, à un jour près. " & Chr(10) & " Ce fournisseur livre " & livr & " dans les temps, à trois jours près." & Chr(10) & "" & Chr(10) & ""
          Texx = " L'indice de ponctualité de " & fournisseur & " est de " & indice & "." & Chr(10) & " Plus cet indice est faible, plus le retard du fournisseur est préjudiciable pour la chaîne de production." & Chr(10) & " [min 0 ; max 100] " & Chr(10) & Chr(10) & " Ce fournisseur livre, et par conséquent facture, " & facture & "% de ses livraisons le mois précédent." & Chr(10) & "" & Chr(10) & "" & Chr(10) & "" & Chr(10) & " Voulez-vous effectuer une nouvelle recherche?"

          response = MsgBox(Tex & Texx, vbYesNo, compte & " " & fournisseur)

          If response = vbYes Then

          UserForm1.Show

          End If

          End Sub

          Private Sub TextBox1_enter()

          TextBox1.SelStart = 0
          TextBox1.SelLength = TextBox1.TextLength

          End Sub

          Private Sub ok1_Click()
          Dim ro As Long
          Dim col As Long
          Dim flag As Boolean
          Dim feuil As String
          Dim compt As Integer
          Dim n As Integer
          Dim resultat As Object

          ComboBox1.Clear

          feuil = "Délais demandés & AR"

          ro = 1
          col = 1
          compt = 0

          Do While compt < 2

          Do

          Set resultat = Sheets(feuil).Cells.Find(what:=TextBox1, After:=Sheets(feuil).Cells(ro, col), _
          LookIn:=xlFormulas, LookAt:= _
          xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)

          If resultat Is Nothing Then Exit Do

          'On vérifie la fin de la boucle
          If resultat.Row < ro Then Exit Do
          If resultat.Row = ro And resultat.Column <= col Then Exit Do

          ComboBox1.AddItem resultat.Value

          ro = resultat.Row
          col = resultat.Column
          Loop

          compt = compt + 1
          feuil = "Délais AR & livraison"

          Loop

          End Sub

          ---------------------------------------------------
          0