sélection auto de chiffres

Phil

XLDnaute Nouveau
Bonjour à tous le Forum

Voici mon problème
Dans une colonne de chiffres, je voudrais pouvoir selectionner les chiffres inférieur à 100 pour pouvoir les exporter dans une autre feuille
1 à exporter
2 à exporter
3 à exporter
55 à exporter
120 Ce ne numéro ne doit pas etre pris en compte
101 Ce ne numéro ne doit pas etre pris en compte
53 à exporter
4 à exporter
152 Ce ne numéro ne doit pas etre pris en compte
9 à exporter
189 Ce ne numéro ne doit pas etre pris en compte

Si cela pouvait fonctionner en VBA par un simple clic sur un bouton ce serait super.

Merci de votre aide
 

Hellboy

XLDnaute Accro
Bonsoir Phil

Voici ce qui fera ton affaire j'espère:
Code:
Private Sub CommandButton1_Click()
Dim Cell As Range
Dim intLigne As Integer
With Worksheets('Copie_100')
    For Each Cell In Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row, 1))
        If Cell.Value < 100 Then
           intLigne = intLigne + 1
           .Cells(intLigne, 1) = Cell
        End If
    Next Cell
End With
End Sub

[file name=Moinde100.zip size=9185]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Moinde100.zip[/file]
 

Pièces jointes

  • Moinde100.zip
    9 KB · Affichages: 12

ThomasR

XLDnaute Occasionnel
Bonsoir Hellboy, Phil,

Hellboy, puis je à travers ce fils te demander de me decrire ce bout de code (ou qqu'un autre :) )

Code:
Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row, 1))

car j'aime lire les postes et voir comment j'aurai fait afin de m'améliorer.

mais comme beaucoup de debutant (je pense) je me suis arrété à l'utilisation des boucle for i qui pour moi sont plus simple à penser

exemple :
Sub toot()
Dim u As Integer
For i = 1 To Sheets(1).Range('A6500').End(xlUp).Row
If Sheets(1).Range('a' & i).Value < 100 Then
u = Sheets(2).Range('A65000').End(xlUp).Row + 1
Sheets(2).Range('a' & u) = Sheets(1).Range('a' & i).Value
End If
Next i
End Sub

qui marche mais pas terible car si je clique plusieur x j'ai des doublon et si je veux corriger ce bug je dois encore ajouter une boucle For to pour regarder dans la sheet(2) .

face à ce petit bout de code qu'il ta falu pour un truck qui ne fait pas de doublon. je suis admiratif et curieux . (si tu veux me commenter tout le code je serais ravi :p .

D'avance merci
Thomas®
 

Hellboy

XLDnaute Accro
Bonsoir Thomas®

Mais si, tu puis je.

Il existe plusieurs façon de pointer sur une cellule.
Range('B4') ou
Cells(4,2): c-a-d No de (ligne, colonne)
Je préfère utiliser la deuxième plus souvent parce qu' elle utilise que des nombres. Plus de 'flexibilité' ou plus facile a utiliser avec des variables compteur par exemple.

Maintenant, lorsque l'on veut avoir un plage de données avec Range on écrit par exemple: Range('B4:D22'). Si il faut que tu veuille mettre des variable ds cet énoncé, tu dois faire des pieds et des main pour y arriver. Je ne te t'en dis pas plus la dessus. Maintenant, pour obtenir la même plage mais avec Cells tu dois l'écrire ainsi:
Range(Cells(4,2), Cells(22,4)) 'n'oublie pas (Ligne, Colonne)'

Bon, la partie Cells(65536, 1).End(xlUp).Row, c'est l'équivalent de faire dans le chiffier Ctrl + Fleche vers le Bas. Et si tu pars de la derniere cellule de la colonne A soit la 65536, tu ferais Crtl + Fleche vers le Haut. Donc ça sert a trouver la premiere ou derniere instance ( cellule) de ta plage. Très pratique. Donc pour reproduire cela en VBA tu écris: Cells(65536, 1).End(xlUp) et une fois faite, ce que cette action cherche c'est le no de la ligne. '.Row'


Pour ce qui est du reste du code, j'espere que les pro vont me corriger si je ne donne pas les bonnes informations. Merci a l'avance.

Cette ligne With Worksheets('Copie_100')
C'est comme dire de mettre en mémoire cette feuille.

