OVH Cloud OVH Cloud

Recherche dans un fichier

21 réponses
Avatar
dyj Orange
Je fais appel au groupe pour obtenir une technique de recherche sous Excel
2007 et VBA. Je m'explique.
J'ai 2 fichiers (A et B) rigoureusement identiques en terme de structure (nb
de colonnes) mais de longueur différente (nb de lignes).
Je veux chercher tous les enregistrements présent dans A et non présent dans
B.
J'ai fais ceci avec deux boucles imbriquées:
For i=1 to LigneA
For j =1 ti LigneB
' traitement .... si "=" exit For, si"<> MsgBox
Next j
Next i

Le code marche très bien avec mes fichiers de test, mais lorsque je passe
sur les fichiers réels, le temps est considérable vu le nb de lignes(A
=43000, B=37000).

Si vous avez des techniques plus performantes pour traiter mon problèmes,
merci de m'en faire part.

1 réponse

1 2 3
Avatar
dyj Orange
Merci beaucoup.

"michdenis" a écrit dans le message de groupe de
discussion : i5r516$v4f$
Comme ceci :

Si tu utilises le même fichier, supprime manuellement
le nom "MDplg" (Insertion/nom/définir...)

Il y a plusieurs lignes de code qu'il faut modifier légèrement
Tu peux comparer les 2 procédures.
'--------------------------------
Sub test()

Dim Rg As Range, DerLig As Long
Dim LastRow As Long, Plg As Range

Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Sheet1")
'Trouve la dernière ligne de données sur
'les colonnes A:K
DerLig = .Range("A:K").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Définis une variable objet Range pour la
'colonne K1:kx
Set Rg = .Range("A1:A" & DerLig)
End With

With Worksheets("Sheet2")
'Trouve la dernière ligne de données sur
'les colonnes A:K
LastRow = .Range("A:K").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Donne une nom à la plage utile pour la formule
.Range("A1:A" & LastRow).Name = "MDplg"
End With
'Dans la colonne de la feuille 1 dans la colonne L:L
With Rg.Offset(, 10)
'insertion de la formule
.Formula = "=CountIf(MDplg," & Rg(1).Address(0, 0) & ")"
'Fait disparaître la formule pour la valeur
.Value = .Value
'Applique un filtre sur cette colonne.
'Quand NB.SI() ne trouve pas, le résultat est zéro
.AutoFilter Field:=1, Criteria1:=0
End With

'Définit la plage à copier
'l'utilisation de Offset-Resize "c'est comme" la
'formule Decaler dans la feuille de calcul
Set Plg = Rg.Resize(, 10)
'Copie des lignes visibles de la Sheet1 vers la Sheet3
Plg.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet3").Range("A1")

With Rg.Offset(, 10)
'enlève le filtre
.AutoFilter
'efface les valeurs trouvées par la formule
.Value = ""
End With
'Supprimer le nom
ThisWorkbook.Names("MDplg").Delete
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'--------------------------------

--
MichD
--------------------------------------------


"dyj Orange" a écrit dans le message de groupe de
discussion :
4c81087d$0$10193$
Merci. J'ai fait un jeu de fichier de test, c'est ok en adaptant le code.
Comme débutant, que faudrait il que je change pour faire le test sur la
colonne A et non sur la colonne K. J'ai fait le change sur les fonctions
".Range..." mais je me plante sur
"Set Plg = Rg.Offset(, -10).Resize(, 11)"

"michdenis" a écrit dans le message de groupe de
discussion : i5qi6f$rm$
Bonjour,

Voici une façon de faire :

Tu copies ce qui suit dans un module standard
Tu t'assures que les noms des feuilles correspondent à
celles de ton application. Dans mon Exemple,
j'utilise Sheet1, Sheet2 et Sheet3

'--------------------------------------
Sub test()

Dim Rg As Range, DerLig As Long
Dim LastRow As Long, Plg As Range

Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Sheet1")
'Trouve la dernière ligne de données sur
'les colonnes A:K
DerLig = .Range("A:K").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Définis une variable objet Range pour la
'colonne K1:kx
Set Rg = .Range("K1:K" & DerLig)
End With

With Worksheets("Sheet2")
'Trouve la dernière ligne de données sur
'les colonnes A:K
LastRow = .Range("A:K").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
'Donne une nom à la plage utile pour la formule
.Range("K1:K" & LastRow).Name = "MDplg"
End With
'Dans la colonne de la feuille 1 dans la colonne L:L
With Rg.Offset(, 1)
'insertion de la formule
.Formula = "=CountIf(MDplg," & Rg(1).Address(0, 0) & ")"
'Fait disparaître la formule pour la valeur
.Value = .Value
'Applique un filtre sur cette colonne.
'Quand NB.SI() ne trouve pas, le résultat est zéro
.AutoFilter Field:=1, Criteria1:=0
End With

'Définit la plage à copier
'l'utilisation de Offset-Resize "c'est comme" la
'formule Decaler dans la feuille de calcul
Set Plg = Rg.Offset(, -10).Resize(, 11)
'Copie des lignes visibles de la Sheet1 vers la Sheet3
Plg.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet3").Range("A1")

With Rg.Offset(, 1)
'enlève le filtre
.AutoFilter
'efface les valeurs trouvées par la formule
.Value = ""
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'--------------------------------------

--
MichD
--------------------------------------------


"dyj Orange" a écrit dans le message de groupe de
discussion :
4c7f4b82$0$5409$
Je fais appel au groupe pour obtenir une technique de recherche sous
Excel
2007 et VBA. Je m'explique.
J'ai 2 fichiers (A et B) rigoureusement identiques en terme de structure
(nb
de colonnes) mais de longueur différente (nb de lignes).
Je veux chercher tous les enregistrements présent dans A et non présent
dans
B.
J'ai fais ceci avec deux boucles imbriquées:
For i=1 to LigneA
For j =1 ti LigneB
' traitement .... si "=" exit For, si"<> MsgBox
Next j
Next i

Le code marche très bien avec mes fichiers de test, mais lorsque je passe
sur les fichiers réels, le temps est considérable vu le nb de lignes(A
C000, B7000).

Si vous avez des techniques plus performantes pour traiter mon problèmes,
merci de m'en faire part.

1 2 3