VBA - Masquer toutes les lignes à partir d'une cellule fusionnée

Bonjour à tous,

Après de multiples recherches et ne trouvant pas de solution à ma problématique, je me permets de venir chercher conseil auprès de vous.

Avant tout, il faut savoir que je n'ai aucune formation en codage VBA et que j'apprends doucement en autodidacte pour chaque besoin dans le cadre de mon travail.

Ma problématique est la suivante:

J'ai un tableur excel contenant de multiples lignes et j'aimerais en masquer certaines sous condition de la valeur d'une cellule. Voici le code utilisé:

image

Jusque ici, tout va bien.

Cependant, la cellule posant la condition est une cellule fusionnée et j'aimerais que toutes les lignes qui la compose soient masquées. Mais quand je lance ma macro, seule la première ligne de la plage est masquée.

image

Dans cet exemple, c'est la valeur des cellules de la colonne AH qui conditionne le masquage des lignes. Ma première cellule de cette colonne est fusionnée sur les lignes 3 à 7. En exécutant la macro, seule la ligne 3 est masquée mais l'objectif est de masquer les lignes 3 à 7.

Auriez vous une solution sans qu'il n'y ait besoin de défusionner la cellule de condition et de systématiquement renseigner la valeur "Oui" dans chacune des lignes ?

Bonjour et

Quand on veut des problèmes avec VBA, il suffit de fusionner les cellules.
Fusionner est une mauvaise habitude que l'on devrait interdire avec excel
On le dit, redit et écrit depuis des lunes.

Donc essayez sans fusionner...

si vous avez résolu votre demande pensez à

Crdlt

Bonjour,

Quel accueil !

Bon ceci dit pour les cellules fusionnées "cépafo". En plus les images de code ça donne vite des aigreurs...

Alors la conjugaison des uns et des autres...

Bon moi aussi j'ai un peu la flemme de me retaper ton code... Alors dans ta réponse tu appuies sur le symbole </> au dessus puis tu colles ton code avant de valider comme ça on n'a pas à se taper la recopie...

Moyennant quoi Ya surement une âme charitable qui va t'arranger ça !

A+

Bonjour,

Je sais bien que la fusion de cellules apporte plus de problèmes que de solutions mais je n'ai pas vraiment d'autres choix puisque ce tableur doit ensuite être alimenté et suivi par une personne qui n'a pas de grande maitrise de tout ce qui touche à l'informatique et qu'il doit resté le plus lisible possible malgré la quantité de données qu'il doit accueillir.

Donc je suis venue poser la question ici, pas pour me faire entendre dire ce que je sais déjà mais pour savoir si une solution pourrait exister. Si ce n'est pas le cas, alors tant pis, j'essaierai de m'arranger autrement. Je ne suis pas coutumière des forums, si j'en viens à y poser une question, c'est bien parce que je n'ai trouvé de début de réponse absolument nulle part.

Dans le doute, voici le code C/c:

Sub MasquerLigneACondition()

LigneDebut = 3
LigneFin = 3000
NumeroColonne = 34

For i = LigneDebut To LigneFin
If Cells(i, NumeroColonne).Value <> "Oui" Then
Cells(i, NumeroColonne).EntireRow.Hidden = False
Else
Cells(i, NumeroColonne).EntireRow.Hidden = True

End If

Next i
End Sub

Merci à ceux qui prendront le temps de répondre

Edit modo : code à mettre entre balises avec le bouton </>

Bonjour,

Je ne suis pas sensé savoir que vous aviez conscience de cela. Je ne compte pas le nombre de fois que l'on est confronté à des problèmes dûs aux fusions.

Je ne suis pas coutumière des forums, si j'en viens à y poser une question, c'est bien parce que je n'ai trouvé de début de réponse absolument nulle part.

Bien entendu j'imagine bien que si vous posez une question c'est pour obtenir une aide. C'est le but d'un forum et tout son intérêt d'ailleurs.


L'idéal serait que vous mettiez des Oui à chaque ligne ou alors vérifier la cellule fusionnée mais c'est pas garanti que vous n'aurez pas un souci par après.

Possible d'avoir votre fichier sans données confidentielles ?

Cordialement

Merci pour votre retour.

Qu'entendez-vous par "vérifier la cellule fusionnée" ?

Je vous joins une partie du fichier.

Merci

20test.xlsx (53.50 Ko)

Qu'entendez-vous par "vérifier la cellule fusionnée" ?

Si l'on doit masquer des lignes sur base du "Oui", il faut vérifier que la cellule est fusionnée ou non
Vous pourriez avoir un "oui" qui ne concerne qu'une ligne et pas 3 ou 4
Ce que vous devez comprendre dans la fusion et VBA, c'est que par exemple dans les lignes 67 et 68 vous avez un "Oui"
En réalité Excel voit ceci :
- AF67 comporte un OUI
- AF68 est vide.

Votre fichier ne contient pas de code et la colonne concernée n'est pas AH mais AF. Je regarderai sur base de celui que vous avez posté

Effectivement,

La colonne a changé car j'en ai retiré une à cause de certaines données, je n'ai pas pensé à le rectifier, au temps pour moi.

Ce que vous dites me fait penser à une potentielle solution alternative... Pourrait-on envisager de prévoir une formule qui répèterait la valeur entrée dans la première ligne de la plage ? Ca me permettrait de pouvoir défusionner les cellules tout en permettant une saisie unique et ne poserait plus de soucis au niveau de la macro.

A défaut d'une solution, ça pourrait être un moyen...

Re

Essayez le code comme ceci :

Sub MasquerLigneACondition2()
Dim i As Integer, lig As Integer

Cells.EntireRow.Hidden = False

For i = 4 To Range("AF" & Rows.Count).End(xlUp).Row
    If UCase(Range("AF" & i)) = "OUI" Then
        With Range("AF" & i)
            If .MergeCells Then

                lig = .MergeArea.Cells.Rows.Count
                Range("AF" & i & ":AF" & i + lig - 1).EntireRow.Hidden = True

                If Range("AF" & i + lig).MergeCells Then i = i + lig
            Else: .EntireRow.Hidden = True
            End If
        End With
    End If
Next i
End Sub

On pourrait optimiser mais cela fonctionne comme cela

Si ok pensez à

Crdlt

Ce code marche parfaitement !

Vous êtes merveilleux !

Un grand merci !

Bonsoir Lullilaby, Le Fil,

On peut masquer et démasquer en utilisant le CurrentRegion avec le code ci-dessous

Sub Fusion()
LigDeb = 3
LigFin = 3000
For i = LigDeb To LigFin
'La ligne suivante en commentaire permet de démasquer toutes les lignes en la décommantant afin d'effacer le oui présent dans la colonne AT.
'De même le oui peut aussi se placer automatiquement avec cette même ligne ou sinon manuellement lorsque toutes les lignes sont dévoilées.
'Range("AT" & i ) = "non"
'La ligne ci-dessous cache ou dévoile les lignes fusionnées selon la valeur en colonne AT. Selon bloc de 4 lignes
Application.Range("AH" & i).MergeArea.CurrentRegion.EntireRow.Hidden = (Range("AT" & i) = "oui"):i = i + 4
Next i
End Sub

Alors après vérifications, le code fourni par Dan marche mais pas sur toutes les lignes, je ne comprends pas pourquoi. C'est comme si seulement une plage sur deux répondait...

Mettons que j'ai

- une plage n°1 correspondant aux lignes 4 à 8,

- une autre plage N°2 correspondant aux lignes 9 à 13

- et une N°3 aux lignes 14 à 18,

Seules les plages N°1 et N°3 vont être masquées...

J'ai regardé également le code de X Cellus et le problème c'est que mes plages (correspondant aux cellules fusionnées) ne sont pas toutes composées de 5 lignes, ça varie d'une plage à l'autre...

Bonjour

L'exemple que vous donnez correspond au fichier posté.
Qu'avez-vous en AF pour ces plages ? Vous avez bien un OUI ?

Crdlt

Edit : OK Je viens de comprendre. je regarde

Oui, je vous reposte le fichier avec le code et les bonnes colonnes (j'ai juste modifié la colonne concernée dans le code)

15classeur1.xlsm (156.05 Ko)

Bah il n'y avait pas besoin de reposter le fichier...
Dans le code modifiez cette ligne.

If Range("AH" & i + lig).MergeCells Then i = i + lig - 1

J'ai juste rajouté un - 1 à la fin

Cordialementt

Super, maintenant ça marche parfaitement.

Merci beaucoup !

Rechercher des sujets similaires à "vba masquer toutes lignes partir fusionnee"