Debut & fin de plage pour une colonne

Noha-Diak Messages postés 25 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -
Bonjour, je sollicite votre aide, mon problème est le suivant : en VBA sur une feuille de calcul excel j'aimerais connaitre sur la colonne A la première cellule qui contient le nom "aaa" et la dernier cellule qui contient le nom "aaa" afin d'optimiser mon programme qui contient + de 7000 ligne, l'objectif est que lorsque le nom contenu dans la colonne A n'est plus identique on passe a suivant nom "bbb" qui correspond a la suivante plage, le fichier est trié de A à Z pour cette colonne.

la question est de savoir s'il exis
te une fonctionnalité permettant cela autre qu'une condition merci

4 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Noha, bonjour le forum,

    Double-clique sur n'importe quelle cellule de la colonne A, une message indique la première et la dernière ligne contenant la valeur double-cliquée. Code à placer dans le composant de l'onglet concerné :

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Dim LD As Long 'déclare la variable LD (Ligne du Début)
    Dim LF As Long 'déclare la variable LF (Ligne de Fin)
    
    If Target.Column <> 1 Then Exit Sub 'si le boucle-clic a lieu ailleurs qu'en colonne A, sort de la procédure
    If Target.Value = "" Then Exit Sub 'si le double-clic a lieur dans une celluel vide, sort de la procédure
    Cancel = True 'annule le mode [édition] lié au double-clic
    TV = Range("A1").CurrentRegion 'définit le tableau des valeurs TV
    For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs
        'si la donnée ligne I colonne 1 de TV est égale à la valeur de la cellule double-cliquée, définit la ligne de debut LD et sort de la boucle
        If TV(I, 1) = Target.Value Then LD = I: Exit For
    Next I 'prochaine ligne de la boucle
    For I = LD To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs (en partant de la ligne LD)
        If I = UBound(TV, 1) Then LF = I 'si I est la derniere ligne du tableau des valeur, définit la ligne  de fin LF
        'si la donnée ligne I colonne 1 de TV est différente de la valeur de la cellule double-cliquée, définit la ligne de fin LF (I-1) et sort de la boucle
        If TV(I, 1) <> Target.Value Then LF = I - 1: Exit For
    Next I 'prochaine ligne de la boucle
    MsgBox LD & " / " & LF 'message qui affiche la lgne de début et la ligne de fin
    End Sub

    0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour à tous les deux

    Avec deux fonctions
    Public Function premli(plage As Range, s As String) As Long
    Dim obj As Object
    premli = 0
    Set obj = plage.Find(s, , , xlWhole, , xlNext)
    If Not obj Is Nothing Then premli = obj.Row
    End Function
    
    Public Function dernli(plage As Range, s As String) As Long
    Dim obj As Object
    dernli = 0
    Set obj = plage.Find(s, , , xlWhole, , xlPrevious)
    If Not obj Is Nothing Then dernli = obj.Row
    End Function

    Cdlmnt
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Et si tu veux la liste des couples (première ligne, dernière ligne) pou un texte donné
    https://www.cjoint.com/c/HJsoEe6jyfB

    Cdlmnt
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Hello,
      J'ai l'impression que ta fonction lpd ne marche pas correctement lorsque les données sont triées par ordre A->Z (comme indiqué dans la demande de l'utilisateur).
      Il m'ajoute systématiquement une plage supplémentaire (la première ligne vide du tableau) pour les aaa et les bbb
      et pour les ccc il retire 1 à la dernière ligne


      0
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Salut jordane45

    C'était plus qu'une impression ;-)
    https://www.cjoint.com/c/HJsqX6smyiB

    Cdlmnt
    0