XL 2016 Masquage lignes VBA

  • Initiateur de la discussion Initiateur de la discussion Fabien62
  • Date de début Date de début

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 !

Fabien62

XLDnaute Occasionnel
VB:
Private Sub Worksheet_Activate()

Application.ScreenUpdating = False

Cells.EntireRow.Hidden = False
For Each cel In Feuil7.Range("A55:A77")
If cel = 0 Then cel.EntireRow.Hidden = True
Next
Application.ScreenUpdating = True

End Sub

Je vous joins le fichier avec le code accessible

Merci beaucoup pour votre aide

Cordialement
 
Bonjour Fabien62, le forum,

Ce n'est pas une "petite question".

1) Il faut toujours une seule et même formule en colonne A des feuilles "Taxe", en A10 :
Code:
=SI((DECALER('Saisie réservations'!B2;$F$5;0)>=DATE(An;$G$5;1))*(DECALER('Saisie réservations'!B2;$F$5;0)<=DATE(An;$H$5;31))*(DECALER('Saisie réservations'!L2;$F$5;0)="Convention");DECALER('Saisie réservations'!B2;$F$5;0);"")
2) Si vous les appliquez aux 3 fichiers précédents vous verrez qu'il y a alors des "trous" dans les dates.

C'est normal et pour les éviter il faut :

- introduire une colonne supplémentaire "Convention" en colonne AL de la feuille "Saisie réservations"

- dans la macro introduire un tri sur cette colonne :
Code:
    With Feuil1 'CodeName de la feuille Saisie réservations
      .[A1].CurrentRegion.Sort .[AL1], xlDescending, .[B1], , xlAscending, Header:=xlYes 'tri sur colonnes AL puis B
    End With
3) Voyez les résultats de tout cela dans les fichiers (1 bis) (2 bis) et (3 bis).

Le fichier (1 bis), comme le fichier (1), ne va pas bien quand il n'y a pas de dates en dessous de la ligne 32.

Voyez la feuille "Sept-Déc" avec le saut de page nuisible, on ne peut pas l'éviter.

C'est pour cela que je vous ai recommandé d'utiliser l'un des 2 autres fichiers.

Edit : j'ai diminué la largeur de la colonne G des fichiers (2 bis) et (3 bis), le zoom passe de 69 % à 75%.

A+
 

Pièces jointes

Dernière édition:
Re,
Merci pour votre aide, attention j'ai modifié la formule plutôt que d'intégrer la colonne AL dans l'onglet saisie
Là vous êtes complètement à côté de la plaque cher ami.

Vous ne voyez pas que votre dernière formule et la mienne du post #16 font la même chose ?

Sauf que la vôtre est plus compliquée !

Et vous n'avez pas compris que le tri sur la colonne AL est indispensable même avec cette formule !!

De plus vous protégez le VBA par mot de passe, c'est une protection parfaitement illusoire !!!!

A+
 
Bonjour Fabien62, le forum,

Encore un petit détail.

Dans la formule en A10 remplacer <=DATE(An;$H$5;31) par <DATE(An;$H$5+1;1)

Ainsi la formule fonctionne quel que soit le dernier mois de la période étudiée.

Fichiers (2 ter) et (3 ter).

En outre peut-être faut-il souligner une évidence.

Pour chaque feuille "Taxe" le nombre de dates trouvées en "Saisie réservations" ne doit pas dépasser 63.

Sinon augmenter le nombre de lignes ou réduire la période étudiée.

Bonne journée.
 

Pièces jointes

Bonjour Fabien62, le forum,

Deux remarques sur les solutions précédentes.

1) La macro s'exécute en près d'une seconde chez moi, c'est dû au fait que toutes les feuilles se recalculent quand le tri s'exécute et quand les lignes sont affichées ou masquées.

Cela à cause des nombreuses fonctions volatiles DECALER.

Dans les fichiers joints le calcul est passé en manuel, cela fait gagner 50% sur le temps de calcul.

