tri et sélection de données avec boucle

B

ben

Guest
Bonjour le forum,

J'ai un souci et je cherche une solution depuis tôt ce matin.
Dans le fichier que je joint j'ai 2 feuilles une comprennant une liste de données l'autre avec des "items" (numéro nécessaire que je doit prendre dans la première feuille)

J'aimerai trouver comment faire pour que dans la 1ère feuille dans la colonne B il me parcour la colonne ligne par ligne et dès qu'il tombe sur un chiffre contenu également ds la feuille item il me copie dans une autre feuille la ligne à partir de ce numéro et tout ceux en dessous si ils ont une valeur entre 1 et 99, et qu'il s'arrete de faire la copie jusqu'à se qu'il retoure un numéro identique ds la colonne A de la feuille Item.

J'espère être assez claire j'ai fait en rouge et jaune avec le numéro 512 et 722 un exemple ds le fichier joint

Merci bcp pour votre aide
 

Pièces jointes

  • exemple.zip
    47.6 KB · Affichages: 28
  • exemple.zip
    47.6 KB · Affichages: 23
  • exemple.zip
    47.6 KB · Affichages: 23
W

wally

Guest
Bonjour Ben et le forum,

Une proposition de solution se trouve dans le fichier joint, en espérant que cela réponde à tes attentes.


Slts

wally
 

Pièces jointes

  • exemple.zip
    49 KB · Affichages: 27
  • exemple.zip
    49 KB · Affichages: 27
  • exemple.zip
    49 KB · Affichages: 27
B

ben

Guest
Re: tri et s鬥ction de donn饳 avec boucle

merci wally
chapeau c'est juste se qu'il me fallait mais j'ai du mal à comprendre quelque syntaxe de ton code.
J'ai juste oublié de demander quelquechose c'est qd il trouve le même nombre il copie bien donc tout les ligne en dessous comprise entre 1 et 99 mais si il n'y à pas ce nombre la en dessous il ne faut pas copier l'item
je vais essayé de trouver mais si ta un tit moment pour m'indiquer quel ligne changer
en tout cas je te remercie beaucoup tu me sauve la vie lol
 
W

wally

Guest
Re Ben et le forum,

Essaye de remplacer les lignes :

If Worksheets("item").Range("A:A").Find(oRge.Value, , , xlWhole) Is Nothing Then
bFnd = False
Else
bFnd = True
Call resultat
End If

par celles-ci :

If Worksheets("item").Range("A:A").Find(oRge.Value, , , xlWhole) Is Nothing Then
bFnd = False
Else
If IsNumeric(oRge.Offset(1, 0).Value) _
And oRge.Offset(1, 0).Value <= 99 Then
bFnd = True
Call resultat
Else
bFnd = False
End If
End If


Slts

wally
 
B

ben

Guest
Re: tri et s鬥ction de donn饳 avec boucle

ok merci bien
ya encore un truc mais j'ose plus trop t'embeter c'est dans la feuille résultat copier la ligne entière et non les 2 colonnes car j'ai enlevé des donnée ds le fichier que j'ai joint pour qu'il soit moins lourd

En tout cas c'est vraiment sympa de m'avoir aidé et d'avoir pris de ton temps
 
W

wally

Guest
Re Ben et le forum,

Essaye de remplacer la procédure resultat() existante par celle-ci :

Private Sub resultat()

oRge.EntireRow.Copy

If IsEmpty(Worksheets("resultat").Range("A1")) Then
Worksheets("resultat").Rows(1).Insert xlDown
Else
iRow = Worksheets("resultat").Range("A65536").End(xlUp).Row + 1
Worksheets("resultat").Rows(iRow).Insert xlDown
End If

Application.CutCopyMode = False

End Sub

Pour éviter les "tremblements" d'écran lors de l'exécution de la macro, tu peux également ajouter les instructions suivantes dans la procédure CommandButton1_Click() :

Application.ScreenUpdating = False '-> au début de la procédure
Application.ScreenUpdating = True '-> à la fin de la procédure


Slts

wally
 
B

ben

Guest
merci wally ca marche impec !
J'ai remarqué encore un petit pb de contrainte de classement au niveau ou il faut prendre les ligne en dessous de 1 à 99 je voudrai mettre inclure également que l'on peut prendre les ligne avec 998 et 999 ds mon contexte je cherche mais je trouve pas
Peut tu m'aider une dernière fois ?
Merci beaucoup wally tu m'a éviter au moins un mois de recherche lol
 
W

wally

Guest
Bonjour ben et le forum,

Juste une question : cela veut-il dire que par exemple pour l'item 722, le résultat devrait être le suivant ?

3 722
4 1
5 1
5 2
5 3
5 4
4 2
5 1
5 2
5 3
5 4
6 1
6 2
4 3
5 1
6 1
7 998
6 2
7 1
8 1
8 2
7 2
6 3
6 4
5 2
6 1
7 998
6 2
7 998
5 3
6 1


