Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Une méthode plus performante

6 réponses
Avatar
Ticker
Bonjour à tous
Voilà, je cherche une procédure plus performante pour la recherche d'un mot
dans une colonne, en effet, moi,j'utilise ceci:
________________________________
Public Sub RechercheMots()
MLigne = 1
For i = 1 To MIndex
If Cells(MLigne, MColonne) = UserFormDictionnaire.TextBoxMot.Text Then TRef
= Cells(MLigne, MColonne + 1): Trouve = 1: Exit Sub
MLigne = MLigne + 1
Next i
MsgBox ("Pas de mot trouve")
Trouve = 0
End Sub
________________________________
Sur des petites colonnes, ça va, mais sur des colonnes plus grande, c'est la
cata. Je sais que je peux utiliser quelque chose du style
"application.match", mais je n'arrive pas à la mettre en oeuvre. :o( .
Sinon, xlsearchorder, mais je n'ai pas réussi à l'utiliser, est ce une
utilisation possible ?
Merci d'avance.

6 réponses

Avatar
AV
....... Je sais que je peux utiliser quelque chose du style
"application.match", mais je n'arrive pas à la mettre en oeuvre. :o( .


Adapte ça :

Sub zzzzz()
leMot = "loulou"
If Not IsError(Application.Match(leMot, [A1:A50], 0)) Then MsgBox "trouvé" Else
MsgBox "pas trouvé"
End Sub

AV

Avatar
Daniel.M
Bonjour Ticker,

Public Sub RechercheMots2()
Dim res As Variant ' et pas un autre type
res = Application.Match(UserFormDictionnaire.TextBoxMot.Text, _
Cells(mligne, mcolonne).Resize(MIndex, 1), 0)
trouve = Not IsError(res)
If trouve Then
TRef= Cells(res,mcolonne+1)
Else
MsgBox ("Pas de mot trouvé")
End If
End Sub

Si tu ne te sers pas de Trouve plus loin tu pourrais faire l'économie de cette
variable dans ce code et tester directement IsError(res).

Si tes données sont triées avise car on peut optimiser de façon substantielle en
utilisant les recherches dichotomiques (tm AV) ;-)

Salutations,

Daniel M.

"Ticker" wrote in message
news:
Bonjour à tous
Voilà, je cherche une procédure plus performante pour la recherche d'un mot
dans une colonne, en effet, moi,j'utilise ceci:
________________________________
Public Sub RechercheMots()
MLigne = 1
For i = 1 To MIndex
If Cells(MLigne, MColonne) = UserFormDictionnaire.TextBoxMot.Text Then TRef
= Cells(MLigne, MColonne + 1): Trouve = 1: Exit Sub
MLigne = MLigne + 1
Next i
MsgBox ("Pas de mot trouve")
Trouve = 0
End Sub
________________________________
Sur des petites colonnes, ça va, mais sur des colonnes plus grande, c'est la
cata. Je sais que je peux utiliser quelque chose du style
"application.match", mais je n'arrive pas à la mettre en oeuvre. :o( .
Sinon, xlsearchorder, mais je n'ai pas réussi à l'utiliser, est ce une
utilisation possible ?
Merci d'avance.




Avatar
Ticker
Merci pour ta réponse Damiel. Pour le tri, j'en fais un, un tri par ordre
alphabétique, mais, je n'ai pas très bien compris pour la dichotomie (je
sais qe c'est "un truc" de maths mais jamais utiliser ...)


"Daniel.M" a écrit dans le message de
news: #
Bonjour Ticker,

Public Sub RechercheMots2()
Dim res As Variant ' et pas un autre type
res = Application.Match(UserFormDictionnaire.TextBoxMot.Text, _
Cells(mligne, mcolonne).Resize(MIndex, 1), 0)
trouve = Not IsError(res)
If trouve Then
TRef= Cells(res,mcolonne+1)
Else
MsgBox ("Pas de mot trouvé")
End If
End Sub

Si tu ne te sers pas de Trouve plus loin tu pourrais faire l'économie de
cette

variable dans ce code et tester directement IsError(res).

Si tes données sont triées avise car on peut optimiser de façon
substantielle en

utilisant les recherches dichotomiques (tm AV) ;-)

Salutations,

Daniel M.

"Ticker" wrote in message
news:
Bonjour à tous
Voilà, je cherche une procédure plus performante pour la recherche d'un
mot


dans une colonne, en effet, moi,j'utilise ceci:
________________________________
Public Sub RechercheMots()
MLigne = 1
For i = 1 To MIndex
If Cells(MLigne, MColonne) = UserFormDictionnaire.TextBoxMot.Text Then
TRef


