Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres [RÉSOLU] Comment faire masquer mes plages de cellules vides par macro

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

un internaute

XLDnaute Impliqué
Bonjour le forum
Dans le fichier joint lorsque j'ai mes plages lignes vides feuille Modèle 1 je voudrais en faisant Suppr sur cellule B3 faire fermer toutes les plages des lignes vides et ne laisser que le nom de la série comme modèle 2 (fait manuellement)
Ou alors faire Suppr cellule B3 pour la plage lignes 10 à 49
Ou alors faire Suppr cellule B4 pour la plage lignes 51 à 90
ect...
Je ne sais pas comment faire et ou placer la macro dans toutes les macros
Merci pour vos éventuels retours
 

Pièces jointes

Je pense que c'est cette partie de macro qui manque

VB:
    Longlet = ActiveSheet.Name
    RevenirOuJetais = Target.Cells.Address
    If Not Intersect(Target, Range("B3:B8")) Is Nothing Then Call AfficherLesLignesNecessaires
    ActiveSheet.Range(RevenirOuJetais).Select


Dans la macro ci-dessous

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Ligne As Long, Cel As Range, Couleur As Integer

  Select Case UCase(Sh.Name)
    Case "LISTE_PRATICIENS"     ', "MODÈLE 3", "MODÈLE 4"
    Case Else
      If Target.Count > 1 Then Exit Sub
      If Target.Count > 1 Or Target.Row < 3 Then Exit Sub       'Cette ligne de macro pour pouvoir taper ou coller du texte dans la ligne N°2
      
    Longlet = ActiveSheet.Name
    RevenirOuJetais = Target.Cells.Address
    If Not Intersect(Target, Range("B3:B8")) Is Nothing Then Call AfficherLesLignesNecessaires
    ActiveSheet.Range(RevenirOuJetais).Select
      
      Application.EnableEvents = False

      If Not Intersect(Sh.Range("B10:B" & Rows.Count), Target) Is Nothing Then
        Sh.Range("A" & Target.Row) = IIf(Target = "", "", Application.Proper(Format(Date, "dddd dd mmmm yyyy")))
        If Target = "" Then
          Couleur = Target.Offset(-1, -1).Interior.ColorIndex
          Ligne = Target.Row
          While Left(Sh.Range("A" & Ligne), 5) <> "Série"
            Ligne = Ligne - 1
          Wend
          Set Cel = Sh.Range("A3:A8").Find(what:=Sh.Range("A" & Ligne), LookIn:=xlValues, lookat:=xlWhole)
          If Not Cel Is Nothing Then
            Couleur = Cel.Interior.ColorIndex
          End If

'          Sh.Unprotect
          With Target.Offset(0, -1).Resize(1, 10)
            .ClearContents
            .Interior.ColorIndex = Couleur
          End With
'          Sh.Protect 'UserInterfaceOnly:=True
        End If
      ElseIf Not Intersect(Sh.Range("I10:I" & Rows.Count), Target) Is Nothing And Target = "" Then
          Target.NumberFormat = "#,##0.00 $"
      ElseIf Target.Column = 1 Then
      If IsDate(Target) Then
        Target = Application.Proper(Format(Target, "dddd dd mmmm yyyy"))        ' Sinon on inscrit la date
      Else
        Target = ""

      End If
      End If
      Application.EnableEvents = True
    End Select
End Sub
 
Bonjour Internaute,
Pour le module "AfficherLesLignesNecessaires", peut être plus court avec :
VB:
Sub AfficherLesLignesNecessaires()
    Dim Sh As Worksheet, Plage, NbSeanc%, K%, Début%, Fin%
    Application.ScreenUpdating = False
    If Longlet = "" Then Exit Sub
    Set Sh = Sheets(Longlet)
    If Sh.Visible = xlSheetVisible And Sh.Name <> "LISTE_PRATICIENS" Then
        Sh.Activate
        Plage = Array(9, 50, 91, 132, 173, 214, 255)    ' Lignes de début de chaque série
        Sh.Rows("9:256").EntireRow.Hidden = False       ' Toute la plage visible
        For K = 3 To 8                                  ' Séances prescrites
            If Sh.Cells(K, "B") > 0 Then NbSeanc = Sh.Cells(K, "B").Value - 1 Else NbSeanc = -1
            Début = Plage(K - 3) + 2 + NbSeanc          ' Début plage à masquer
            Fin = Plage(K - 2) - 1                      ' Fin plage à masquer
            Sh.Rows(Début & ":" & Fin).EntireRow.Hidden = True
        Next K
    End If
