LENTEUR VB6/EXCEL

[Résolu]
Signaler
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008
-
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008
-
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

12 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Quelque chose comme

Dim Recherche As Range
For i = txtNbLignDep.Text To txtNbLign.Text Step 1
    DoEvents

    nomConcatAFusion = Trim(wsExcelAFusion.Cells(i, txtPosNom)) & " " &                                 Trim(wsExcelAFusion.Cells(i, txtPosPrenom))

    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
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Ç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
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

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

         nomConcatAFusion = Trim(wsExcelAFusion.Cells(i, txtPosNom)) + " " + Trim(wsExcelAFusion.Cells(i, txtPosPrenom))

                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

    End If
End Sub
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

T'es un géni..lol.
Merci beaucoup
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

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.

Merci d'avance pour cette derniere petite astuce
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

Non justement, c'est l'inverse que je veux faire.  Pouvoir enlever ce caractere avant que find renvoi la chaine.  Est ce possible?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

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...
Messages postés
9
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
20 janvier 2008

Merci beaucoup, je vais essayer tous ca ! bonne soirée