Sélectionner la moitié des cellules visibles filtrées

Bonjour,

J'ai trouvé comment compter le nombre de lignes visibles => 6

Je découpe le résultat par 2 => 3

Si je veux sélectionner la seconde partie de la plage de cellules, je commence à la 5e ligne (4e + 1 pour l'en-tête)... sauf que voilà, 5 c'est pas le numéro de ligne de la 5e ligne visible !

Est-ce que vous avez une solution ? En VBA si possible car d'autres choses sont déjà faites.

Merci beaucoup.

PJ : l'objectif est donc de sélectionner les cellules A22 A23 A24

18classeur1.xlsx (8.00 Ko)

Bonjour à tous,

Et si tu nous disais pourquoi tu fais ça ? Et quelle est ta méthode pour arriver à sélectionner tes trois lignes ?

Crdlmt

Bien sûr

Pour compter le nombre de lignes visibles :

NbLigVisibles = Application.Subtotal(3, Columns("A")) - 1

Puis

NbLigVisiblesDiv2 = NbLigVisibles / 2

Pourquoi je fais ça :

Car je télécharge des icônes sur le web via un script mais il ne supporte pas une trop grosse volumétrie. Je dois donc lancer plusieurs petits téléchargements.

Bonjour le fil, bonjour le forum,

Tiré par les cheveux mais ça semble fonctionner :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim S As Range 'déclare la variable S (Sélection)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définir la dernière ligne éditée de la colonne A de l'onglet O
Set PL = O.Range("A1:A" & DL) 'définit la plage PL
NC = PL.SpecialCells(xlCellTypeVisible).Cells.Count - 1 'définit le nombre de cellules visibles de la plage PL
Set S = O.Range("A1") 'initialise la sélection S
For I = DL To 2 Step -1 'boucle inversée des cellules des lignes DL à 2
    J = J + 1 'incrémente J
    'si la ligne de la boucle n'est pas masquée, définit la sélection S
    If O.Rows(I).Hidden = False Then Set S = IIf(S.Address = "$A$1", O.Cells(I, "A"), Application.Union(S, O.Cells(I, "A")))
    If J > NC / 2 Then S.Select: Exit Sub 'si J est supérieur à NC divisé par 2, sélectionne S, sort de la procédure
Next I 'prochaine ligne de la boucle
End Sub

Merci !

Je vais essayer d'adapter ton code à mon fichier réel qui est décomposé la sélection en 4 parties.

Je vous tiens au courant.

Dommage.

209 lignes dans le fichier ci-joint et la sélection est de 87.

12classeur2.xlsm (29.74 Ko)

Re

onglet accueil==>rechercher et sélectionner==>sélectionner les cellules==>cocher '"cellules visibles seulement", retirer le filtre; crtlc/ctrlv a coté

Crdlmt

En quoi cela permet de sélectionner seulement la 2e partie des cellules visibles ?

Bonjour,

tu peux t'ajouter une colonne avec :

=SOUS.TOTAL(103;$A$1:A1)

puis filtrer sur celle-ci >104

eric

Désolé mais je ne saisis pas.

Ta formule donne "1" comme valeur de partout.

"103" n'est pas une fonction de "SOUS.TOTAL"

Et que veulent dire les valeurs 103 et 104 (sachant que j'ai besoin de dynamique) ?

Merci.

En quoi cela permet de sélectionner seulement la 2e partie des cellules visibles ?

un fois copiées, tu choisis la partie que tu veux!

un fois copiées, tu choisis la partie que tu veux!

Non mais le but est d'automatiser, de gagner du temps et d'éviter les erreurs de manipulation, je sais bien le faire manuellement...

Et pour rappel, j'ai besoin de VBA. Ceci n'est qu'une étape dans un fichier qui a déjà une belle structure et son quota de formules.

Désolé mais je ne saisis pas.

Ta formule donne "1" comme valeur de partout.

"103" n'est pas une fonction de "SOUS.TOTAL"

C'est que tu l'as mal inscrite,relis donc ce que j'avais écrit, les $ ne sont pas là pour décorer.

Elle te numérote les ligne visibles.

Et bien sûr que si que la fonction 103 existe. Toutes les fonctions existent avec 100 de plus pour compter ou non les lignes masquées (et non filtrées)

En l'occurrence tu devrais pouvoir utiliser la 3 également si tu préfères.

Tout ceci peut être fait par macro.

Tu cherches 104 en B (milieu de 209), tu le trouves en ligne 145 et tu peux faire ta sélection ou masquer etc.

eric

PS : j'avais mis le fichier... Je l'ai enlevé que tu aies le plaisir d'y arriver.

Et puis vu que tu eng... presque tous ceux qui t'aident ça ne donne pas trop envie

Volià ce que ça donne :

2020 05 08 23 07 37

Re,

Le code modifié... L'incrémentation de J n'était pas au bon endroit :

Private Sub CommandButton1_Click()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim S As Range 'déclare la variable S (Sélection)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définir la dernière ligne éditée de la colonne A de l'onglet O
Set PL = O.Range("A1:A" & DL) 'définit la plage PL
NC = PL.SpecialCells(xlCellTypeVisible).Cells.Count - 1 'définit le nombre de cellules visibles de la plage PL
Set S = O.Range("A1") 'initialise la sélection S
J = 1
For I = DL To 2 Step -1 'boucle inversée des cellules des lignes DL à 2
    'si la ligne de la boucle n'est pas masquée, définit la sélection S
    If O.Rows(I).Hidden = False Then
        Set S = IIf(S.Address = "$A$1", O.Cells(I, "A"), Application.Union(S, O.Cells(I, "A")))
        J = J + 1
    End If
    If J > NC / 2 Then S.Select: Exit Sub 'si J est supérieur à NC divisé par 2, sélectionne S, sort de la procédure
Next I 'prochaine ligne de la boucle
End Sub

Non, j'ai bien lu c'est juste que j'avais zappé le recalcul qui n'était pas sur Automatique désolé.

La fonction 103 n'était pas indiquée par l'aide Excel alors je pense que tu peux comprendre mon questionnement.

Je n'engueule personne En revanche, quand je pose une question pour trouver un code en VBA, je préfère qu'on ne me réponde pas, qu'on me dise que ce n'est pas possible selon ses propres connaissances,... plutôt que de me proposer des formules qui alourdiraient davantage mon fichier original ou des manipulations manuelles.

Je suis sur ce forum depuis des années et je n'ai jamais manqué de respect.

Bref, pour en revenir à ta proposition, je l'ai appliquée (par curiosité) sur le fichier chargé ici et je tombe bien à la ligne 145 pour le résultat 104.

J'ai refait l'exercice avec plus de données :

304 résultats filtrés

Le résultat 104 est toujours à la ligne 145

Mais la moitié de la sélection correspond à la ligne 210.

Encore une fois, j'apprécie l'aide apportée sur ce forum mais s'il n'existe pas de solution qui correspond à mon besoin alors je ferais autrement comme passer par un onglet intermédiaire en collant ma sélection de lignes visibles.

EDIT: merci beaucoup @ThauThème

Cela semble parfait, je vais l'intégrer à mon fichier original.

4classeur2.xlsm (35.06 Ko)

Bonjour,

304 résultats filtrés

Le résultat 104 est toujours à la ligne 145

Mais la moitié de la sélection correspond à la ligne 210.

Fait être logique et rechercher la moitié de 304 (max de B/2) puisque c'est ce que tu veux...

eric

Pourquoi est-ce que je ne peux plus rien exécuter après le code de ThauThème ?

Dans le fichier ci-joint, je fais une copie des cellules et un MsgBox mais rien ne semble s'exécuter...

Noté Eric mais je reste sur le VBA.

6classeur2.xlsm (25.17 Ko)

Tout ce qui se fait sur feuille peut se faire en vba.

Re

avec une seule formule :

2 éme moitié de la liste des cellules qui contiennent com.

4primo2.xlsm (32.96 Ko)

Crdlmt

Merci encore pour votre aide.

J'ai finalement réussi à bidouiller quelque chose en VBA en passant par un onglet intermédiaire pour contourner le problème des lignes masquées/visibles.

Rechercher des sujets similaires à "selectionner moitie visibles filtrees"