Fin:
    Set Sh = Nothing
End Sub
 
 
Bonjour sylvanu

Super​

J'ai fait 2 modifs je crois
VB:
Sub AfficherLesLignesNecessaires()
    Dim Sh As Worksheet, Plage, NbSeanc%, K%, Début%, Fin%
    Application.ScreenUpdating = False
    If Longlet = "" Then Exit Sub
    Set Sh = Sheets(Longlet)
    If Sh.Visible = xlSheetVisible And Sh.Name <> "LISTE_PRATICIENS" Then
        Sh.Activate
        Plage = Array(9, 50, 91, 132, 173, 214)    ' Lignes de début de chaque série
        Sh.Rows("9:254").EntireRow.Hidden = False       ' Toute la plage visible
        For K = 3 To 8                                  ' Séances prescrites
            If Sh.Cells(K, "B") > 0 Then NbSeanc = Sh.Cells(K, "B").Value - 1 Else NbSeanc = -1
            Début = Plage(K - 3) + 2 + NbSeanc          ' Début plage à masquer
            Fin = Plage(K - 2) - 1                      ' Fin plage à masquer
            Sh.Rows(Début & ":" & Fin).EntireRow.Hidden = True
        Next K
    End If
Fin:
    Set Sh = Nothing
End Sub

Puis ajouter ça pour ne pas les faire ouvrir quand on tape 40 par exemple série 1
Code:
    Longlet = ActiveSheet.Name
    RevenirOuJetais = Target.Cells.Address
    If Not Intersect(Target, Range("B3:B8")) Is Nothing Then     'Call AfficherLesLignesNecessaires
    ActiveSheet.Range(RevenirOuJetais).Select
      End If
Si tu vois autre chose de mieux je suis preneur car à 90 balais plus trop réactif!!!

Bien cordialement à toi
 

Pièces jointes

Re sylvanu
dans ce programme lorsque je tape 40 dans cellule B3 doit s'ouvrir plage ligne 10 à 49 et doivent rester ouverte et non se refermer comme le programme précédent
Donc j'ai modifié macro
VB:
    Longlet = ActiveSheet.Name
    RevenirOuJetais = Target.Cells.Address
    If Not Intersect(Target, Range("B3:B8")) Is Nothing Then Call AfficherLesLignesNecessaires
    ActiveSheet.Range(RevenirOuJetais).Select
Je ne comprend pas très bien tes lignes de plage dans ta macro mais c'est peut-être moi qui ne comprend pas
 

Pièces jointes

Re,
Dans l'array plage sont définies les premières lignes de chaque série.
Je commence par rendre toute la plage visible.
"Début" calcule la première ligne à masquer, et "Fin" la dernière ligne à masquer pour chaque série, et on masque de Début à Fin.

J'ai trouvé le bug dans le calcul de début pour une valeur de 40 , c'est mieux avec :
Code:
        For K = 3 To 8                                  ' Séances prescrites
            If Sh.Cells(K, "B") > 0 Then NbSeanc = Sh.Cells(K, "B").Value Else NbSeanc = 0
            Début = Plage(K - 3) + 1 + NbSeanc          ' Début plage à masquer
            Fin = Plage(K - 2) - 1                        ' Fin plage à masquer
            If Fin < Début Then Début = Fin
            Sh.Rows(Début & ":" & Fin).EntireRow.Hidden = True
        Next K
Sorry.
 

Pièces jointes

Dernière édition:
 
Re,
Exact, je ne l'avais pas vu.
Quand on est au max on fait quand même un masquage de la dernière ligne, configuration qu'il faut éviter.
J'ai modifié avec :
VB:
If NbSeanc < 40 Then Sh.Rows(Début & ":" & Fin).EntireRow.Hidden = True
 

Pièces jointes

