Copier/Coller un bloc de ligne avec exception

Fermé
JF - 8 janv. 2010 à 20:19
 JF - 11 janv. 2010 à 17:33
Bonjour,

En fait, je suis présentement assez embêté. J'essaie de faire une macro qui sélection un bloc de ligne en fonction d'une colonne. Il y a 3 blocs de données que je dois ainsi coller ailleurs.

Au départ, je fais un tri sur les données de mon fichier source.

''Sub Préparation_fichier()
Workbooks.Open Filename:="V:\SST\BRI.xls"
Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Sort Key1:=Range("Q2"), Order1:=xlDescending, Key2:=Range("E2") _
, Order2:=xlDescending, Header:=xlNo, OrderCustom:=1, MatchCase:=False _
, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
xlSortNormal

End Sub''

Ceci me permet de trier les quelques 13000 lignes en 3 blocs de données. J'obtiens quelque chose qui ressemble à l'exemple

Exemple :
Colonne Q
Ligne 1 CCS
Ligne 2 CCS
Ligne 3 CCS
Ligne 4 IB U
Ligne 5 IB U
Ligne 6 IB U
Ligne 7 IB U
Ligne 8 IB C
Ligne 9 IB C
Ligne 10 IB C

Je veux en venir à sélectionner le bloc de lignes(Colonne A à U) contenant la données CCS à la colonne Q pour ensuite aller la coller dans un autre fichier.

Je n'ai pas de problème avec le code pour le copier coller dans le fichier... Mon problème se situe au niveau de la sélection à copier en fonction d'une valeur.

Quelqu-Un pense être en mesure de m'aider

MERCI énormément!

JF
A voir également:

5 réponses

eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
8 janv. 2010 à 21:06
Bonsoir,

une boucle pour avoir ligne de début et ligne de fin :
Sub test()
    Dim c As Range, ligdeb As Long, ligfin As Long, flag As Boolean
    For Each c In Range([Q2], [Q65536].End(xlUp))
        If c = "CCS" And Not flag Then
                ligdeb = c.Row
                flag = True
        End If
        If c <> "CCS" And flag Then
                ligfin = c.Row - 1
                Exit For
        End If
    Next c
End Sub

eric
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
8 janv. 2010 à 21:19
Re,

une autre façon sans doute plus rapide :
Sub test()
    Dim ligdeb As Long, ligfin As Long
    On Error GoTo fin
    ligfin = Application.WorksheetFunction.Match("CCS", [Q1:Q100])
    ligdeb = ligfin - Application.WorksheetFunction.CountIf([Q:Q], "CCS") + 1
fin:
End Sub

Bien sûr dans les 2 cas il faut traiter l'erreur si CCS est absent
eric
0
Merci la loop fonctionne a merveille. Par contre, j'ai un peu de difficulté à la faire «fiter» dans la sélection. Est-ce que je dois y aller par une fonction du genre :

Range("ligdeb:ligfin").Select (ce qui me donne une erreur de range évidemment)

ou il y a une façon plus simple de faire la sélection une fois que les lignes ont été définies
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
8 janv. 2010 à 22:55
Si c'est pour les coller ailleurs pas besoin de .select, ça ralenti pour rien...
Ex:
Range("A" & ligdeb, "U" & ligfin).Copy (Workbooks("Classeur3").Worksheets("Feuil1").[A2])
si tu veux coller dans une position fixe
ou
Range("A" & ligdeb, "U" & ligfin).Copy (Workbooks("Classeur3").Worksheets("Feuil1").[A65536].end(xlup))
si tu veux coller dans la 1ère cellule vide de A
eric
0

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

Posez votre question
Merci beaucoup Éric

Ca fonctionne à merveille!
0