Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 16h35   #1
Membre du Club
 
Avatar de Dennis Nedry
 
Étudiant
Inscription : septembre 2007
Messages : 68
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2007
Messages : 68
Points : 45
Points : 45
Par défaut fonction instr à choix multiples, plusieurs valeurs recherchées possibles.

Bonjour.

Je suis en train de m'acharner à chercher un résultat alors que la solution doit fort probablement se trouver au bout de mon nez...

J'ai 2 feuilles au sein d'un même classeur: dans l'une se trouve une série de chaines de caractères assez longue, tandis que dans l'autre feuille se trouve une autre série de chaines de caractères, bien plus courtes.

Je recherche l'existence de n'importe laquelle des courtes chaines de caractères au sein de la grande chaine.

Par exemple, feuille 1:
Lucas Rabine
Marc Tapage
René Sens
Feuille 2 (appelée database):
ené
luc
martin
per
nod
Dans ce cas, Lucas Rabine (luc) et René Sens (ené) seront sélectionnés.

J'ai fait le code suivant, qui fonctionne, mais au vu de la quantité astronomique d'enregistrements, il apparait difficile d'utiliser cette méthode... j'ai 20,000 lignes à analyser, avec pour chacune plus de 11,000 possibilités.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub recherche()
Dim i As Integer
Dim rech As Integer
Dim fullname As String
 
For i = 1 To 21000
fullname = LCase(Cells(i, 2))
rech = 1
For rech = 1 To 11142
    If InStr(fullname, Sheets("database").Cells(rech, 1)) > 0 Then
        Cells(i, 4) = "oui: " & Sheets("database").Cells(rech, 1)
        rech = 11142
    End If
Next rech
 
Next i
 
End Sub
Dans le cas présenté, il analyse 2 lignes par seconde... je vous laisse imaginer le temps nécessaire pour les 20,000 lignes. Y a-t-il une fonction plus rapide, et plus évidente pour y arriver? InStr n'analyse qu'un string à la fois, alors qu'il faudrait qu'il en analyse plus de 11,000 par ligne...
__________________
If Ramage = Plumage Then
Phenix_des_hôtes_de_ces_bois = True
End If
Dennis Nedry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h09   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Je sais pas si ce sera plus rapide, mais regarde l'instruction FIND qui te permettra de connaitre les cellules contenant la chaine de caractère recherchée
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 20h05   #3
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

Tu dois pouvoir gagner une bonne poignée de secondes en utilisant des tableaux de traitements intermédiaires.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sub recherche()
Dim i As Integer
Dim rech As Integer
Dim fullname As String
Dim tablo1 As Variant
Dim tablo2 As Variant
 
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
 
tablo1 = Range("B1:B21000")
tablo2 = Worksheets("database").Range("A1:A11142")
 
For i = 1 To 21000
    fullname = LCase(tablo1(i, 1))
    For rech = 1 To 11142
        If InStr(fullname, tablo2(rech, 1)) > 0 Then
            Cells(i, 4) = "oui: " & Sheets("database").Cells(rech, 1)
            Exit For
        End If
    Next rech
Next i
 
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
 
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h56.


 
 
 
 
Partenaires

Hébergement Web