Sélection d'une plage jusqu'à une certaine valeur

Bonjour,

J'aimerais automatiser l'utilisation de données d'un tableau à un autre via une macro simple. Etant débutant en VBA, je suis assez vite bloqué notamment pour exécuter une fonction qui visiblement n'est pas souvent utilisée...

Je cherche à copier certaines colonnes de mon tableau initial dans un autre fichier qui a une certaine mise en page pour impression ensuite. J'utilisais jusqu'à present des formules du type RehercheV avec des Si pour faire mes copier/coller.

Exemple: (voir tableau simplifié)

Mon problème est d'abord de lui demander de copier une plage de cellule d'une cellule précise à une autre. C'est à dire de ne pas copier la totalité de la colonne mais de s'arrêter lorsqu'il tombe sur une valeur ou un texte (type "FIN").

Si des personnes ont déjà eu besoin de faire ce type de manipulation je suis intéressé par une solution!

Merci d'avance

Rolf

39classeur1.xlsx (9.24 Ko)

bonjour,

code adapté à ton exemple.

Sub aargh()
    d = 1 'première ligne à tester
    dl = Cells(Rows.Count, 2).End(xlUp).Row 'dernière ligne utilisée en colonne 2
    Do Until d >= dl Or Cells(d, 2) = 6 ' tant qu'on a pas trouvé un 6 ou qu'on n'est pas à la fin
        d = d + 1 'on incrémente le n° de ligne
    Loop
    Range("B1").Resize(d, 4).Copy Range("M1") 'copie en colonne M
End Sub

Bonjour h2so4,

Merci beaucoup pour cette réponse, cela fonctionne parfaitement!

Pour mon information je ne suis pas sûr de bien comprendre la ligne suivante:

dl = Cells(Rows.Count, 2).End(xlUp).Row

En effet, je ne comprends pas bien la suite Cells().End().Row?

Merci!

bonjour,

dl = Cells(Rows.Count, 2).End(xlUp).Row

permet de trouver la ligne (row) de la dernière cellule (end(xlup)) de la colonne B(2) qui contient une valeur en partant du bas de la feuille (dernière ligne de la feuille = rows.count)

Merci pour les explications,

Cependant, en essayant de continuer à partir de ce code, je me suis rendu compte que la colonne copiée est copiée depuis la première ligne du classeur.

Or lorsque je décale la ligne de départ dans le Range, c'est toute la plage qui est décalée!

Pour faire simple j'ai attaché le fichier et ce que je souhaite faire est donc:

- Trouver le numéro de ligne où je trouve le mot "FIN" depuis la ligne 4 => ok

- Insérer le nombre de lignes comptées dans la feuille 1 à partir de la ligne 4 de la feuille 2 => ok

- Copier les valeurs de la ligne 4 à la ligne FIN - 1 => ici copie depuis la ligne 1 et si je change en appliquant B4 alors la plage copiée va de B4 à B17 au lieu de B14

- Coller cette plage dans les lignes de la feuille 2 créées à cet effet => ok

Si le sujet vous intéresse toujours, je suis preneur d'une bonne solution! :-)

Merci!

16classeur2.xlsm (16.12 Ko)

bonjour,

une proposition

Sub Test()
    d = 4 'première ligne à tester
    dl = Cells(Rows.Count, 2).End(xlUp).Row 'dernière ligne utilisée en colonne 2
    Do Until d >= dl Or Cells(d, 2) = "FIN" ' tant qu'on a pas trouvé le mot FIN ou qu'on n'est pas à la fin
        d = d + 1 'on incrémente le n° de ligne

    Loop

    Range("B4").Resize(d - 3, 2).Copy Feuil2.Range("B4") 'copie les colonnes B et C de la feuille 1 (à partir de B4) dans la feuille 2 en colonne B à partir de B4
    ' ou
    Range("B4:C" & dl).Copy Feuil2.Range("B4") 'donne le même résultat que l'instruction précédente
End Sub

Bonjour,

avec ce code à la fin, le problème persiste, à savoir que les colonnes sont copiées et collées à partir de la cellule B4 de la feuille 2 et non insérées.

Ce que je souhaite c'est qu'avant de coller les cellules copiées, qu'un nombre de lignes vides correspondant au nombre de lignes copiées soient insérées en ligne 4, puis les valeurs collées à partir de ma cellule B4. C'est pour cette raison que j'essaye d'utiliser Insert Shift:=xlDown .

Avec .Rows(4 & ":" & dl). Insert Shift:=xlDown, 13 lignes sont insérées au lieu de 10 lignes...

Bonjour,

ok j'avais mal compris.

dl est la dernière ligne utilisée de la feuille, d est celle qui contient le mot "FIN"

donc utilise d au lieu de dl dans l'instruction

 .Rows(4 & ":" & dl). Insert Shift:=xlDown

donc

 .Rows(4 & ":" & d). Insert Shift:=xlDown

Super merci beaucoup, l'ensemble fait tout à fait ce que je souhaitais!

Encore merci!

Rechercher des sujets similaires à "selection plage certaine valeur"