2) La feuille "Saisie réservations" ne doit pas être filtrée sinon le résultat peut être mauvais.

Bonne journée.
 

Pièces jointes

Dernière édition:
Re,

Une solution (sans saut de page) avec des tableaux VBA :
Code:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim deb As Date, fin As Date, t1, t2, tablo, i&, n&
With Sh
  If .Name Like "Taxe*" Then 'critère
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual 'calcul manuel
    deb = DateSerial([An], .[G5], 1)
    fin = DateSerial([An], .[H5] + 1, 1)
    .Rows.Hidden = False 'RAZ
    .[A10:C72,H10:H72] = "" 'RAZ
    t1 = .[A10:C72]: t2 = .[H10:H72]
    tablo = Feuil1.[A1].CurrentRegion.Resize(, 27) 'matrice, plus rapide
    For i = 2 To UBound(tablo)
      If tablo(i, 2) >= deb And tablo(i, 2) < fin And tablo(i, 12) = "Convention" Then
        n = n + 1
        If n < 64 Then 'sécurité
          t1(n, 1) = tablo(i, 2): t1(n, 2) = tablo(i, 3)
          t1(n, 3) = tablo(i, 27): t2(n, 1) = tablo(i, 10)
        End If
      End If
    Next
    .[A10:C72] = t1: .[H10:H72] = t2
    .[A10:H72].Sort .[A10], xlAscending, Header:=xlNo 'tri
    If n < 63 Then .Rows(n + 10 & ":72").Hidden = True 'Total en ligne 73
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    If n > 63 Then MsgBox "Le nombre de lignes du tableau est insuffisant..."
  End If
End With
End Sub
Fichier (4).

C'est à peine plus rapide mais ici la feuille "Saisie réservations" peut être filtrée sans inconvénient.

A+
 

Pièces jointes

Dernière édition:
Re,

Une solution avec une seule feuille pour les taxes et un UserForm :
Code:
Private Sub CommandButton1_Click() 'bouton Valider
Dim deb As Date, fin As Date, t1, t2, tablo, i&, n&
If Not IsDate(TextBox1) Then TextBox1 = "": TextBox1.SetFocus: Exit Sub
If Not IsDate(TextBox2) Then TextBox2 = "": TextBox2.SetFocus: Exit Sub
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual 'calcul manuel
deb = CDate(TextBox1)
fin = CDate(TextBox2)
[A3] = UCase("période du " & Format(deb, "d mmmm yyyy") & " au " & Format(fin, "d mmmm yyyy"))
[A3] = Replace([A3], " 1 ", " 1ER ")
Rows.Hidden = False 'RAZ
[A10:C72,H10:H72] = "" 'RAZ
t1 = [A10:C72]: t2 = [H10:H72]
tablo = Feuil1.[A1].CurrentRegion.Resize(, 27) 'matrice, plus rapide
For i = 2 To UBound(tablo)
  If tablo(i, 2) >= deb And tablo(i, 2) <= fin And tablo(i, 12) = "Convention" Then
    n = n + 1
    If n < 64 Then 'sécurité
        t1(n, 1) = tablo(i, 2): t1(n, 2) = tablo(i, 3)
        t1(n, 3) = tablo(i, 27): t2(n, 1) = tablo(i, 10)
    End If
  End If
Next
[A10:C72] = t1: [H10:H72] = t2
[A10:H72].Sort [A10], xlAscending, Header:=xlNo 'tri
If n < 63 Then Rows(n + 10 & ":72").Hidden = True 'Total en ligne 73
Application.Calculation = xlCalculationAutomatic
Unload Me
Application.ScreenUpdating = True
If n > 63 Then MsgBox "Le nombre de lignes du tableau est insuffisant, réduisez la période..."
End Sub
Fichier joint.

A+
 

Pièces jointes

Dernière édition:
- 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

Réponses
7
Affichages
223
Réponses
7
Affichages
282
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
557
Réponses
2
Affichages
225
Retour