[VB excel] fonction recherche et combobox

Résolu/Fermé
DunKaNMLNJ Messages postés 12 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 3 mars 2009 - 9 juin 2008 à 08:28
DunKaNMLNJ Messages postés 12 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 3 mars 2009 - 9 juin 2008 à 15:37
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 -_-
A voir également:

4 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
9 juin 2008 à 10:23
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
DunKaNMLNJ Messages postés 12 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 3 mars 2009
9 juin 2008 à 11:03
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
9 juin 2008 à 12:21
bonjour

Avec selection = combobox1 tu as la valeur.
Avec selection = combobox1.listindex tu as la position qui commence à zéro.
0
DunKaNMLNJ Messages postés 12 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 3 mars 2009
9 juin 2008 à 15:37
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