equiv ou recherchev (cellules du champ de recherche comprises entre 1 et 12000car)

Ron2cuir

XLDnaute Nouveau
Bonjour,
petit nouveau XLD!
Désolé j'ai confondu discussion et conversation!!!
Ces fonctions ne prennent en compte que 256 car des cellules de champs (6000lignes).
qui a déja trouvé une solution (même avec vba) pour pallier cet inconvénient ?

Le retour doit être: numéro de ligne dans la table.
Merci de votre aide
 

job75

XLDnaute Barbatruc
Bonjour Ron2cuir, le forum,
Ce que je veux obtenir ce sont tous les numéros de ligne (limités à 300) d'une base de 6000 lignes où l'argument a été trouvé.
Eh bien on y arrive, il suffisait de le dire.

Utilisez donc cette fonction qui renvoie une matrice (vecteur colonne) :
Code:
Option Compare Text 'la casse est ignorée

Function ListeLignes(x$, R As Range, limite&)
Dim a(), P As Range, decal&, tablo, i&, n&
ReDim a(1 To limite, 1 To 1)
If x <> "" Then
  Set P = Intersect(R.Columns(1), R.Parent.UsedRange)
  If Not P Is Nothing Then
    x = "*" & x & "*"
    decal = P.Row - R.Row
    tablo = P.Resize(, 2) 'au moins 2 éléments
    For i = 1 To UBound(tablo)
      If tablo(i, 1) Like x Then
          n = n + 1
          If n > limite Then Exit For
          a(n, 1) = i + decal
      End If
    Next
  End If
End If
For i = n + 1 To limite 'complète la liste si nécessaire
  a(i, 1) = ""
Next
ListeLignes = a 'vecteur colonne
End Function
Fichier joint, la fonction est entrée matriciellement en Feuil1 dans la plage C6:C305.

A+
 

Pièces jointes

  • ListeLignes(1).xlsm
    2.4 MB · Affichages: 97
Dernière édition:

Ron2cuir

XLDnaute Nouveau
Heu!!
je me suis aperçu que je vous tutoyais mais après ça le vouvoiement de rigueur.
1) Je vous prie de bien vouloir m'excuser.
2)Exactement ce que je souhaitais... et Job75 l'a fait.
Très sincères salutations (sans mièvreries)
A+
 

job75

XLDnaute Barbatruc
Re,

J'ai légèrement simplifié la fin de la fonction, le test If n < limite Then était inutile.

Le calcul est rapide : 0,09 seconde pour rechercher g?n?ral sur 3361 lignes.

PS : le tutoiement ne me gêne nullement mais je suis de la vieille école :)

A+
 

job75

XLDnaute Barbatruc
Re,

Pour terminer, puisque vous avez parlé d'UserForm, voyez le fichier joint avec ce code :
Code:
Option Compare Text 'la casse est ignorée
Dim P As Range 'mémorise la variable

Private Sub ListBox1_Click()
TextBox2 = P(ListBox1.List(ListBox1.ListIndex, 0))
TextBox2.SetFocus: TextBox2.SelStart = 0: ListBox1.SetFocus
End Sub

Private Sub TextBox1_Change()
Dim limite&, x$, tablo, i&, n&
limite = 300 'modifiable
ListBox1.Clear: TextBox2 = "" 'RAZ
Set P = Intersect(Feuil1.[A:A], Feuil1.UsedRange) 'Feuil1 => CodeName
If TextBox1 = "" Or P Is Nothing Then Exit Sub
x = "*" & TextBox1 & "*"
tablo = P.Resize(, 2) 'au moins 2 éléments
For i = 2 To UBound(tablo)
  If tablo(i, 1) Like x Then
    ListBox1.AddItem i 'numéro de ligne dans la 1ère colonne
    ListBox1.List(n, 1) = Left(tablo(i, 1), 100)
    n = n + 1
    If n > limite Then Exit For
  End If
Next
End Sub
A+
 

Pièces jointes

  • UserForm(1).xlsm
    2.4 MB · Affichages: 92

job75

XLDnaute Barbatruc
Bonjour Ron2cuir, le forum,

En rentrant de la pêche vous trouverez quelques améliorations dans ce fichier (2) :
Code:
Option Compare Text 'la casse est ignorée
Dim P As Range 'mémorise la variable

Private Sub ListBox1_Click()
Dim n%
TextBox2 = P(ListBox1) 'propriété BoundColumn = 1
TextBox2.SetFocus
n = InStr(TextBox2, TextBox1)
If n Then
  TextBox2.SelStart = n - 1
  TextBox2.SelLength = Len(TextBox1)
Else
  TextBox2.SelStart = 0
  ListBox1.SetFocus
End If
Label4 = "Nombre de caractères : " & Len(TextBox2)
End Sub

Private Sub OptionButton1_Change()
TextBox1.SetFocus: TextBox1_Change
End Sub

Private Sub TextBox1_Change()
Dim x$, tablo, op As Boolean, i&, test As Boolean, n&, a()
ListBox1.Clear: TextBox2 = "": Label4 = "Nombre de caractères : 0" 'RAZ
Set P = Intersect(Feuil1.[A:A], Feuil1.UsedRange) 'Feuil1 => CodeName
If TextBox1 <> "" And Not P Is Nothing Then
  x = Replace(TextBox1, "[", "[[]") 'remplacement du crochet gauche
  x = "*" & x & "*"
  tablo = P.Resize(, 2) 'au moins 2 éléments
  op = OptionButton1
  For i = 2 To UBound(tablo)
    If op Then test = tablo(i, 1) Like x Else test = tablo(i, 1) <> "" And Not tablo(i, 1) Like x
    If test Then
      n = n + 1
      ReDim Preserve a(1 To 2, 1 To n)
      a(1, n) = i 'numéro de ligne dans la 1ère colonne
      a(2, n) = Left(tablo(i, 1), 100)
    End If
  Next
  If n = 1 Then
    ListBox1.AddItem a(1, 1): ListBox1.List(0, 1) = a(2, 1)
  ElseIf n Then
    ListBox1.List = Application.Transpose(a) 'maximum 65536 lignes avec la fonction Transpose
  End If
End If
Label2 = "Nombre de lignes : " & ListBox1.ListCount
End Sub
Edit 1 : avec la méthode List la macro est rapide, il n'est pas nécessaire de limiter le nombre de lignes de la ListBox.

Edit 2 : quand c'est possible, le texte recherché est sélectionné dans TextBox2.

Edit 3 : ajouté le code pour la mise entre crochets du crochet gauche [.

Bon dimanche.
 

Pièces jointes

  • UserForm(2).xlsm
    2.4 MB · Affichages: 27
Dernière édition:

Ron2cuir

XLDnaute Nouveau
Bonjour job75
j'ai remarqué que
dans listelignes(1).xlsm si j'encadre l'argument avec [] comme [g?n?ral]
toutes les lignes sont considérées comme répondant à la requête. pourquoi?
ça ne me gène pas, mais c'est pour le fun, je n'ai pas trouvé de justification.
bonne soirée
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

1) Notez que j'ai modifié plusieurs fois mon post #22, voyez les 2 Edit.

2) Sur l'utilisation des crochets dans le "pattern" de l'opérateur Like :

https://docs.microsoft.com/fr-fr/do...ic/language-reference/operators/like-operator

Pour mieux comprendre ce qui se passe testez par exemple :
Code:
Sub test()
MsgBox "abcdef" Like "*[général]*" 'car le texte contient la lettre "a"
MsgBox "bcdefg" Like "*[général]*" 'car le texte contient la lettre "g"
End Sub
A+
 

Ron2cuir

XLDnaute Nouveau
Bonjour Job75
Je ne suis pas du tout content!!
c'est du n'mporte quoi!!
les mots de lignes comportant des caractères génériques
ne sont pas surlignés.
Franchement il y a du laisser-aller.
J'en parlerai avec le DRH pour vos primes
Merci
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 690
dernier inscrit
souleymaane