Limiter End(xlup) à une plage

Bonjour à tous,

Nouvel utilisateur de VBA sur Excel 2010, j’ai déjà trouvé pas mal d’informations sur ce forum, et je tiens à remercier les utilisateurs pour cela.

Ma problématique est la suivante, je bloque dans l’écriture d’une macro devant ajouter successivement des références retenues dans une liste à des tableaux. Ces tableaux sont identiques mais ont une taille limitée à 22 lignes, ils ne peuvent donc contenir que 22 références chacun. Il est donc nécessaire de faire appel à un tableau supplémentaire toute les 22 références.

Sur la feuille 1 se trouve la liste des références, à chaque référence est associée une case à cocher renvoyant à un VRAI ou FAUX permettant d’identifier la référence comme sélectionnée ou non. Cette information apparait dans l’alignement de la référence en sus d’informations propre (XXXX, YYYYY, ZZZZZ dans le fichier exemple )

Sur la feuille 2 se trouve des tableaux identiques positionnés les uns en dessous des autres. Ces tableaux sont à compléter via la macro. (Le nombre de tableau sera variable en fonction du nombre de références sélectionnées)

1-) Une fois l’ensemble des références retenues cochées, on déclenche la macro. Cette dernière test la colonne « sélection » (Les VRAI / FAUX). Lorsque la cellule testée est VRAI, la macro ajoute la référence (et les informations associées) dans les tableaux de la feuille 2.

2-) La macro est une boucle, elle doit ajouter successivement les références retenues aux tableaux en commençant par le premier, puis lorsque celui-ci est complet en passant au deuxième et ainsi de suite.

C’est sur la deuxième partie de ce deuxième point que je bloque. Je souhaitais définir une plage discontinue (les corps à compléter de l’ensemble des tableaux), et utiliser .End(Xlup) pour compléter les tableaux pensant que la manip ne tiendrait compte que de la plage, excluant le reste de la feuille. Perdu !

Mes tableaux contenant des entêtes, le code ne remonte que jusqu’à la première ligne disponible dans le dernier tableau, à partir de là le reste de la macro se réalise presque correctement, à l’exception du moment où la dernière ligne est atteinte et que pour une raison obscure l’entête du tableau se trouve remplacée par une dernière référence.

Questions :

  • Y at-il un moyen pour lier la méthode du .End(xlup) à une plage et seulement à cette plage ? (la recherche de cellule vide se ferait depuis la dernière ligne de la plage et remonterait jusqu’à la première, tout en ignorant les lignes exclues de la plage)
  • Si non voyez-vous un autre moyen de procéder ?
  • Voyez-vous la raison pour laquelle l’entête du tableau est remplacée à la fin ?

Voici mon code :

Sub Ajout_aux_tableaux()

'Hypothèses
Dim Tableaux
Set Tableaux = Sheets("Feuil2").Range("A3:G25,A30:G50")

    'Sélectionne la première cellule de résultat de sélection
    Range("I2").Activate 'la boucle suivante s'exécute à partir de cette cellule

    'Teste le contenu de la cellule active, si celle-ci est vide, sort de la boucle.
    Do Until IsEmpty(ActiveCell)

        'Ajouter la référence  à la commande si la sélection est VRAI
        If ActiveCell.Text = "VRAI" Then
        'Copie la plage correspondant à la ligne de la cellule active
        Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, 8)).Copy Destination:=Tableaux.Cells(49, 1).End(xlUp)(2)
        Else
        End If

        ' Passe à la référence de la ligne suivante
        ActiveCell.Offset(1, 0).Select

    ' Retourne au début de la boucle.
    Loop

End Sub

Je joins également un fichier exemple.

Merci pour l’aide que vous pourriez m’apporter !

Bonjour,

Mieux vaut calculer le n° de ligne. A tester :

Sub lig()
    Dim nbTrue As Long, lig As Long
    nbTrue = Application.CountIf(Sheets("Feuil1").[I:I], True)
    lig = (nbTrue - 1) Mod 22 + 1 'n° de ligne dans le sous-tableau
    lig = (Int((nbTrue - lig) / 22)) * 27 + lig + 2 'n° du tableau * 27 + ligne + 2
End Sub

eric

Merci pour la réponse Eric, je test ça de suite.

Je ne parviens pas à utiliser ce code, pourrais-tu me détailler son fonctionnement ?

Le détail est dans les commentaires.

Je te calculais en fait la ligne pour le dernier vrai puisque je comptais tous les vrais.

Si tu l'intègres dans ta boucle il faut compter les inscriptions à faire et calculer leur ligne au fur et à mesure.

Evite les .select qui ne servent à rien d'autre que ralentir.

Sub inscrire()
    Dim lig As Long, lig2 As Long, nb As Long
    derlig = Cells(Rows.Count, "I").End(xlUp).Row
    For lig = 2 To derlig
        If Cells(lig, "I") Then 
            ' si VRAI
            nb = nb + 1
            lig2 = (nb - 1) Mod 22 + 1 'n° de ligne dans le sous-tableau
            lig2 = (Int((nb - lig2) / 22)) * 27 + lig2 + 2 'n° du tableau * 27 + ligne + 2
            MsgBox "inscrire ligne " & lig2
        End If
    Next lig
End Sub

A tester Feuil1 active

eric

D'accord je bûche dessus alors. J'avais utilisé les .Select parce que la cellule active me permettait notamment de déterminer la plage à copier dans les tableaux, cette plage étant différente à chaque ligne.

Rechercher des sujets similaires à "limiter end xlup plage"