probleme de selection

M

mathieu

Guest
bonjour a tous

j ai un probleme pour selectionner une ligne et la copier coller sur une autre feuille.

voila le code que je fait pour balayer ma feuille :

Sub facturation()
Dim L As Long
Dim i As Integer

With Sheets('CAP ALTERN EVOL 16-JUIN 2011')
L = .Range('N65536').End(xlUp).Row
For i = 2 To L
If Cells(i, 9).Value = '31' Then
Cells(i, 9).EntireRow.Select
Selection.Copy
Sheets('facturation').Select
Sheets('facturation').Cells(1, 1).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell = .Range('N65536').End(xlUp).Offset(1, 0).Row
End If
Next i
End With
End Sub

ce que je souhaite c'est que si la valeur de la colonne 9 est 31 alors je selectionne toute la ligne je la copie et je la colle dans la feuiille facturation.
je veux qu une fois que toute la feuille a été balayée toutes les lignes selectionnées soient collées les unes a la suite des autres sur la feuille facturation.


Donc si vous avez des idées ou si vous voyez ou est mon erreur je vous ecoute.

Bonne journée et merci d avance.


@+ Mat
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour

En premier lieu les sélections sont totalement inutiles et couteuses en temps. Deuxièmement, quand tu utilises with n'oublie pas les points sinon les adresses seront liées à la feuille active. Troisièmement, utilises toujours des longs pour travailler sur des numéros de ligne, les integer ne vont que jusqu'à 32767 et provoqueront un plantage sur la 32768 e ligne. Travailler avec des longs dans ce cas garantit que le code sera utilisable sur de tels tableaux.

Cordialement, A+


Code:
Sub facturation()
Dim L As Long
Dim i As Long

With Sheets('CAP ALTERN EVOL 16-JUIN 2011')
L = .Range('N65536').End(xlUp).Row
For i = 2 To L
If .Cells(i, 9).Value = 31 Then
.Cells(i, 9).EntireRow.Copy Destination:=Sheets('facturation').Range('N65536').End(xlUp).Offset(1, 0).EntireRow
End If
Next i
End With
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Mathieu, bonjour le forum,

voici ta macro un peu modifiée et commentée. J'espère que ça te conviendra. Tiens-moi au courant.


Sub facturation()
Dim L As Long 'déclare la variable L
Dim i As Long 'déclare la variable i (si L peut être Long alors i aussi !)
Dim dest As Range 'déclare la variable dest

'définit la variable dest (A1 si A1 est vide ou première ligne vide de la colonne A)
If Sheets('facturation').Range('A1').Value = '' Then
Set dest = Sheets('facturation').Range('A1')
Else
Set dest = Sheets('facturation').Range('AS65536').End(xlUp).Offset(1, 0)
End If

With Sheets('CAP ALTERN EVOL 16-JUIN 2011')
L = .Range('N65536').End(xlUp).Row 'définit la variable L
For i = 2 To L 'boucle sur toutes les cellules de la plage I2:I_L
'Attention ! Si tu recherches une valeur numérique il ne faut pas de guillements
'si la colonne I est formaté comme Texte alors remets les guillemets à 31
If .Cells(i, 9).Value = 31 Then 'condition : si la valeur de la cellule est egale à 31
.Cells(i, 9).EntireRow.Copy Destination:=dest 'copie et colle la ligne entière
Set dest = dest.Offset(1, 0) 'redéfinit la variable dest (une ligne en dessous)
End If 'fin de la condition
Next i 'prochaine cellule de la boucle
End With
End Sub

Édition

Ooops ! Bonjour Yeahou. Pas frais pas frais... encore une fois.

Message édité par: Robert, à: 15/07/2005 16:04
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re bonjour

c'est rien Robert, tu proposes presque la même solution sauf que
1-Sheets('facturation').Range('AS65536') ce qui doit être une erreur
2-tu copie une ligne entière sur dest qui n'est de fait pas la première cellule de la premiere colonne de la ligne quand ce n'est pas la première copie et provoquera donc un plantage que la colonne AS soit vide ou pas.

Cela implique que ton code ne fonctionnera qu'une fois

de toute façon, rien n'indiquait dans le message original que la colonne A contenait des valeurs puisque c'est la colonne N qui servait de référence.

la, tu n'as pas testé ! ;)

Cordialement, A+

Ps: d'ailleurs, rien n'indique que la colonne N contient des valeurs ailleurs qu'en dernière ligne de la colonne d'origine :lol: , la seule valeur dont on soit sur, c'est celle de la colonne I, mon code doit donc être modifié comme suit
Code:
Sub facturation()
Dim L As Long
Dim i As Long

With Sheets('CAP ALTERN EVOL 16-JUIN 2011')
L = .Range('N65536').End(xlUp).Row
For i = 2 To L
If .Cells(i, 9).Value = 31 Then
.Cells(i, 9).EntireRow.Copy Destination:=Sheets('facturation').Range('I65536').End(xlUp).Offset(1, 0).EntireRow
End If
Next i
End With
End Sub

Message édité par: yeahou, à: 15/07/2005 16:29
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Oui bien vu Yeahou ! Il faut bien évidemment corriger :
Set dest = Sheets('facturation').Range('A
S65536').End(xlUp).Offset(1, 0)
par
Set dest = Sheets('facturation').Range('A65536').End(xlUp).Offset(1, 0).

Mais tu es une mauvaise langue (loule) quand tu dis que j'avais pas testé car j'avais bien testé mais comme A1 (facturation) était vide ça m'a définit Dest=A1 puis la boucle a fait le reste dest = dest.Offset(1, 0).

Merci pour ta rectification.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re

dis donc, Robert, il y a un truc bizarre avec tes posts, quand je les recoie sur mon mail, ils sont toujours vides, je dois venir sur le forum pour voir tes réponses. Pas normal ça ! surtout que tu es le seul avec qui cela m'arrive!

A+
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Ben Yeahou, je ne sais quoi te dire ! Pourquoi recopies-tu les posts dans un e-mail ? Moi je ne me sers que du forum pour consulter les posts et jamais des e-mails. N'aurais-tu pas coché l'option «Remplir l'e-mail proportionnellement au cerveau de l'expéditeur» ? C'est peut-être l'explication...
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re bonjour Robert

Je n'avais pas vu cette option, elle est récente sans doute. ;)
Au vu de la qualité de tes réponses, heureusement que ton cerveau n'est pas plus grand, sinon je ne pourrais pas lutter.
Pour répondre à ta question, je ne reste pas connecté en permanence sur XLD mais plutôt une demi heure par ci une demi heure par la (l'ADSL n'est pas encore arrivé dans ma campagne). Alors je coche toujours l'abonnement aux fils auquels je réponds, cela me permet de les suivre facilement, c'est une facilité du profil que j'apprécie.
Pour tes posts, je penche pour un bug, utilises tu un utilitaire pour répondre sur le forum ? peut être que cela vient de ton profil ?

Bien cordialement, A+
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 595
Messages
2 090 094
Membres
104 374
dernier inscrit
cheick.coulibaly@dcsmali.