= Cells(MLigne, MColonne + 1): Trouve = 1: Exit Sub
MLigne = MLigne + 1
Next i
MsgBox ("Pas de mot trouve")
Trouve = 0
End Sub
________________________________
Sur des petites colonnes, ça va, mais sur des colonnes plus grande,
c'est la


cata. Je sais que je peux utiliser quelque chose du style
"application.match", mais je n'arrive pas à la mettre en oeuvre. :o( .
Sinon, xlsearchorder, mais je n'ai pas réussi à l'utiliser, est ce une
utilisation possible ?
Merci d'avance.








Avatar
AV
utilisant les recherches dichotomiques (tm AV) ;-)


Ou manichéennes..c'est selon !
;-)

AV

Avatar
Michel Pierron
Salut Ticker;

Sub Test()
MsgBox "Mot " & IIf(Row_Find(ActiveSheet, 1, "Le mot") > 0, "", "non ") &
"trouvé !"
End Sub

Function Row_Find(oSheet As Worksheet, ByVal Col As Byte, What As Variant _
, Optional Whole As Boolean = True) As Integer
Dim Word As Range, Who As Byte
If Whole Then Who = 1 Else Who = 2
Set Word = oSheet.Columns(Col).Find(What, LookAt:=Who)
If Word Is Nothing Then Row_Find = 0 Else Row_Find = Word.Row
End Function

MP

"Ticker" a écrit dans le message de
news:
Bonjour à tous
Voilà, je cherche une procédure plus performante pour la recherche d'un
mot

dans une colonne, en effet, moi,j'utilise ceci:
________________________________
Public Sub RechercheMots()
MLigne = 1
For i = 1 To MIndex
If Cells(MLigne, MColonne) = UserFormDictionnaire.TextBoxMot.Text Then
TRef

= Cells(MLigne, MColonne + 1): Trouve = 1: Exit Sub
MLigne = MLigne + 1
Next i
MsgBox ("Pas de mot trouve")
Trouve = 0
End Sub
________________________________
Sur des petites colonnes, ça va, mais sur des colonnes plus grande, c'est
la

cata. Je sais que je peux utiliser quelque chose du style
"application.match", mais je n'arrive pas à la mettre en oeuvre. :o( .
Sinon, xlsearchorder, mais je n'ai pas réussi à l'utiliser, est ce une
utilisation possible ?
Merci d'avance.




Avatar
Daniel.M
Salut,

Merci pour ta réponse Damiel. Pour le tri, j'en fais un, un tri par ordre
alphabétique,


Si ton tri est ascendant, essaie le code suivant:

Public Sub TesteLeMot()
Dim LaLigne As Long

LaLigne = RechercheLeMot( _
UserFormDictionnaire.TextBoxMot.Text, _
ActiveSheet.Cells(mLigne, mColonne).Resize(mIndex, 1))
If LaLigne = 0 Then
MsgBox "Pas Trouvé"
Else
MsgBox "Trouvé"
End If
End Sub

Public Function RechercheLeMot(UnMot As String, _
Plage As Range) As Long ' Avec données triées ascendantes
Dim res As Variant ' et pas un autre type
res = Application.Match(UnMot, Plage, 1)
If IsError(res) Then
RechercheLeMot = 0
ElseIf Plage(res) <> UnMot Then
RechercheLeMot = 0
Else
RechercheLeMot = res
End If
End Function


Si ton tri est descendant, remplace
res = Application.Match(UnMot, Plage, 1)
par
res = Application.Match(UnMot, Plage, -1)


..., mais, je n'ai pas très bien compris pour la dichotomie


Laisse-faire, c'est un autre moyen pour AV de démarrer un nouveau club et de
percevoir des droits d'auteurs. ;-)
Plus sérieusement, il y a plusieurs types de recherches, les recherches
séquentielles cherchent un mot dans une plage en parcourant une cellule à la
suite d'une autre, i.e. en séquence (d'où le nom!).
Les recherches dichotomiques (tm, CEE Patent no AV3450767) cherchent un mot en
tirant profit de l'ordre des cellules triées. Elles vont donc à la cellule du
milieu. Si mot > grand, on sait déjà qu'on n'a pas besoin de vérifier les
cellules de la 1ère partie (puisqu'elles sont toutes plus petites que la cellule
du milieu, par définition). On évite ainsi beaucoup de comparaisons.

Salutations,

Daniel M.