Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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.

10 réponses

1 2 3
Avatar
dyj Orange
merci. Je mets en application.

"LSteph" a écrit dans le message de groupe de
discussion :


Et bien voilà tu as ta solution!

on adaptes ma formule à la onzième au lieu de la première.

=nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

une fois cela sur toute la colonne tu mets le filtre automatique
puis pour K filtré sur la valeur zero
puis tu sélectionne tout le tableau
F5 ( Atteindre)
Cellules visibles seulement
Copier
puis Feuil2 Coller

--
LSteph




On 2 sep, 16:06, "dyj Orange" wrote:
Il y a 11 colonnes et c'est la dernière qui sert d'index à la recherche

"LSteph" a écrit dans le message de groupe de
discussion :




> ... jusqu'où Combien de colonnes

> Y a t il une colonne qui indexe les enregistrements ou faut il
> comparer chaque champ?

>>

>> > Coucou Isabelle,

>> > En effet, MEFC j'y ai songé aussi et .. mais que ce serait idéal
>> > pour
>> > un visuel sur un nombre de ligne plus restreint.

>> > Comme il a beaucoup de ligne et qu'il envisageait aussi surprenant
>> > que
>> > cela puisse paraître un msgbox
>> > j'ai pensé qu'il voulait peut - être quelque chose permettant de
>> > s'arrêter sur chaque cas.

>> > Donc le filtre sur formule me semble permettre de limiter
>> > directement
>> > à l'ensemble à traiter.

>> > Aussi quand j'ai vu ton post j'étais justement entrain de me dire
>> > que
>> > peut-être
>> > "dyj Orange" en nous disant ce qu'il compte faire ensuite sur cette
>> > selection d'enregistrements
>> > nous engagerait plus directement à lui proposer une solution sur la
>> > finalité de l'objectif souhaité.

>> > @++

>> > --
>> > LSteph

>> > On 2 sep, 11:44, isabelle wrote:
>> >> bonjour à vous deux,

>> >> dyj, tu peut aussi te servir de la formule de LSteph pour faire une
>> >> mise
>> >> en forme conditionnel
>> >> au lieu de la mettre dans une nouvelle colonne.

>> >> isabelle

>> >> Le 2010-09-02 05:36, LSteph a écrit :

>> >> > Pas lu tout, au lieu de 25000 dans l'exemplemettre 37000
>> >> > Je propose cette solution de formule pour t'éviter tious ces
>> >> > msgbox
>> >> > effectivement ce serait long et lourd

>> >> > On 2 sep, 10:43, LSteph wrote:
>> >> >> Bonjour,
>> >> >> Supposons valeurs à rechercher en colonne A de feuil1 de chacun
>> >> >> des
>> >> >> fichiers
>> >> >> En colonne adjacente vide du fichierA ligne 2 et à recopier
>> >> >> vers
>> >> >> bas
>> >> >> =nb.si([fichierB.xls]Feuil1!$a$2:$a$25000;A2)
>> >> >> Et tu repères ceux qui sont à Zero
>> >> >> ou tu mets un filtre automatique et tu les vois tous

>> >> >> Cordialement.

>> >> >> --
>> >> >> LSteph

>> >> >> On 2 sep, 09:00, "dyj Orange" wrote:

>> >> >>> 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.- Masquer le texte des messages
>> >> >>> précédents -

>> >> >> - Afficher le texte des messages précédents -- Masquer le texte
>> >> >> des
>> >> >> messages précédents -

>> >> - Afficher le texte des messages précédents -- Masquer le texte des
>> >> messages précédents -

>> - Afficher le texte des messages précédents -- Masquer le texte des
>> messages précédents -

- Afficher le texte des messages précédents -



