teknomaniak
Messages postés9Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2008
-
20 janv. 2008 à 12:57
teknomaniak
Messages postés9Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2008
-
20 janv. 2008 à 20:16
Re bonjour,
Voila j'ai un petit probleme, je m'explique :
Sous
vb6 je dois comparer 2 listes excel. Je recupere un nom dans la
premiere liste et je recherche si il existe dans la seconde.
La seconde liste contient à peu pres 22800 lignes. Le temps de parcourir ces lignes est long je trouve (je boucle la 2eme liste en comparant les noms). Comparer a un ctrl+f sous excel qui le trouve instantanément... Avez vous une idée? Merci à vous
Set Recherche = wsExcelListeOfficielle.Columns("A").Find(nomConcatAFusion)
If Not Recherche Is Nothing Then 'trouvé
msgbox "Trouvé à l'adresse: " & Recherche.Address
End if
.......................
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 janv. 2008 à 19:51
Ben là, ça se complique...
À moins que tu puisses prévoir où et quelles sont les exceptions de ce genre.
Tu pourrais alors ajouter ce "-" à la chaîne recherchée.
Autrement, il faudrait soit recommencer depuis le début avec 2 boucles, une dans chaque feuille... ou bien tu utilises une partie du mot recherché en utilisant le paramètre xlPart de Find. Si trouvé, tu vérifies que les autres parties du mot sont bien là en utilisant Instr().
ex:
Set Recherche = Columns("A").Find("Jean", LookAt:=xlPart)
If Not Recheche Is Nothing Then
If instr(1, Recherche.Value, "Pierre") > 0 Then 'Jean et Pierre ont été trouvés.
Else
' continuer la recherche avec FindNext(Recherche)
...
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 janv. 2008 à 14:20
Ça dépend de ton code...
Si tu utilises des Select, le traitement sera long. On peut pratiquement toujours s'en passer.
Si tu utilises Application.ScreenUpdating, ce sera plus rapide dans bien des cas.
Plutôt que de faire plusieurs boucles, utilise la fonction FIND qui est équivalente à Ctrl-F. Ça te prendra au moins une boucle sur le premier fichier (pas le choix), puis un simple FIND pour rechercher dans le deuxième.
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 janv. 2008 à 14:23
Une autre méthode serait d'utiliser les fichiers Excel comme des bases de données avec ADO ou DAO.
Il faut que les fichiers soient montés comme des bases de données, par contre. C'est-à-dire une ligne d'entêtes, puis les données sur les lignes suivantes. Tu utilises alors SQL pour retracer les valeurs.
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Vous n’avez pas trouvé la réponse que vous recherchez ?
teknomaniak
Messages postés9Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2008 20 janv. 2008 à 16:33
Merci pour ta réponse, mais comment utiliser la fonction FIND dans excel via vb?
je vous donne quand meme un apercu du code :
'Ouverture des applications
Set appExcelAFusion = CreateObject("Excel.Application")
Set appExcelListeOfficielle = CreateObject("Excel.Application")
'Ouverture des fichiers Excel
Set wbExcelAFusion = appExcelAFusion.Workbooks.Open(txtCheminLAF.Text)
Set wbExcelListeOfficielle = appExcelListeOfficielle.Workbooks.Open(App.Path & "\copie electionsAZ.xls")
'feuille du fichier-----
Set wsExcelAFusion = wbExcelAFusion.Worksheets(txtFeuille)
Set wsExcelListeOfficielle = wbExcelListeOfficielle.Worksheets(frmOptions.txtFeuilleLO)
j = 1
'ON PARCOURS LA LISTE A FUSIONNER
For i = txtNbLignDep.Text To txtNbLign.Text Step 1
DoEvents
trouve = False
j = 1
Do While trouve = False
DoEvents
extractNomListeOfficielle = wsExcelListeOfficielle.Cells(j, 1) 'ON EXTRAIT LE NOM
lblAnalyse2.Caption = extractNomListeOfficielle
'SI LE NOM A ETE TROUVE
If (extractNomListeOfficielle = nomConcatAFusion) Then
trouve = True
Else: j = j + 1 'SINON ON INCREMENTE
'SI TOUTES LES LIGNES ONT ETE PARCOURUES, ALORS LE NOM N'A PAS ETE TROUVE
If j >= frmOptions.txtNbLignOff.Text Then
'ON LE MET EN ROUGE POUR POUVOIR LE RECONNAITRE
wsExcelAFusion.Rows(i).Font.Color = vbRed
echec = echec + 1 'ON INCREMENTE LES ECHECS
j = 1
Exit Do
End If
End If
Loop
If trouve = True Then
'CODE
End If
Next i
'ON SAUVEGARDE
'Call wbExcelAFusion.Save
wbExcelAFusion.Close 'Fermeture du classeur Excel
appExcelAFusion.Quit 'Fermeture de l'application Excel
wbExcelListeOfficielle.Close 'Fermeture du classeur Excel
appExcelListeOfficielle.Quit 'Fermeture de l'application Excel
'Désallocation mémoire
Set wsExcelAFusion = Nothing
Set wsExcelListeOfficielle = Nothing
Set wbExcelAFusion = Nothing
Set wbExcelListeOfficielle = Nothing
Set appExcelAFusion = Nothing
Set appExcelListeOfficielle = Nothing
teknomaniak
Messages postés9Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2008 20 janv. 2008 à 18:17
Re..
Une derniere chose..
Avant de comparer avec la fonction find(), j'ai besoin d'enlever (quand il est present) le caractere "-" dans la recherche.
Du genre
Set Recherche = replace(wsExcelListeOfficielle.Columns("A").Find(nomConcatAFusion),"-"," "). Bien entendu ca ne fonctionne pas. Mais c'est pour me faire comprendre.
je précise bien que le caractere doit etre enlever de la chaine provenant de la liste wsExcelListeOfficielle et pas l'inverse.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 janv. 2008 à 18:27
Aussi bien l'enlever dès que tu crées la concaténation
nomConcatAFusion = Replace(Trim(wsExcelAFusion.Cells(i, txtPosNom)) & "
" & Trim(wsExcelAFusion.Cells(i,
txtPosPrenom)), "-", "")
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 20 janv. 2008 à 19:04
Alors, déclare une autre variable As String
Set Recherche = wsExcelListeOfficielle.Columns("A").Find(nomConcatAFusion)
If Not Recherche Is Nothing Then 'trouvé
MaVar = Replace(Recherche.Value, "-", "")
msgbox "Trouvé à l'adresse: " & Recherche.Address
End if
N'oublie pas que Recherche est déclarée As Range. Tu as donc toutes les possibilités d'un objet Range.
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
teknomaniak
Messages postés9Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2008 20 janv. 2008 à 19:24
En fait je me suis mal expliqué. Imaginons que je recherche le nom "Dupond Jean Pierre" dans ma liste de 22800 lignes. Si dans cette liste il est écrit "Dupond Jean-Pierre", find ne le trouvera pas car il y a "-".
Merci pour ta patience...