IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Filte automatique: Descendre à la ligne visible suivante si valeur présente [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut Filte automatique: Descendre à la ligne visible suivante si valeur présente
    Bonjour,
    J'ai besoin d'aide apres l'application d'uin filtre automatique je souhaite descendre à la ligne visible suivante si une valeur est présente dans une cellule.
    Si possible je souhaiterais que la macro ne passe pas en revue les lignes non visibles car il y a beaucoup de ligne et l'exécution serait trop longue .

    J’ai la feuille 1-Background (2) (capitalisation, retour expérience) qui possède plusieurs lignes avec pour chaque ligne :
    - un critère de filtres (colonnes C)
    - la valeur de ce critère (colonne D)
    - le résultat (retour expérience) de ce critère/Valeur (colonne N)
          … C            D   …       N
    1    Critère   Valeur    Forecast/Rés
    2    C1            V1             F1
    3    C2            V2             F2
    J’ai la feuille 2 (Match) qui possède plusieurs lignes avec pour chaque ligne un match , ces valeurs de critères, résultat, forecast :
    - Le résultat du match (colonne A), colonne alimentée par l’utilisateur manuellement
    - Le Forecast/Rés (colonne E), colonne alimentée par la macro, si le match rentre dans les critères-Cx et valeur-Vx de la feuille1-Background (2) via le filtre automatique
    - Le match (Colonne D) remplie par l’utilisateur
    - Le critère-C1 (Colonne N) remplie par l’utilisateur
    - Le critère-C2 (Colonne P) remplie par l’utilisateur

           A         …        E          …          D                       N                         P
    1    Résultat     Forecast              Match            Critères C1        Critères C2           
    2         R1           F1+F2                 M1                    V1                      V2                    
    D’un point de vue fonctionnel, une fois que dans la feuille match les utilisateurs ont complété les données (colonne D-Match & N-CritèresC1 & P-CritèresC2) ; La macro doit me permettre de remplir automatiquement la colonne E (Forecast) via la recopie des valeurs F1 ou F2 (forecast/rés-ColonneN).

    A ce jour, j’arrive à :
    - Appliquer les filtres automatiques, c'est-à-dire les critères/valeurs de la feuille 1-Background (2) à la feuille 2 (Match).
    - Descendre à la première ligne visible de la feuille Match

    A ce jour, je n’arrive pas à :
    - Récupérer la valeur F1 de la cellule active feuille 1-Background (2)
    - Additioner la valeur F1 de la cellule active feuille 1-Background (2) dans la cellule active feuille 2 (Match)
    - Descendre à la deuxième ligne visible de la feuille Match si un match est présent.
    - Additioner la valeur F1 de la cellule active feuille 1-Background (2) dans la cellule active feuille 2 (Match)

    Voici le code developpé à ce jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    [1] Sub Forecast()
    [2]‘Déclaration des variables
    [3] Dim ACellB As Range 'cellule active de la feuille Backgrounnd (2)
    [4] Dim ACellBRow As Double 'Row dela Cellule activede la feuille Backgrounnd (2)
    [5] Dim ACellM As Range  'cellule active de la feuille Match
    [6] Dim ACellMRow As Range 'Row dela Cellule activede la feuille Match
    [7] 
    [8] Dim Types As String
    [9] 'C1 pourles criteres
    [10] Dim C1 As String
    [11] Dim C2 As String
    [12] 'DFE Data filter Empty
    [13] Dim DFE As Double
    [14] 'V1 pour le valeur de criteres
    [15] Dim V1 As String
    [16] Dim V2 As String
    [17] 
    [18] Dim MNbRow As Long 'Nombre de ligne dans Match qui réponde aux critères de background
    [19] 
    [20] Worksheets("Background (2)").Select
    [21] Worksheets("Background (2)").AutoFilterMode = False
    [22] 
    [23] With Worksheets("Background (2)")
    [24]         Set rnData = Range("$A$3:$V$3883")
    [25]         With rnData
    [26]     'exclure toutes les stats avec une qté inférieur à G2
    [27]             .AutoFilter Field:=7, Criteria1:=">=" & [$G$2] _
    [28]         , Operator:=xlAnd
    [29]     'Compte le nombre de ligne visible
    [30]             For Each rngarea In .SpecialCells(xlCellTypeVisible).Areas
    [31]                 lcount = lcount + rngarea.Rows.Count
    [32]             Next
    [33] 
    [34]         End With
    [35] 
    [36] End With
    [37]  
    [38] If lcount <> 0 Then
    [39] 'Descendre  à la première ligne visible
    [40] Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
    [41] 
    [42] Else
    [43] 'sinon va au critère R2 exécuter le forecast
    [44] 
    [45] End If
    [46] 'enregistrer les coordonnées de la cellule visible&active
    [47]         Set ACellB = ActiveCell
    [48]         ACellBRow = ActiveCell.Row
    [49]         
    [50] 'Filtre le criterion sur sheet match
    [51]     C1 = ACellB.Offset(0, -14).Value
    [52]     V1 = ACellB.Offset(0, -13).Value
    [53]     C2 = ACellB.Offset(0, -12).Value
    [54]      V2 = ACellB.Offset(0, -11).Value
    [55] 
    [56] 'Coller les valeurs des critère-Background (2) dans le filtre des criteres-Match
    [57]             Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=14, Criteria1:=C1 _
    [58]                , Operator:=xlAnd
    [59]             Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=16, Criteria1:=V1 _
    [60]                , Operator:=xlAnd
    [61] 'Verifier si après application des filtres automatique des matchs répondent au valeurs de critères
    [62]             Worksheets("Match").Select
    [63]             MNbRow = Worksheets("Match").Range("$A$1:$AK$100").Columns(3).SpecialCells(xlCellTypeVisible).Count - 1 'pour ne pas compter la 
    [64] ligne des titres
    [65]                     If MNbRow = 0 Then
    [66]                     'si résultat des filtres dans Match sont vide alors passer à la ligne suivante de Background
    [67]                     'A developper
    [68]                     Else
    [69] 'si des matchs répondent au critères => Descendre  à la première ligne visible
    [70]                     Worksheets("Match").Range("E2", Cells(Rows.Count, "E").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
    [71]  'enregistrer les coordonnées de la cellule visible&active de la sheet Match
    [72]                      Set ACellM = ActiveCell
    [73]                      ACellMRow = ActiveCell.Row
    [74]    
    [75] 'Récupérer la valeur F1 de la cellule active feuille 1-Background (2)
    [76] 'Additioner la valeur résulatat domicile-colonneN de la cellule active feuille 1-Background (2) dans la cellule active feuille 2 (Match) colonne E
    [77]                     With Range("E" & ACellMRow)
    [78]                         .Value = Range("E" & ACellMRow).Value + ACellB.Offset(0, -3).Value
    [79]                     End With
    [80]                     
    [81] 'Descendre à la deuxième ligne visible suivante de la feuille Match si un match est présent.
    [82] 
    [83]                  End If
    [84]             
    [85]             
    [86] End Sub

  2. #2
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    mets ton code entre les balises codes (#)
    et indente le, il est difficile de lire un code qui commence toujours en colonne 1

    On est que de pauvre être humain et faire ce que je te demande nous permet d'avoir une vue plus clair de ton problème
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut
    Désolé,

    Je poste rarement et donc je n'avais pas encore trouvé l'option, désolé
    Donc je reprend
    Bonjour,
    J'ai besoin d'aide apres l'application d'uin filtre automatique je souhaite descendre à la ligne visible suivante si une valeur est présente dans une cellule.
    Si possible je souhaiterais que la macro ne passe pas en revue les lignes non visibles car il y a beaucoup de ligne et l'exécution serait trop longue .

    J’ai la feuille 1-Background (2) (capitalisation, retour expérience) qui possède plusieurs lignes avec pour chaque ligne :
    - un critère de filtres (colonnes C)
    - la valeur de ce critère (colonne D)
    - le résultat (retour expérience) de ce critère/Valeur (colonne N)
    … C D … N
    1 Critère Valeur Forecast/Rés
    2 C1 V1 F1
    3 C2 V2 F2


    J’ai la feuille 2 (Match) qui possède plusieurs lignes avec pour chaque ligne un match , ces valeurs de critères, résultat, forecast :
    - Le résultat du match (colonne A), colonne alimentée par l’utilisateur manuellement
    - Le Forecast/Rés (colonne E), colonne alimentée par la macro, si le match rentre dans les critères-Cx et valeur-Vx de la feuille1-Background (2) via le filtre automatique
    - Le match (Colonne D) remplie par l’utilisateur
    - Le critère-C1 (Colonne N) remplie par l’utilisateur
    - Le critère-C2 (Colonne P) remplie par l’utilisateur

    A … E … D N P
    1 Résultat Forecast Match Critères C1 Critères C2
    2 R1 F1+F2 M1 V1 V2

    D’un point de vue fonctionnel, une fois que dans la feuille match les utilisateurs ont complété les données (colonne D-Match & N-CritèresC1 & P-CritèresC2) ; La macro doit me permettre de remplir automatiquement la colonne E (Forecast) via la recopie des valeurs F1 ou F2 (forecast/rés-ColonneN).

    A ce jour, j’arrive à :
    - Appliquer les filtres automatiques, c'est-à-dire les critères/valeurs de la feuille 1-Background (2) à la feuille 2 (Match).
    - Descendre à la première ligne visible de la feuille Match

    A ce jour, je n’arrive pas à :
    - Descendre à la deuxième ligne visible de la feuille Match si un match est présent.

    Voici le code developpé à ce jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Sub Forecast()
     ‘Déclaration des variables
    Dim ACellB As Range 'cellule active de la feuille Backgrounnd (2)
    Dim ACellBRow As Double 'Row dela Cellule activede la feuille Backgrounnd (2)
    Dim ACellM As Range  'cellule active de la feuille Match
    Dim ACellMRow As Range 'Row dela Cellule activede la feuille Match
     
    Dim Types As String
    'C1 pourles criteres
    Dim C1 As String
    Dim C2 As String
    'DFE Data filter Empty
    Dim DFE As Double
    'V1 pour le valeur de criteres
    Dim V1 As String
    Dim V2 As String
     
    Dim MNbRow As Long 'Nombre de ligne dans Match qui réponde aux critères de background
     
    Worksheets("Background (2)").Select
    Worksheets("Background (2)").AutoFilterMode = False
     
    With Worksheets("Background (2)")
             Set rnData = Range("$A$3:$V$3883")
             With rnData
         'exclure toutes les stats avec une qté inférieur à G2
                 .AutoFilter Field:=7, Criteria1:=">=" & [$G$2] _
             , Operator:=xlAnd
         'Compte le nombre de ligne visible
                 For Each rngarea In .SpecialCells(xlCellTypeVisible).Areas
                     lcount = lcount + rngarea.Rows.Count
                 Next
     
             End With
     
    End With
     
    If lcount <> 0 Then
    'Descendre  à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
     
    Else
    'sinon va au critère R2 exécuter le forecast
     
    End If
    'enregistrer les coordonnées de la cellule visible&active
             Set ACellB = ActiveCell
             ACellBRow = ActiveCell.Row
     
    'Filtre le criterion sur sheet match
         C1 = ACellB.Offset(0, -14).Value
         V1 = ACellB.Offset(0, -13).Value
         C2 = ACellB.Offset(0, -12).Value
          V2 = ACellB.Offset(0, -11).Value
     
    'Coller les valeurs des critère-Background (2) dans le filtre des criteres-Match
                 Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=14, Criteria1:=C1 _
                    , Operator:=xlAnd
                 Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=16, Criteria1:=V1 _
                    , Operator:=xlAnd
    'Verifier si après application des filtres automatique des matchs répondent au valeurs de critères
                 Worksheets("Match").Select
                 MNbRow = Worksheets("Match").Range("$A$1:$AK$100").Columns(3).SpecialCells(xlCellTypeVisible).Count - 1 'pour ne pas compter la 
    ligne des titres
                         If MNbRow = 0 Then
                         'si résultat des filtres dans Match sont vide alors passer à la ligne suivante de Background
                         'A developper
                         Else
    'si des matchs répondent au critères => Descendre  à la première ligne visible
                         Worksheets("Match").Range("E2", Cells(Rows.Count, "E").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
      'enregistrer les coordonnées de la cellule visible&active de la sheet Match
                          Set ACellM = ActiveCell
                          ACellMRow = ActiveCell.Row
     
    'Récupérer la valeur F1 de la cellule active feuille 1-Background (2)
    'Additioner la valeur résulatat domicile-colonneN de la cellule active feuille 1-Background (2) dans la cellule active feuille 2 (Match) colonne E
                         With Range("E" & ACellMRow)
                             .Value = Range("E" & ACellMRow).Value + ACellB.Offset(0, -3).Value
                         End With
     
    'Descendre à la deuxième ligne visible suivante de la feuille Match si un match est présent.
     
                      End If
     
     
    End Sub

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    Une premiiere suggestion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Sub Forecast()
     'Déclaration des variables
    Dim ACellB As Range 'cellule active de la feuille Backgrounnd (2)
    Dim ACellBRow As Double 'Row dela Cellule activede la feuille Backgrounnd (2)
    Dim ACellM As Range  'cellule active de la feuille Match
    Dim ACellMRow As Long 'Row dela Cellule activede la feuille Match
     
    Dim Types As String
    'C1 pourles criteres
    Dim C1 As String
    Dim C2 As String
    'DFE Data filter Empty
    Dim DFE As Double
    'V1 pour le valeur de criteres
    Dim V1 As String
    Dim V2 As String
     
    Dim MNbRow As Long 'Nombre de ligne dans Match qui réponde aux critères de background
     
    Worksheets("Background (2)").Select
    Worksheets("Background (2)").AutoFilterMode = False
     
    With Worksheets("Background (2)")
             Set rnData = Range("$A$3:$V$3883")
     
             rnData.Select
     
             With rnData
         'exclure toutes les stats avec une qté inférieur à G2
                 .AutoFilter Field:=7, Criteria1:=">=" & [$G$2] _
             , Operator:=xlAnd
         'Compte le nombre de ligne visible
                 For Each rngarea In .SpecialCells(xlCellTypeVisible).Areas
                  Debug.Print rngarea.Address
                     lcount = lcount + rngarea.Rows.Count
                 Next
     
             End With
     
    End With
     
    If lcount <> 0 Then
    'Descendre  à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
     
    Else
    'sinon va au critère R2 exécuter le forecast
     
    End If
    'enregistrer les coordonnées de la cellule visible&active
             Set ACellB = ActiveCell
             ACellBRow = ActiveCell.Row
     
    'Filtre le criterion sur sheet match
         C1 = ACellB.Offset(0, -14).Value
         V1 = ACellB.Offset(0, -13).Value
         C2 = ACellB.Offset(0, -12).Value
          V2 = ACellB.Offset(0, -11).Value
     
    'Coller les valeurs des critère-Background (2) dans le filtre des criteres-Match
     
               Worksheets("Match").Range("$A$1:$AK$100").AutoFilter
     
                 Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=14, Criteria1:=C1 _
                    , Operator:=xlAnd
                 Worksheets("Match").Range("$A$1:$AK$100").AutoFilter Field:=16, Criteria1:=V1 _
                    , Operator:=xlAnd
     
    'Verifier si après application des filtres automatique des matchs répondent au valeurs de critères
                 Worksheets("Match").Select
                 MNbRow = Worksheets("Match").Range("$A$1:$AK$100").Columns(3).SpecialCells(xlCellTypeVisible).Count - 1 'pour ne pas compter la ligne des titres
                         If MNbRow = 0 Then
                         'si résultat des filtres dans Match sont vide alors passer à la ligne suivante de Background
                         'A developper
                         Else
    'si des matchs répondent au critères => Descendre  à la première ligne visible
     
    Set Colonne5 = Worksheets("Match").Range("$A$1:$A$100").Columns(5).Offset(1).SpecialCells(xlCellTypeVisible)
     
    Colonne5.Cells(1, 1).Select
     
                          ACellMRow = ActiveCell.Row
     
    'Récupérer la valeur F1 de la cellule active feuille 1-Background (2)
    'Additioner la valeur résulatat domicile-colonneN de la cellule active feuille 1-Background (2) dans la cellule active feuille 2 (Match) colonne E
                         With Range("E" & ACellMRow)
                             .Value = Range("E" & ACellMRow).Value + ACellB.Offset(0, -3).Value
                         End With
     
    'Descendre à la deuxième ligne visible suivante de la feuille Match si un match est présent.
     
                      End If
     
     
    End Sub
    Cordialement

    Docmarti.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut Descendre à la ligne visible suivante si valeur présente
    Bonjour

    Merci pour ton retour,
    J'ai vu que tu avais retouché à 4 endroits le programme très certainement que mon code est bancale . Peux tu me dire ce que celà apporte/évite pour les 4 cas retouches ci dessous
    1. Ajout dans mon code ligne 24 et 25=> ligne 26 de ton code
    2. Ajout dans mon code ligne 30 et 31=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print rngarea.address
    ligne 34 de ton code
    3. Ajout dans mon code ligne 56 et 57=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Match").Range("$A$1:$AK$100").AutoFilter
    ligne 62 de ton code
    4. Supprimer dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'si des matchs répondent au critères => Descendre  à la première ligne visible
                        Worksheets("Match").Range("E2", Cells(Rows.Count, "E").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
                         'enregistrer les coordonnées de la cellule visible&active de la sheet Match
                         Set ACellM = ActiveCell
    et remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'si des matchs répondent au critères => Descendre  à la première ligne visible
     
    Set Colonne5 = Worksheets("Match").Range("$A$1:$A$100").Columns(5).Offset(1).SpecialCells(xlCellTypeVisible)
     
    Colonne5.Cells(1, 1).Select
    Apres l'avoir débuggé le résultat est le meme on arrive à la première ligne du Tableau, peut être que ton code évite des bugs par la suite? Quleque chose ne te plaisait il pas dans mon code?

    Un Grand merci pour ton retour
    Mais je n'ai pas la réponse à ma question initiale qui est de Descendre à la ligne visible suivante de la feuille Match si un match est présent en colonne D.

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set NextRow = Colonne5.Cells(1, 1).Select
    KO

    Une idée?
    Encore merci d'avoir pris le temps de regarder mon problème

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je m'excuse par avance de ne pas avoir creusé ton contexte, un peu rebuté par la longueur


    cependant, ton problème semble être "j'arrive à sélectionner la première ligne visible de ma plage filtrée, mais pas la seconde"


    si je reprend la ligne 44 du code de Docmarti

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Descendre  à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
    Est-ce que remplacer le premier "1" de ton Cells(1,1) par le chiffre 2 correspond à ton attente ?



    si je suis hors-sujet, me le dire avec force et audace

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut
    C 'est moi qui m'excuse de ne pas etre plus concit
    Le besoin que tu formule est presque le bon sauf que c'est la ligne suivant visible que cherche a atteindre.
    "j'arrive à sélectionner la première ligne visible de ma plage filtrée, mais pas la seconde ligne visible"

    J'ai essayé d'inclure ce code mais il me donne la ligne suivante caché ou visible :-s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Match").Range("E2", Cells(Rows.Count, "E").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(2, 1).Select
    Je suis entrain de chercher la solution avec qqc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Do
       '    Set Colonne6 = cellule.Offset(1, 0)
       'Loop Until cellule.EntireRow.Hidden = False
    Le défaut de ce code c'est qu'il passer aussi sur toutes les lignes exclus du filtre :-(. Ce que je souahite éviter si possible

    Merci pour ton aide
    jerome

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    ceci fonctionne parfaitement .... quand l'autofilter est positionné en ligne 1
    or le tiens est en ligne 4

    désolé je n'ai pas le temps d'adapter (je ne sais d'ailleurs pas ce que contiennent tes trois premières lignes), t'essaye de bricoler ça ?
    (fait déjà un test en supprimant tes 3 lignes non incluses dans le filtre pour comprendre comme ça fonctionne)


    remplace la colonne 17 de mes tests par la colonne de ton choix

    cette procédure est a mettre juste après l'application de ton filtre automatique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    With AutoFilter.Range.SpecialCells(xlCellTypeVisible)
        Select Case .Areas(1).Rows.Count
            Case 1
                If .Areas(2).Rows.Count = 1 Then
                    MsgBox .Areas(3).Cells(1, 17).Value
                Else
                    MsgBox .Areas(2).Cells(2, 17).Value
                End If
            Case 2
                MsgBox .Areas(2).Cells(1, 17).Value
            Case Else
                MsgBox .Areas(1).Cells(3, 17).Value
        End Select
    End With

  9. #9
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par jbonneval Voir le message
    A ce jour, je n’arrive pas à :
    - Descendre à la deuxième ligne visible de la feuille Match si un match est présent.

    If lcount <> 0 Then
    'Descendre à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select

    Else
    'sinon va au critère R2 exécuter le forecast

    End If
    [/CODE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Colonne5 = ma.Range("$A$2:$A$100").Columns(5).SpecialCells(xlCellTypeVisible)
    Colonne5.Areas(1).Cells(1, 1).Select 'Premiere ligne visible
    Colonne5.Areas(2).Cells(1, 1).Select 'Deuxieme ligne visible
    Cordialement

    Docmarti.

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Docmarti

    si la première ligne visible et la seconde sont contigües, cela ne fonctionnera pas ?

    les deux lignes feront partie du même areas

  11. #11
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Autant pour moi. Tu as parfaitement raison.

    Il reste donc l'itération avec For Each

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i = colonne5.Areas(1).Cells(1, 1).Row
    For Each c In colonne5
     If c.Row <> i Then
       c.Select
      Exit For
     End If
    Next
    Cordialement

    Docmarti.

  12. #12
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Je me suis fait avoir tout à l'heure ! j'ai pas de mérite à avoir raison


    en repartant de mon idée d'analyser les premiers areas, on doit pouvoir solutionner ça

    c'est parfait quand les en-têtes sont en ligne 1 ... mais dans son cas (elles sont en ligne 4), je part en débogage

    j'ai pas le temps de creuser avant ce soir


    EDIT : bon ... j'ai dû mal réaliser mes tests !

    j'ai pris une de mes BDD, j'ai inséré les 3 lignes au dessus
    et ceci me renvoi bien la valeur de ma cellule Q pour la seconde ligne issue du filtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Range("A4").AutoFilter 9, "toto"
     
    With AutoFilter.Range.SpecialCells(xlCellTypeVisible)
        Select Case .Areas(1).Rows.Count
            Case 1
                If .Areas(2).Rows.Count = 1 Then
                    MsgBox .Areas(3).Cells(1, 17).Value
                Else
                    MsgBox .Areas(2).Cells(2, 17).Value
                End If
            Case 2
                MsgBox .Areas(2).Cells(1, 17).Value
            Case Else
                MsgBox .Areas(1).Cells(3, 17).Value
        End Select
    End With

  13. #13
    Membre éprouvé Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Points : 973
    Points
    973
    Par défaut
    Bonsoir
    Je serai curieux de tester votre classeur
    Pour ne remplacer que le debut, j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub Forecast()
     'Déclaration des variables
    Dim ACellB As Range 'cellule active de la feuille Backgrounnd (2)
    Dim ACellBRow As Double 'Row dela Cellule activede la feuille Backgrounnd (2)
    Dim ACellM As Range  'cellule active de la feuille Match
    Dim ACellMRow As Range 'Row dela Cellule activede la feuille Match
    Dim Types As String
     
    Dim C1 As String 'C1 pourles criteres
    Dim C2 As String
    Dim DFE As Double 'DFE Data filter Empty
    Dim V1 As String 'V1 pour le valeur de criteres
    Dim V2 As String
    Dim MNbRow As Long 'Nombre de ligne dans Match qui réponde aux critères de background
     
    With Worksheets("Background (2)")
        .AutoFilterMode = False
        .Range("g3:g" & .[g65000].End(xlUp).Row).AutoFilter Field:=1, Criteria1:=">=" & [$G$2], Operator:=xlAnd 'exclure toutes les stats avec une qté inférieur à G2
     
        For Each rngarea In .Range("a3:a" & .[a65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible) 'Compte le nombre de ligne visible
        lcount = lcount + 1
        Next
    End With
     
    If lcount <> 0 Then
    'Descendre  à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
     
    Else
    'sinon va au critère R2 exécuter le forecast
     
    End If
    ce code, a quoi sert t'il
    'Descendre à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select

    La premiere ligne visible se trouve forcement en dessous du filtre, ou alors j'ai vraiment rien compris et m'en excuse par avance
    Par ailleurs je ne vois dans votre code aucune raison pour laquelle le select descendrai a la ligne suivante, le seul for each
    que lon voit est simplement pour compter les lignes visibles.

    Ne prenez surtout pas cela pour une critique, j'en dit juste ce que j'en lit et en comprends.

  14. #14
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Je reprends ton code en ne corrigeant que les lignes qui ne fonctionnaient pas dans mon classeur ci-joint.
    Et en ajoutant un code qui sélectionne la deuxieme ligne visible.
    Fichiers attachés Fichiers attachés
    Cordialement

    Docmarti.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut
    Yep
    Merci pour ton aide, ca fonctionne très bien.
    Mon besoin est de passer à la deuxième puis la troisième etc... tant qu'il y a des matchs de présent sur cette ligne qui réponde aux critères de filtre.

    Du coup,
    J'ai progressé sur mon code avec le Do & Loop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Set ACellM = ActiveCell
        Do
        Set ACellM = ACellM.Offset(1, 0)
       Loop Until ACellM.EntireRow.Hidden = False
    ACellM.Select
    Sauf qu'il faut que je vérifie qu'il y a bien un match (colonne D-sheet match) sur la ligne avant d'additioner la valeur (colonne E-sheet match).
    Je cherche à intégrer la vérification qu'il y a un match sur le code suivant.
    Je vous tiens au jus.

    Encore Merci

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut Filte automatique: Descendre à la ligne visible suivante si valeur présente
    Citation Envoyé par keygen08 Voir le message
    Bonsoir
    Je serai curieux de tester votre classeur
    Pour ne remplacer que le debut, j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub Forecast()
     'Déclaration des variables
    Dim ACellB As Range 'cellule active de la feuille Backgrounnd (2)
    Dim ACellBRow As Double 'Row dela Cellule activede la feuille Backgrounnd (2)
    Dim ACellM As Range  'cellule active de la feuille Match
    Dim ACellMRow As Range 'Row dela Cellule activede la feuille Match
    Dim Types As String
     
    Dim C1 As String 'C1 pourles criteres
    Dim C2 As String
    Dim DFE As Double 'DFE Data filter Empty
    Dim V1 As String 'V1 pour le valeur de criteres
    Dim V2 As String
    Dim MNbRow As Long 'Nombre de ligne dans Match qui réponde aux critères de background
     
    With Worksheets("Background (2)")
        .AutoFilterMode = False
        .Range("g3:g" & .[g65000].End(xlUp).Row).AutoFilter Field:=1, Criteria1:=">=" & [$G$2], Operator:=xlAnd 'exclure toutes les stats avec une qté inférieur à G2
     
        For Each rngarea In .Range("a3:a" & .[a65000].End(xlUp).Row).SpecialCells(xlCellTypeVisible) 'Compte le nombre de ligne visible
        lcount = lcount + 1
        Next
    End With
     
    If lcount <> 0 Then
    'Descendre  à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select
     
    Else
    'sinon va au critère R2 exécuter le forecast
     
    End If
    ce code, a quoi sert t'il
    'Descendre à la première ligne visible
    Range("Q4", Cells(Rows.Count, "Q").End(xlUp)).SpecialCells(xlCellTypeVisible).Cells(1, 1).Select

    La premiere ligne visible se trouve forcement en dessous du filtre, ou alors j'ai vraiment rien compris et m'en excuse par avance
    Par ailleurs je ne vois dans votre code aucune raison pour laquelle le select descendrai a la ligne suivante, le seul for each
    que lon voit est simplement pour compter les lignes visibles.

    Ne prenez surtout pas cela pour une critique, j'en dit juste ce que j'en lit et en comprends.
    Salut
    Je ne prend pas celà pour une critique
    merci pour ton temps.
    En faite c'est que je ne maitrise pas ce que veux dire cette formule. je l'ai juste trouvé sur un forum et recopier dans mon code et tester. Il se trouve que jusqu'à maintenant ca marche :-d
    Peux être as tu qqc de plus simple mais mon besoin reste toujous le meme "Descendre à la ligne visible suivante si valeur présente" apres l'application d un filtre automatique.

    Pour le moment j'ai trouvé ca, mais il faut vérifier qu'un match est présent en colonne D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Set ACellM = ActiveCell
        Do
        Set ACellM = ACellM.Offset(1, 0)
       Loop Until ACellM.EntireRow.Hidden = False
    ACellM.Select
    je t tiens informé pour celà

    Ensuite concernant
    "le seul for each
    que lon voit est simplement pour compter les lignes visibles."

    En fait, je fais celà pour savoir si le filtres à masquer toutes les lignes ou pas. Si c'est egal à 0, je passe aux critères suivant (C2 dans la feuille Background(2) )

    Il y a très certainement plus simple :-p
    je reste à ton écoute

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Je me suis fait avoir tout à l'heure ! j'ai pas de mérite à avoir raison


    en repartant de mon idée d'analyser les premiers areas, on doit pouvoir solutionner ça

    c'est parfait quand les en-têtes sont en ligne 1 ... mais dans son cas (elles sont en ligne 4), je part en débogage

    j'ai pas le temps de creuser avant ce soir


    EDIT : bon ... j'ai dû mal réaliser mes tests !

    j'ai pris une de mes BDD, j'ai inséré les 3 lignes au dessus
    et ceci me renvoi bien la valeur de ma cellule Q pour la seconde ligne issue du filtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Range("A4").AutoFilter 9, "toto"
     
    With AutoFilter.Range.SpecialCells(xlCellTypeVisible)
        Select Case .Areas(1).Rows.Count
            Case 1
                If .Areas(2).Rows.Count = 1 Then
                    MsgBox .Areas(3).Cells(1, 17).Value
                Else
                    MsgBox .Areas(2).Cells(2, 17).Value
                End If
            Case 2
                MsgBox .Areas(2).Cells(1, 17).Value
            Case Else
                MsgBox .Areas(1).Cells(3, 17).Value
        End Select
    End With
    Salut je suis pas sur de comprendre ton code mais je pense qu'on est dans le meme cas que notre collègue, cad qu'on est limité à 3 aires. Si j'ai 50 lignes il faudrait que je multiplie les cas, non?

    Du coup je pense que ma solution est pas mal avec le Do Loop voir plus haut dans ma réponse à nos amis.

    Je vous tiens au jus dès que je suis arrivé à faire le check.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut Filte automatique: Descendre à la ligne visible suivante si valeur présente
    Bonjour,
    je souhaitais eviter de passer par un check sur toutes les lignes filtrées mais bon ce code là semble marcher quand meme et c'est dejà pas mal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Set ACellM = ActiveCell
                              Do
                               'Je verrifie qu'il y est un match à la ligne suivante, si vrai alors
                                  If ACellM.Offset(1, 6).Value <> 0 Then
                                  'Je descend d'une ligne
                                  Set ACellM = ACellM.Offset(1, 0)
                                  Else
                                  'si faux(pas de match) je sors de la boucle
                                  Exit Sub
                                  End If
                                  'je verifie que sur la nouvelle ligne ou se trouve le match elle n'est pas filtré, si filtré je repars au Do
                            Loop Until ACellM.EntireRow.Hidden = False
                              'Loop Until IsEmpty(ACellM.Value)
                              ACellM.Select
    Merci à tous pour vos conseils
    jerome

  19. #19
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    le plus simples est d'adopter une autre stratégie

    utiliser le filtre avancé pour exporter le résultat du filtre
    et ensuite, tu n'as plus rien à vérifier, seuls les résultats sont extraits sur une plage à part

    http://philippetulliez.developpez.co...dvancedfilter/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre automatique: descendre à la première ligne visible
    Par jbonneval dans le forum Général VBA
    Réponses: 2
    Dernier message: 30/06/2015, 09h16
  2. Sélection d'une ligne variant suivant la valeur
    Par CélineM dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/06/2007, 11h34
  3. TValueListEditor: Ajout automatique d'une ligne vide
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2005, 12h16
  4. [JTable] selection automatique d'une ligne
    Par bibx dans le forum Composants
    Réponses: 4
    Dernier message: 17/06/2005, 11h59
  5. determiner les ligne visible ds un RichEdit
    Par hhfr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2002, 18h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo