recherche précise en VBA avec find

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

gosselien

XLDnaute Barbatruc
Bonjour,

je me demande pourquoi la méthode ".FIND" ne sait pas trouver la différence entre "40" et "400", hors, j'ai besoin de trouver les 2 ...

partie du code ici:

For Each mat In Range("tabledn")
Ordre = mat.Offset(0, 2).Value
With ActiveSheet.Range("d2:d" & Lastrow)
Dim Cel As Range
Set C = .Find(What:=mat, LookIn:=xlValues, LookAt:=xlPart)
If Not C Is Nothing Then
firstAddress = C.Address
Do
etc etc...
(XL 2003 au boulot)

j'ai bien tenté de changé xlPART par xlwhole mais pas mieux... où est mon erreur ?

Merci
 
Re : recherche précise en VBA avec find

Re,

Bien entendu si l'on veut absolument du VBA on peut entrer les formules par macro :

Code:
Sub RemplirColonne()
Dim f1$, f$
f1 = "ISNUMBER(FIND(TABLEDN&"" "",SUBSTITUTE(SUBSTITUTE(RC[-1],""-"","" ""),""/"","" "")&"" ""))"
f = "=IF(SUM(N(" & f1 & ")),INDEX(tri,MATCH(TRUE," & f1 & ",0)),"""")"
[E2].FormulaArray = f
With Range("E2:E" & Range("D" & Rows.Count).End(xlUp).Row)
  [E2].AutoFill .Cells
  .Value = .Value 'supprime les formules
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : recherche précise en VBA avec find

Re,

Pour le résultat en E128 on peut rajouter un 3ème SUBSTITUE/SUBSTITUTE qui remplace la virgule par un espace :

Code:
Sub RemplirColonne()
Dim f1$, f$
f1 = "ISNUMBER(FIND(TABLEDN&"" "",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(RC[-1],""-"","" ""),""/"","" ""),"","","" "")&"" ""))"
f = "=IF(SUM(N(" & f1 & ")),INDEX(tri,MATCH(TRUE," & f1 & ",0)),"""")"
[E2].FormulaArray = f
With Range("E2:E" & Range("D" & Rows.Count).End(xlUp).Row)
  [E2].AutoFill .Cells
  .Value = .Value 'supprime les formules
End With
End Sub
Fichier (3).

A+
 

Pièces jointes

Re : recherche précise en VBA avec find

Bonjour gosselien, le forum,

La méthode par formules a ses limites.

En effet sur Excel 2003 on ne peut pas dépasser 8 niveaux d'imbrication dans les formules, et l'on ne peut donc pas ajouter un 4ème SUBSTITUE.

Il est de toute façon plus simple de faire une recherche purement VBA, mais ici la méthode Find n'est pas la meilleure car travailler sur des cellules est beaucoup trop lent.

Voici une solution qui utilise la fonction InStr sur des tableaux :

Code:
Sub RemplirColonne()
Dim TABLEDN, ub&, tri, tablo, R(), i&, t$, j&
'--- Définition des tableaux---
TABLEDN = Range("H4", [H65536].End(xlUp))
ub = UBound(TABLEDN)
tri = [I4].Resize(ub)
tablo = Range("D2", [D65536].End(xlUp))
ReDim R(1 To UBound(tablo), 1 To 1) 'base 1
'---Recherche et remplissage de R---
For i = 1 To UBound(tablo)
  t = Replace(tablo(i, 1), "-", " ")
  t = Replace(t, "/", " ")
  t = Replace(t, ",", " ") & " "
  For j = 1 To ub
    If InStr(t, TABLEDN(j, 1) & " ") Then R(i, 1) = tri(j, 1): Exit For
  Next
Next
'---Restitution---
[E2].Resize(UBound(tablo)) = R
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : recherche précise en VBA avec find

Bonjour à tous ,
En effet , j'ai testé sur le mac, mas je dois essayer ça sur windaube et excel 2003 , mais ça semble très rapide...
Je vais tenter d'adapter ça à une rechercher d'un critère supplémentaire comme ("van bou" - "van soud" ) etc etc ...et de faire ainsi 4 ou 5 recherches en colonne E-F-G-H pour trouver à trier ces articles.
Un grand merci JOB 75 !!!
P.
 
Re : recherche précise en VBA avec find

J'ai essayé et c'est en effet très rapide mais je ne sais pas l'adapter à mon problème si il y a plus d'une table de référence; j'ai mis dans mon code et une explication dans le ficher joint.
Merci à tous et surtout à JOB75 qui a fait un code très rapide mais que j'ai du mal à adapter et à comprendre au niveau des déclarations de variable.
Je mets le fichier avec mon code vba (trop lent mais que je comprends ) pour que ça profite à d'autres comme on me l'a fait savoir gentiment et c'est normal.
Si manque de clarté, faites le savoir.
P.
 

Pièces jointes

Re : recherche précise en VBA avec find

Bonjour gosselien, le forum,

Si vous voulez une macro rapide, il ne faut surtout pas remplir les cellules une par une, encore moins leur appliquer une mise en forme.

Dans le fichier joint :

- la mise en forme (couleur, bordures) est appliquée par 4 MFC sur les colonnes E F G H

- le remplissage se fait via le tableau R de cette macro :

Code:
Sub RemplirColonnes()
Dim a, tablo, R$(), n As Byte, ref, ub&, i&, t$, j&
Dim x$, p%, test As Boolean
'--- définition des tableaux---
a = Array("type", "racco", "TABLEDN", "gaz")
tablo = Range("D2", [D65536].End(xlUp))
ReDim R(1 To UBound(tablo), 1 To UBound(a) + 1) 'base 1
'---recherche et remplissage de R-----
For n = 1 To UBound(a) + 1
  ref = Range(a(n - 1)).Resize(, 2)
  ub = UBound(ref)
  For i = 1 To UBound(tablo)
    t = tablo(i, 1) & " "
    For j = 1 To ub
      x = ref(j, 1)
      p = InStr(t, x)
      If p Then
        test = True
        If n = 3 Then test = Not IsNumeric(Mid(t, p + Len(x), 1))
        If test Then R(i, n) = ref(j, 2): Exit For
      End If
    Next
  Next
Next
'---restitution---
[E2].Resize(UBound(tablo), UBound(a) + 1) = R
End Sub
Le résultat est là : ma macro s'exécute en 0,06 seconde contre 1,15 seconde pour la vôtre.

[Edit] Et sur un tableau de 15800 lignes 0,7 seconde contre 7 minutes 26 secondes...

Par ailleurs il y a quelques différences dans nos résultats :

- vous ne trouvez pas les 3 valeurs en H88-H156-H505 (fin de ligne)

- vous trouvez 3 valeurs non référencées en G440-G441-G482 (pour TABLEDN)

Fichier joint.

A+
 

Pièces jointes

Dernière édition:
Re : recherche précise en VBA avec find

Re,

On aura remarqué qu'avec cette instruction :

Code:
If test Then R(i, n) = ref(j, 2): Exit For '1ère référence
on sort de la boucle pour ne garder que la 1ère référence trouvée.

On peut aussi continuer la boucle et concaténer toutes les références trouvées :

Code:
If test Then R(i, n) = Trim(R(i, n) & " " & ref(j, 2))
Il y a 38 cellules avec 2 valeurs.

Fichier (2).

A+
 

Pièces jointes

Re : recherche précise en VBA avec find

Re,

Pour peaufiner, une variante (2 bis).

Elle permet de trouver les références de la colonne S (gaz) même si elles ne sont pas suivies d'un espace :

Code:
Sub RemplirColonnes()
Dim a, tablo, R$(), n As Byte, ref, ub&, i&, t$, j&
Dim x$, p%, test1 As Boolean, test2 As Boolean
'--- définition des tableaux---
a = Array("type", "racco", "TABLEDN", "gaz")
tablo = Range("D2", [D65536].End(xlUp))
ReDim R(1 To UBound(tablo), 1 To UBound(a) + 1) 'base 1
'---recherche et remplissage de R-----
For n = 1 To UBound(a) + 1
  ref = Range(a(n - 1)).Resize(, 2)
  ub = UBound(ref)
  For i = 1 To UBound(tablo)
    t = tablo(i, 1)
    For j = 1 To ub
      x = Trim(ref(j, 1)) 'supprime l'espace en colonne S (gaz)
      p = InStr(t, x)
      If p Then
        p = p + Len(x)
        test1 = True: test2 = True
        If n > 2 Then test1 = Not IsNumeric(Mid(t, p, 1))
        If n = 4 Then test2 = Mid(t, p, 1) <> "/" And Mid(t, p, 1) <> "."
        'If test1 * test2 Then R(i, n) = ref(j, 2): Exit For '1ère reférence
        If test1 * test2 Then R(i, n) = Trim(R(i, n) & " " & ref(j, 2))
      End If
    Next
  Next
Next
'---restitution---
[E2].Resize(UBound(tablo), UBound(a) + 1) = R
End Sub
Il y a 6 cellules supplémentaires renseignées en colonne H : H50-H111-H135-H141-H426-H739 + la cellule H316 qui prend 2 valeurs.

A+
 

Pièces jointes

Re : recherche précise en VBA avec find

Bonjour et merci encore...
je suis sur le c... au niveau la vitesse 😉
Je dois avouer que je ne comprends pas le code car une fois qu'il y a des tableaux, (je sais que c'est plus rapide), je ne sais pas comment y placer des valeurs et les restituer...Je vais chercher un site qui explique ça avec des exemples simples pour commencer.
Je vais donc "tenter" de décrypter ça...
Serait il possible (sans abuser de ta gentilesse) de me commenter les lignes de ton code , soit ici soit en mp, comme tu préfères, mais comme tu l'as déjà écris, ça sera profitable à tous si c'est ici...)
Patrick
 
Re : recherche précise en VBA avec find

Re,

Serait il possible (sans abuser de ta gentilesse) de me commenter les lignes de ton code

Les quelques commentaires que j'ai déjà mis doivent suffire si vous avez compris ce que sont les tableaux VBA.

Quant aux astuces de programmation (variables test1, test2) au coeur de la macro, elles visent à délimiter la recherche du texte.

Vous devez arriver à les comprendre puisque vous même vous aviez mis pour ça un espace en colonne S.

Et si vous ne comprenez pas une fonction, allez sur l'Aide VBA.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
461
Réponses
12
Affichages
860
Retour