Slts

wally
 
B

ben

Guest
Re: tri et s鬥ction de donn饳 avec boucle

Salut wally merci de répondre aussi rapidement
Grace à toi encore je me suis aperçu qu'il y avait le 997 aussi et j'ai vu qd il y a aussi AAAA je suis allé voir la personne concerné j'ai tout listé les contrainte
Donc pour le 722 cela donne ca :



722
1
1
2
3
4
2
1
2
3
4
1
2
3
1
1
998
2
1
1
2
2
3
4
2
1
998
2
998
3
1
997
2
997
3
997
4
4
5
6
7
999
8
9
10

et pour le 1121 par exemple :

1121
AAAA
1
2



merci bcp wally
 
W

wally

Guest
Re Ben et le forum,

Essaye de remplacer la procédure CommandButton1_Click() existante par celle-ci :

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

Worksheets("bmfl").Select
Worksheets("resultat").Range("A:B").ClearContents

For Each oRge In ActiveSheet.Range("B2:B" & ActiveSheet.Range("B65536").End(xlUp).Row)
If IsNumeric(oRge.Value) _
Or oRge.Value = "AAAA" Then
If IsNumeric(oRge.Value) _
And oRge.Value > 99 _
And oRge.Value <> 997 _
And oRge.Value <> 998 _
And oRge.Value <> 999 Then
If Worksheets("item").Range("A:A").Find(oRge.Value, , , xlWhole) Is Nothing Then
bFnd = False
Else
If (IsNumeric(oRge.Offset(1, 0).Value) _
And (oRge.Offset(1, 0).Value <= 99 _
Or oRge.Offset(1, 0).Value = 997 _
Or oRge.Offset(1, 0).Value = 998 _
Or oRge.Offset(1, 0).Value = 999)) _
Or oRge.Offset(1, 0).Value = "AAAA" Then
bFnd = True
Call resultat
Else
bFnd = False
End If
End If
Else
If bFnd Then
Call resultat
End If
End If
End If
Next oRge

Application.ScreenUpdating = True

End Sub


Slts

wally
 
B

ben

Guest
wally il y a des item qui posent problem, les dernier de la feuille item par exemple le 557T
j'ai essayer de trouver la solution mais pour l'instant je coince j'ai essayer de trouver autre chose que isnumeric j'ai pas trouvé et j'ai modifié les lignes en rajoutant en exemple 557t mais ca marche pas


For Each oRge In ActiveSheet.Range("B2:B" & ActiveSheet.Range("B65536").End(xlUp).Row)
If IsNumeric(oRge.Value) _
Or oRge.Value = "AAAA" _
Or oRge.Value = "557T" Then
........

If Worksheets("item").Range("A:A").Find(oRge.Value, , , xlWhole) Is Nothing Then
bFnd = False
Else
If (IsNumeric(oRge.Offset(1, 0).Value) _
And (oRge.Offset(1, 0).Value <= 99 _
Or oRge.Offset(1, 0).Value = 997 _
Or oRge.Offset(1, 0).Value = 998 _
Or oRge.Offset(1, 0).Value = 999)) _
Or oRge.Offset(1, 0).Value = "AAAA" _
Or oRge.Value = "557T" Then
.....
 
B

ben

Guest
merci wally je cherche encore sur le problème des dernier items 557T, 235A... comme je t'ai expliqué au dessus si tu peu m'éclairer un peut
j'ai une question concernant cette ligne
Find(oRge.Value, , , xlWhole)
je comprend qu'il cherche la valeur mais je comprend pas la syntaxe ,,, et xlwhole
 
W

wally

Guest
Re Ben et le forum,

Si l'item 557T ne figure pas dans le résultat, c'est parce qu'il était mentionné dans ton premier message "(...) et dès qu'il tombe sur un CHIFFRE contenu également ds la feuille item il me copie dans une autre feuille la ligne à partir de ce numéro et tout ceux en dessous (...)".

Or la valeur "557T" ne peut pas vraiment être considérée comme un chiffre...

Faut-il par conséquent faire une recherche systématique dans la feuille "item" (càd prendre en considération les nombres ET les combinaisons de chiffres/lettres) ?

Pour répondre à ta question concernant Find(oRge.Value, , , xlWhole) : les espaces entre les virgules signifient que l'on utilise les valeurs par défaut pour les paramètres "After" et "LookIn" (voir aide VBA). Pour le paramètre "LookAt", la valeur xlWhole signifie que l'on recherche la cellule entière. Ici l'utilisation de la valeur par défaut (xlPart) n'était pas possible, car dans ce cas la recherche de la valeur 637, par exemple, aurait conduit à trouver deux enregistrements dans la feuille "item" (637 et 1637).


Slts

wally
 

Discussions similaires

Réponses
6
Affichages
312

Statistiques des forums

Discussions
314 162
Messages
2 106 604
Membres
109 639
dernier inscrit
Phil1860