VB:
Sub AfficherLesLignesNecessaires()
    Dim Sh As Worksheet, Plage, NbSeanc%, K%, Début%, FIN%
    Application.ScreenUpdating = False
    If Longlet = "" Then Exit Sub
    Set Sh = Sheets(Longlet)
    If Sh.Visible = xlSheetVisible And Sh.Name <> "LISTE_PRATICIENS" Then
        Sh.Activate
        Plage = Array(9, 50, 91, 132, 173, 214, 255)    ' Lignes de début de chaque série. Pourquoi 255 alors que la fin de la dernière série est 214?
        Sh.Rows("9:256").EntireRow.Hidden = False       ' Toute la plage visible. Pourquoi 256 alors que la dernière ligne est 254?
        For K = 3 To 8                                  ' Séances prescrites
            If Sh.Cells(K, "B") > 0 Then NbSeanc = Sh.Cells(K, "B").Value Else NbSeanc = 0
            Début = Plage(K - 3) + 1 + NbSeanc           ' Début plage à masquer
            FIN = Plage(K - 2) - 1                        ' Fin plage à masquer
            If FIN < Début Then Début = FIN
            If NbSeanc < 40 Then Sh.Rows(Début & ":" & FIN).EntireRow.Hidden = True
        Next K
    End If
FIN:
    Set Sh = Nothing
End Sub
?
Bonjour sylvanu
Toutes mes excuses ne n'avoir pu te répondre plutôt
Une question pour commencer
Pourquoi K dans la macro
La colonne K est déjà occupée pour les heures et la L pour les minutes
Certainement une question C$$N!!!
Dans la macro où il y a des points ? peux-tu m'apporter des réponses STP?
Dans un premier temps je vois si ça fonctionne et dans un second temps j'essaye de comprendre!!!
Certainement des question C$$N!!! aussi
Merci à toi
Cordialement
 
Bonjour,
Pourquoi K dans la macro
🙂 Tout simplement car c'est la variable que vous avez utilisé dans votre PJ pour désigner la ligne. ( de ligne 3 à ligne 8 ). J'ai repris le même nom de variable.
VB:
If Sh.Visible = xlSheetVisible And Sh.Name <> "LISTE_PRATICIENS" Then
        Sh.Activate
        For K = 3 To 8  'séances prescrites
            If Sh.Cells(K, "B") > 0 Then
Ne pas confondre la variable appelée K et la colonne K, comme par exemple K=3 ou Range("K3")
D'où la possibilité de voir : Range("K" & K)=0 🙂 pour mettre 0 en K4 si K=4.
Dans la macro où il y a des points ?
Donnez un exemple car il y a plusieurs raisons possibles. C'est généralement la syntaxe qui le veut ainsi, comme par exemple :
Code:
Sh.Rows("3:8").EntireRow.Hidden = True
Le point sert de séparateur entre les différents paramètres requis.
 
Dernière édition:
Exemple macro
En MAJUSCULE VOLONTAIREMENT

VB:
Sub AfficherLesLignesNecessaires()
    Dim Sh As Worksheet, Plage, NbSeanc%, M%, Début%, FIN%
    Application.ScreenUpdating = False
    If Longlet = "" Then Exit Sub
    Set Sh = Sheets(Longlet)
    If Sh.Visible = xlSheetVisible And Sh.Name <> "LISTE_PRATICIENS" Then
        Sh.Activate
        Plage = Array(9, 50, 91, 132, 173, 214, 256)        ' Lignes de début de chaque série. MOI J'AURAIS ENLEVÉ 256
        Sh.Rows("9:256").EntireRow.Hidden = False           ' Toute la plage visible. MOI J'AURAIS MIS 254 A LA PLACE DE 256
        For M = 3 To 8                                      ' Séances prescrites
            If Sh.Cells(M, "B") > 0 Then NbSeanc = Sh.Cells(M, "B").Value Else NbSeanc = 0
            Début = Plage(M - 3) + 1 + NbSeanc              ' Début plage à masquer
            FIN = Plage(M - 2) - 1                          ' Fin plage à masquer
            If FIN < Début Then Début = FIN
            If NbSeanc < 40 Then Sh.Rows(Début & ":" & FIN).EntireRow.Hidden = True
        Next M
    End If
FIN:
    Set Sh = Nothing
End Sub
 
Je ne suis pas sur d'avoir compris la demande, mais si ce sont les points dans les instructions , ce sont bien des séparateurs de paramètres. Par ex :
VB:
Sh.Rows(Début & ":" & FIN).EntireRow.Hidden = True
Quelle feuille : Sh
Quelle plage : Rows...
Quelle étendue : EntireRow
Quel paramètre : Hidden
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…