Besoin d'aide pour sélectionner des lignes répondant à une condition

bih36 Messages postés 3 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 22 novembre 2005 - 18 nov. 2005 à 15:44
bih36 Messages postés 3 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 22 novembre 2005 - 22 nov. 2005 à 14:09
Bonjour,

Je suis débutant en vba et j'aurais vraiment besoin d'un coup de main.
Voilà, je cherche à séparer des lignes d'un fichier si elles répondent à une condition afin de les coller dans une autre feuille pour traitement. Tout marche très bien sauf si le nombre de lignes est supérieur à 40.

Voici le code :

For z = 10 To 1000


Worksheets("un").Select
Range("B:B").Activate
For Each cll In Selection If cll.Value z Then plg plg & cll.Row() & ":" & cll.Row() & ","
Next cll
If Len(plg) > 0 Then Range(Left(plg, Len(plg) - 1)).Select

l'erreur qui se produit quand le nombre de lignes est supérieur à 40 est une erreur d'éxécution 1009 (la méthode range de l'objet global a echoué).

Pouvez vous svp m'aider sur la résolution de cette erreur ou m'aider à trouver un moyen de récupérer le N° de la première et de la dernière ligne répondant à la condition afin de faire un range beaucoup plus court ?

Merci d'avance.

6 réponses

jpleroisse Messages postés 1788 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 11 mars 2006 27
18 nov. 2005 à 16:26
Bonjour,

Je voudrais bien t'aider, mais je ne comprend pas ton code.(il ne doit
pas être complet, car je ne vois pas de déclaration de variable).

C'est quoi plg, quelle est la condition ?

Explique un peu mieux ce que le code doit faire.



jpleroisse
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
18 nov. 2005 à 23:53
Lut,
Je présume que tu veux faire une sélection de plage multiple d'aprés ton code.
Je pense que tu as une limitation interne à excel mais pas sur ......(ta chaine string envoyer en paramètre)
Utilises plutôt des plages et la méthode Union comme décris ci-dessous

Dim xlRange As Range


Dim xlTempR As Range


Dim cll As Range: Dim LastRow As Long


'*** Juste pour éviter de faire un calcul sur toutes les lignes


LastRow = Cells(Cells.Rows.Count, "B" ).End(xlUp).Row


With Worksheets( "un" )


For Each cll In .Range( "B1:B" & LastRow)


'*** Ici on travaille avec des plages et la méthode Union


If cll.Value = z Then


If xlRange Is Nothing Then


Set xlRange = cll


Else


If xlRange.Areas.Count > 0 Then


Set xlRange = Union(xlRange, cll)


End If


End If


End If


Next


End With


xlRange.Select

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
bih36 Messages postés 3 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 22 novembre 2005
21 nov. 2005 à 10:01
Salut,

Merci bcp d'avoir pris le temps de répondre. J'ai modifié mon code comme tu me l'as dis :
Sub lignes()


Dim xlrange As Range
Dim xltempR As Range
Dim cll As Range: Dim lastRow As Long


For z = 1 To 3000


lastRow = Cells(Cells.Rows.Count, "B").End(xlUp).Row
With Worksheets("un")


For Each cll In .Range("B1:B" & lastRow)
If cll.Value = z Then
If xlrange Is Nothing Then
Set xlrange = cll
Else
If xlrange.Areas.Count > 0 Then
Set xlrange = Union(xlrange, cll)
End If

End If

End If
Next


End With


xlrange.Select


Selection.Copy
ActiveSheet.Paste Destination:=Worksheets("deux").Cells(1, 1)
Application.CutCopyMode = False
***


Next z
End Sub

En fait, j'ai une autre macro au niveau des *** qui permet de traiter mes données avant de les envoyer dans une autre feuille. Chaque valeur z est donc traitée séparement.

Cependant j'ai deux petits problèmes : - j'aimerais sélectionner les lignes entières et il ne sélectionne que les cellules. J'ai essayé de modifier le code mais sans succès.

- Il garde en mémoire la sélection précédente quand il passe au z suivant. Je ne sais pas comment effacer la valeur de xlrange.

Peux tu stp me dire quelles modifs je dois faire pour arriver à faire cela.

Je te remercie d'avance
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
21 nov. 2005 à 23:35
Re,
Pour sélectionner la ligne complète changes le code comme ci-dessous

If cll.Value = z
Then
If xlRange Is Nothing Then


Set xlRange = cll.EntireRow


Else


Pour vider xlRange ajoutes ceci


Selection.Copy
ActiveSheet.Paste Destination:=Worksheets("deux").Cells(1, 1)
Application.CutCopyMode = False
Set xlRange = Nothing



Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
21 nov. 2005 à 23:45
Oups,
If xlrange Is Nothing Then
Set xlrange = cll.EntireRow
Else
If xlrange.Areas.Count > 0 Then
Set xlrange = Union(xlrange, cll.EntireRow)
End If

tu peux même te passer de la condition If xlRange.Areas.count ........ car en fait si elle n'est pas égale a nothing elle comporte au moins une plage donc c'est redondant. Mais bon qui peu le plus peu le moins.

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
bih36 Messages postés 3 Date d'inscription jeudi 10 novembre 2005 Statut Membre Dernière intervention 22 novembre 2005
22 nov. 2005 à 14:09
Super,

tout marche impec. Merci beaucoup pour ton aide.

@ +
0
Rejoignez-nous