Dans mon exemple j'utilise une boucle 'For Each ' qui vient a dire Pour chaque. Normalement on pourrais exprimer cette boucle comme ceci: Pour chaque élément (éléments que tu dois les définir comme Cell ds mon ex) dans ceci (ds mon ex une plage de données) tu fera les choses suivantes. Et bien sur Next élément. En passant, une des avantages de cette boucles consiste a ne pas utiliser de compteur supplémentaires. Les compteurs ralentissent une boucle. J'ai faillit oublier. Yu vois que je ne pointe jamais sur la 'feuil1'. Ce n'est pas nécessairement une bonne chose. VBA suppose que je pointe sur la feuille active en l,occurence la 'Feuil1' Si, a un moment tu fais du code ou tu dois pointer dans un fichier qui contient 30 feuilles alors.... Pour bien faire j'aurais du ecrire:
Code:
Worsheets('Feuil1').Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row, 1))
Ceci dit, pour la partie du if je crois que ça va pour toi. La partie qui dois te tracasser est probablement celle-ci:
Code:
.Cells(intLigne, 1) = Cell
(C'est long écrire ! pffff)
Au début je t'ai dis que j'ai dis ds le code de mettre en mémoire la feuille Copie_100 et bien s'est ici que ça sert. En gros j'aurais pu écrire:
Code:
Worksheets('Copie_100').Cells(intLigne, 1) = Cell

Et finalement, la variable Cell que j'ai déclarer comme Range, si tu la met comme variable espion et que tu vas voir dedans, tu verra quel ne contient pas que la valeur d'une cellule, mais d'ou elle vient .... etc.



Je pourrais en écrire d'avantage, mais je suis essouflé. Plus simple sur le chat technique.

Si il y a autre chose tu me le dis.
 

andré

XLDnaute Barbatruc
Salut,

Et pourquoi pas par formule, tout en triant les nombres ?

La liste à partir de la cellule A1 en Feuil1

En Feuil2, sur la ligne 1 (n'importe quelle colonne) :
=SI(LIGNE()>NB.SI(Feuil1!A:A;'<'&100);'';PETITE.VALEUR(Feuil1!A:A;LIGNE()))

Ândré.
 

ThomasR

XLDnaute Occasionnel
Bonjour andré, Phil, Hellboy,

Merci Hellboy pour le temps que tu m'as consacré.

ceci est plus claire maintenant.

surtout pour la feuille active non énoncé car c'est là ou je bloquais le plus.

grace à tes explication j'ai capté pourquoi ma macro fesait des doublon

Sub toot()
Dim u As Integer
For i = 1 To Sheets(1).Range('A6500').End(xlUp).Row
If Sheets(1).Range('a' & i).Value < 100 Then
u = u + 1
Sheets(2).Range('a' & u) = Sheets(1).Range('a' & i).Value
End If
Next i
End Sub

sinon le cells() permet de boulé en ligne et en collone contrairement a range qui ne boucle quand ligne.

je vais essayer de me mettre à ce genre de boucle for each (je ne vous parle pas des do loop, while wend, que je n'ai jamais utilisé!!)
chaque chose en son temps.

en tt cas merci pour toutes ces info
Thomas®
 

Hellboy

XLDnaute Accro
Bonjour Thomas®

Pour ce qui est des boucle Do, While, se sont des boucles qui n'utilise pas de compteur comme condition de sortie. Tu peux en insérer dedans des conditions (IF) qui te permettre de sortir de la. En passant, il existe une commande qui permet de sortir d'une boucle avant la fin. Exit. Tu peux faire un Exit Do, ou encore Exit For et même Exit Sub. Ceci dis, La valeur de ces boucles te permettent de passer en paramettre une condition logique qui dicte la boucle quand elle doit se terminer. La réponse de cette condition peut être soit TRUE ou FALSE. Donc deux exemple très simple:

Code:
Do
  x = x + 1
Loop Until x = 3

While x < 3
  x = x + 1
Wend


Bon, je t'en donne volontier un autre bout une autre fois.
 

ThomasR

XLDnaute Occasionnel
re,

encore merci Hellboy, effectivement je pense qu'a l'occation j'aimerais reprendre ce genre d'info

car là j'ai compris que grace à des do loop ou While Wend, je vais pouvoir sortir d'une boucle en limitant un compteur ou autre.

mais je n'ai pas compris la difference entre ses boucles car j'imagine que cela doit etre plus pratique d'utiliser l'une plutot que l'autre selon le contexte.

@+
Thomas®
 

Hellboy

XLDnaute Accro
re

Et bien je ne suis pas pro, mais ce que je peux te dire est que l'une vérifie la condition avant de rentrer dans la boucle et l'autre le fait à la sortie. Je crois que l'avantage dépend plus du contexte.
Si je reprend les exemples tu va comprendre:

Code:
Dim x As Integer
x = 3
While x < 3
      x = x + 1
Wend

Do
    x = x + 1
Loop Until x > 2

Donc dans le premier cas vu que x vaut déjà trois, on ne va pas dans la boucle.Par contre dans le deuxième cas on rentre dans la boucle.
Si on dit que la logique est d'exécuter x = x + 1 seulement si il est inférieur a trois, alors le choix de la deuxième boucle serait mauvais.

a+
 

Discussions similaires

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 977
dernier inscrit
Hermet