[VB excel] fonction recherche et combobox

Résolu
DunKaNMLNJ Messages postés 12 Statut Membre -  
DunKaNMLNJ Messages postés 12 Statut Membre -
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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  2. DunKaNMLNJ Messages postés 12 Statut Membre
     
    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
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Avec selection = combobox1 tu as la valeur.
    Avec selection = combobox1.listindex tu as la position qui commence à zéro.
    0
  4. DunKaNMLNJ Messages postés 12 Statut Membre
     
    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