Avatar
dyj Orange
Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
solution, aussi je m'excuse de prendre ton temps. Je réexplique mon soucis,
bien que ce que j'ai développé marche sauf le temps qui me paraît long
(30'). C'est pourquoi j'aimerai connaître d'autres techniques.
J'ai un classeur de 4 feuilles.
Feuil1: Mes boutons de commandes
Feuil2: Mes données A
Feuil3: Mes données B (structure identique à la Feuil2, 11 colonnes mais un
nombre de lignes différents)
Feuil4: Les résultats de recherche.
Mon code activé par un click sur Bouton1 : Si un élément de Feuil1(N° de
pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la ligne
de Feuil1 dans Feuil4.

Ce qui me trouble, c'est que je ne vois comment et où utiliser ta formule.

"LSteph" a écrit dans le message de groupe de
discussion :


Et bien voilà tu as ta solution!

on adaptes ma formule à la onzième au lieu de la première.

=nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

une fois cela sur toute la colonne tu mets le filtre automatique
puis pour K filtré sur la valeur zero
puis tu sélectionne tout le tableau
F5 ( Atteindre)
Cellules visibles seulement
Copier
puis Feuil2 Coller

--
LSteph


Avatar
LSteph
Bonjour,

C'est bien plus long à dire qu'à faire, en fait cela prend environ 7
secondes.

VBA est fort utile et je m'en sers énormément surtout quand c'est
indispensable
Or ici on en a absolument pas besoin (même si on pourrait aussi le
faire avec)
Excel sait faire ce que tu veux presque tout seul, je récapitule:

Supposons remplies tes colonnes de A jusqu'à Y et bien on ajoute
adjacente
une colonne Z dans le tableau1 dans celle-ci on met
en ligne1 Letitre (ce que tu veux)
on se ensuite en z2 tu colle la formule , adapte éventuellement le nom
[fichierB.xls]Feuil1à ton classeur

=nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

à recopier vers bas.
Dans ce tableau tu actives Données Filtre Automatique
tu filtre la colonne Z sur 0
Appuies sur F5 puis Cellules Cellules Visibles Seulement OK
Copier
Aller dans la feuille destination Coller

Cordialement.

--
LSteph




On 3 sep, 10:55, "dyj Orange" wrote:
Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
solution, aussi je m'excuse de prendre ton temps. Je réexplique mon sou cis,
bien que ce que j'ai développé marche sauf le temps qui me paraît l ong
(30'). C'est pourquoi j'aimerai connaître d'autres techniques.
J'ai un classeur de 4 feuilles.
Feuil1: Mes boutons de commandes
Feuil2: Mes données A
Feuil3: Mes données B (structure identique à la Feuil2, 11 colonnes m ais un
nombre de lignes différents)
Feuil4: Les résultats de recherche.
Mon code activé par un click sur Bouton1 : Si un élément de Feuil1( N° de
pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la ligne
de Feuil1 dans Feuil4.

Ce qui me trouble, c'est que je ne vois comment et où utiliser ta formu le.

"LSteph" a écrit dans le message de groupe de
discussion :






> Et bien voilà tu as ta solution!

> on adaptes ma formule à la onzième au lieu de la première.

> =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

> une fois cela sur toute la colonne tu mets le filtre automatique
> puis pour K filtré sur la valeur zero
> puis tu sélectionne tout le tableau
> F5 ( Atteindre)
> Cellules visibles seulement
> Copier
> puis Feuil2 Coller

> --
> LSteph- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
LSteph
Oupss pas tout lu dans le dernier..

Finalement tu nous disais avoir 2 fichiers (classeurs), s'il s'agit de
2 Feuilles
du même classeur c'est encore plus simple

Dans
Feuil2: Mes données A


tu ajoute une ultime colonne Mets un titre ce que tu veux en ligne1
En ligne 2 notre formule aisi réadaptée

=nb.si(Feuil3!$K$2:$K$37000;K2)

Tu filtres et tu colles les lignes visibles en Feuil4

Et voilà.



(ou bien moyennant que tu as bien mis la formule si cela te chante tu
fais le filtrer copier coller en vba)

Nota:
(J'ai corrige au passage
Mon code activé par un click sur Bouton1 : Si un élément de Feuil1( N° de
pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la ligne
de Feuil1 dans Feuil4.


Il doit s'agir de Feuil2 et Feuil3 puisque Feuil 1 c'est boutons de
commandes)


On 3 sep, 10:55, "dyj Orange" wrote:
Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
solution, aussi je m'excuse de prendre ton temps. Je réexplique mon sou cis,
bien que ce que j'ai développé marche sauf le temps qui me paraît l ong
(30'). C'est pourquoi j'aimerai connaître d'autres techniques.
J'ai un classeur de 4 feuilles.
Feuil1: Mes boutons de commandes
Feuil2: Mes données A
Feuil3: Mes données B (structure identique à la Feuil2, 11 colonnes m ais un
nombre de lignes différents)
Feuil4: Les résultats de recherche.
Mon code activé par un click sur Bouton1 : Si un élément de Feuil1( N° de
pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la ligne
de Feuil1 dans Feuil4.

Ce qui me trouble, c'est que je ne vois comment et où utiliser ta formu le.

"LSteph" a écrit dans le message de groupe de
discussion :






> Et bien voilà tu as ta solution!

> on adaptes ma formule à la onzième au lieu de la première.

> =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

> une fois cela sur toute la colonne tu mets le filtre automatique
> puis pour K filtré sur la valeur zero
> puis tu sélectionne tout le tableau
> F5 ( Atteindre)
> Cellules visibles seulement
> Copier
> puis Feuil2 Coller

> --
> LSteph- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
dyj Orange
L'expérience ... je voulais faire cette formule en vba ????? J'ai compris le
principe. Encore un grand merci de ton temps et de ton expérience.

"LSteph" a écrit dans le message de groupe de
discussion :

Bonjour,

C'est bien plus long à dire qu'à faire, en fait cela prend environ 7
secondes.

VBA est fort utile et je m'en sers énormément surtout quand c'est
indispensable
Or ici on en a absolument pas besoin (même si on pourrait aussi le
faire avec)
Excel sait faire ce que tu veux presque tout seul, je récapitule:

Supposons remplies tes colonnes de A jusqu'à Y et bien on ajoute
adjacente
une colonne Z dans le tableau1 dans celle-ci on met
en ligne1 Letitre (ce que tu veux)
on se ensuite en z2 tu colle la formule , adapte éventuellement le nom
[fichierB.xls]Feuil1à ton classeur

=nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

à recopier vers bas.
Dans ce tableau tu actives Données Filtre Automatique
tu filtre la colonne Z sur 0
Appuies sur F5 puis Cellules Cellules Visibles Seulement OK
Copier
Aller dans la feuille destination Coller

Cordialement.

--
LSteph




On 3 sep, 10:55, "dyj Orange" wrote:
Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
solution, aussi je m'excuse de prendre ton temps. Je réexplique mon
soucis,
bien que ce que j'ai développé marche sauf le temps qui me paraît long
(30'). C'est pourquoi j'aimerai connaître d'autres techniques.
J'ai un classeur de 4 feuilles.
Feuil1: Mes boutons de commandes
Feuil2: Mes données A
Feuil3: Mes données B (structure identique à la Feuil2, 11 colonnes mais
un
nombre de lignes différents)
Feuil4: Les résultats de recherche.
Mon code activé par un click sur Bouton1 : Si un élément de Feuil1(N° de
pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la
ligne
de Feuil1 dans Feuil4.

Ce qui me trouble, c'est que je ne vois comment et où utiliser ta
formule.

"LSteph" a écrit dans le message de groupe de
discussion :






> Et bien voilà tu as ta solution!

> on adaptes ma formule à la onzième au lieu de la première.

> =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

> une fois cela sur toute la colonne tu mets le filtre automatique
> puis pour K filtré sur la valeur zero
> puis tu sélectionne tout le tableau
> F5 ( Atteindre)
> Cellules visibles seulement
> Copier
> puis Feuil2 Coller

> --
> LSteph- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Avatar
michdenis
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.
Avatar
LSteph
Re,

Sinon avec la même formule dans la feuille dans une colonne appelée
Verif
tu nommes ta base (Définir un nom) Base
dans la feuille destination en A1 A2 tu mets respectivement Verif 0
tu nommes ces deux cellules Critères

Et tu utilises ce code

Sub Extraire()
[base].AdvancedFilter _
action:=xlFilterCopy, _
criteriarange:=[critères], _
copytorange:=[extraction]

End Sub

'LSteph


On 3 sep, 12:11, "dyj Orange" wrote:
L'expérience ... je voulais faire cette formule en vba ????? J'ai compr is le
principe. Encore un grand merci de ton temps et de ton expérience.

"LSteph" a écrit dans le message de groupe de
discussion :




> Bonjour,

> C'est bien plus long à dire qu'à faire, en fait  cela prend envir on 7
> secondes.

> VBA est fort utile et je m'en sers énormément surtout quand c'est
> indispensable
> Or ici on en a absolument pas besoin (même si on pourrait aussi le
> faire avec)
> Excel sait faire ce que tu veux presque tout seul, je récapitule:

> Supposons remplies tes colonnes de A jusqu'à Y et bien on ajoute
> adjacente
> une colonne Z dans le tableau1 dans celle-ci on met
> en ligne1 Letitre (ce que tu veux)
> on se ensuite en z2 tu colle la formule , adapte éventuellement le no m
> [fichierB.xls]Feuil1à ton classeur

> =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

> à recopier vers bas.
> Dans ce tableau tu actives  Données Filtre Automatique
> tu filtre la colonne Z  sur 0
> Appuies sur F5 puis Cellules Cellules Visibles Seulement OK
> Copier
> Aller dans la feuille destination Coller

> Cordialement.

> --
> LSteph

> On 3 sep, 10:55, "dyj Orange" wrote:
>> Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
>> solution, aussi je m'excuse de prendre ton temps. Je réexplique mon
>> soucis,
>> bien que ce que j'ai développé marche sauf le temps qui me paraî t long
>> (30'). C'est pourquoi j'aimerai connaître d'autres techniques.
>> J'ai un classeur de 4 feuilles.
>> Feuil1: Mes boutons de commandes
>> Feuil2: Mes données A
>> Feuil3: Mes données B (structure identique à la Feuil2, 11 colonne s mais
>> un
>> nombre de lignes différents)
>> Feuil4: Les résultats de recherche.
>> Mon code activé par un click sur Bouton1 : Si un élément de Feui l1(N° de
>> pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la
>> ligne
>> de Feuil1 dans Feuil4.

>> Ce qui me trouble, c'est que je ne vois comment et où utiliser ta
>> formule.

>> "LSteph" a écrit dans le message de groupe de
>> discussion :
>>

>> > Et bien voilà tu as ta solution!

>> > on adaptes ma formule à la onzième au lieu de la première.

>> > =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

>> > une fois cela sur toute la colonne tu mets le filtre automatique
>> > puis pour K filtré sur la valeur zero
>> > puis tu sélectionne tout le tableau
>> > F5 ( Atteindre)
>> > Cellules visibles seulement
>> > Copier
>> > puis Feuil2 Coller

>> > --
>> > LSteph- Masquer le texte des messages précédents -

>> - Afficher le texte des messages précédents -- Masquer le texte de s messages précédents -

- Afficher le texte des messages précédents -
Avatar
LSteph
Re, (c'est parti un peuvite)
Solution VBA

Sinon avec la même formule dans la feuille dans une colonne appelée
Verif
tu nommes ta base (Définir un nom) base
dans la feuille destination en A1 A2 tu mets respectivement Verif 0
tu nommes ces deux cellules Critères et en sautant au moins une
colonne
plus loin à droite et plus tu colles lestitres de ta base et tu nommes
cela extraction

Enfin tu utilises ce code

Sub Extraire()
[base].AdvancedFilter _
action:=xlFilterCopy, _
criteriarange:=[critères], _
copytorange:=[extraction]


End Sub


'LSteph





On 3 sep, 12:11, "dyj Orange" wrote:
L'expérience ... je voulais faire cette formule en vba ????? J'ai compr is le
principe. Encore un grand merci de ton temps et de ton expérience.

"LSteph" a écrit dans le message de groupe de
discussion :




> Bonjour,

> C'est bien plus long à dire qu'à faire, en fait  cela prend envir on 7
> secondes.

> VBA est fort utile et je m'en sers énormément surtout quand c'est
> indispensable
> Or ici on en a absolument pas besoin (même si on pourrait aussi le
> faire avec)
> Excel sait faire ce que tu veux presque tout seul, je récapitule:

> Supposons remplies tes colonnes de A jusqu'à Y et bien on ajoute
> adjacente
> une colonne Z dans le tableau1 dans celle-ci on met
> en ligne1 Letitre (ce que tu veux)
> on se ensuite en z2 tu colle la formule , adapte éventuellement le no m
> [fichierB.xls]Feuil1à ton classeur

> =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

> à recopier vers bas.
> Dans ce tableau tu actives  Données Filtre Automatique
> tu filtre la colonne Z  sur 0
> Appuies sur F5 puis Cellules Cellules Visibles Seulement OK
> Copier
> Aller dans la feuille destination Coller

> Cordialement.

> --
> LSteph

> On 3 sep, 10:55, "dyj Orange" wrote:
>> Ma compétence en Excel+vba ne me permette pas de mettre en ouvre ta
>> solution, aussi je m'excuse de prendre ton temps. Je réexplique mon
>> soucis,
>> bien que ce que j'ai développé marche sauf le temps qui me paraî t long
>> (30'). C'est pourquoi j'aimerai connaître d'autres techniques.
>> J'ai un classeur de 4 feuilles.
>> Feuil1: Mes boutons de commandes
>> Feuil2: Mes données A
>> Feuil3: Mes données B (structure identique à la Feuil2, 11 colonne s mais
>> un
>> nombre de lignes différents)
>> Feuil4: Les résultats de recherche.
>> Mon code activé par un click sur Bouton1 : Si un élément de Feui l1(N° de
>> pièce en K) n'existe pas dans Feuil2 (colonne K), alors je le sauve la
>> ligne
>> de Feuil1 dans Feuil4.

>> Ce qui me trouble, c'est que je ne vois comment et où utiliser ta
>> formule.

>> "LSteph" a écrit dans le message de groupe de
>> discussion :
>>

>> > Et bien voilà tu as ta solution!

>> > on adaptes ma formule à la onzième au lieu de la première.

>> > =nb.si([fichierB.xls]Feuil1!$K$2:$K$37000;K2)

>> > une fois cela sur toute la colonne tu mets le filtre automatique
>> > puis pour K filtré sur la valeur zero
>> > puis tu sélectionne tout le tableau
>> > F5 ( Atteindre)
>> > Cellules visibles seulement
>> > Copier
>> > puis Feuil2 Coller

>> > --
>> > LSteph- Masquer le texte des messages précédents -

>> - Afficher le texte des messages précédents -- Masquer le texte de s messages précédents -

- Afficher le texte des messages précédents -
Avatar
dyj Orange
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.

Avatar
michdenis
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