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.
....... 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
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.
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" <no-spam-ticker.alpha@wanadoo.fr> wrote in message
news:eU7leEwmDHA.3700@TK2MSFTNGP11.phx.gbl...
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.
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.
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.
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" <prenom.maher@bigfoot.inutil.com> a écrit dans le message de
news: #pmoRmwmDHA.2404@TK2MSFTNGP12.phx.gbl...
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" <no-spam-ticker.alpha@wanadoo.fr> wrote in message
news:eU7leEwmDHA.3700@TK2MSFTNGP11.phx.gbl...
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.
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.
AV
utilisant les recherches dichotomiques (tm AV) ;-)
Ou manichéennes..c'est selon ! ;-)
AV
utilisant les recherches dichotomiques (tm AV) ;-)
utilisant les recherches dichotomiques (tm AV) ;-)
Ou manichéennes..c'est selon ! ;-)
AV
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.
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" <no-spam-ticker.alpha@wanadoo.fr> a écrit dans le message de
news:eU7leEwmDHA.3700@TK2MSFTNGP11.phx.gbl...
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.
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.
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.
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.
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.