Optimisation d'un onglet Excel en VBA [RESOLU]

steph59940

XLDnaute Nouveau
Bonjour le forum,

Voilà plusieurs jours que j'essaie de trouver la solution à mon problème, mais en vain, j'aurai besoin d'un petit coup de pouce svp.
Pour info, je suis plus un débutant bidouilleur de morceaux de code récupéré çà et là que j'adapte.. Ça dépanne, mais parfois (souvent) ça coince.
Sur le tableau joint, je souhaiterai un code qui permettrait, dans un premier temps, de masquer les dernières colonnes qui contiendraient une valeur = 0 de la ligne 2 à la dernière ligne du tableau ( variable en fonction des semaines = chaque semaine un tableau réactualisé)
Dans un second temps, je souhaiterais travailler sur chaque ligne une à une pour masquer celles qui auraient une valeur à 0 de la colonne D à la dernière colonne.

Pensez-vous cela possible ?
Merci pour votre aide.
 

Pièces jointes

  • Planification Moustiquaires en cours.xlsm
    321.9 KB · Affichages: 14

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour le premier, s'il ne peut y avoir que des nombres positifs :
VB:
Sub MasquerCol()
   Dim Rng As Range, C As Long
   Set Rng = Worksheets("Base").UsedRange
   Set Rng = Rng.Rows(2).Resize(Rng.Rows.Count - 1)
   Rng.EntireColumn.Hidden = False
   For C = Rng.Columns.Count To 1 Step -1
      If WorksheetFunction.Sum(Rng.Columns(C)) = 0 Then
         Rng.Columns(C).EntireColumn.Hidden = True
      Else: Exit Sub: End If: Next C
   End Sub
Pour le second un code très semblable devrait être possible
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Bernard a été plus rapide comme souvent... Je te propose quand même un code similaire mais complet et commenté :

VB:
Sub Macro1()
Dim OB As Worksheet 'déclare la variable OB (Onglet Base)
Dim PL As Range 'déclare la variable PL (PLage)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim NNC As Integer 'déclare la variable NNC (Nouveau Nombre de Colonnes)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OB = Worksheets("Base") 'définit l'onglet base OB
OB.Columns.Hidden = False 'affiche toutes les colonnes de l'onglet
OB.Rows.Hidden = False 'affiche toutes les lignes de l'onglet

'masque les colonnes
Set PL = OB.Range("A1").CurrentRegion 'définit la plage PL
NL = PL.Rows.Count - 1 'définit le nombre de ligne NL de la plage PL (moins une pour l'en-tête)
NC = PL.Columns.Count 'définit le nombre de colonnes NC de la plage PL
For I = NC To 1 Step -1 'boucle inversée sur les colonnes de la plage PL (de NL à 1)
    'condition : si le nombre de zéros de la colonne de la boucle est égal à NL
    If Application.WorksheetFunction.CountIf(Application.Intersect(PL, Columns(I)), 0) = NL Then
        OB.Columns(I).Hidden = True ' masque la colonne
    Else 'sinon
        NNC = I - 3 'définit le nouveau nombre de colonne NNC (moins 3 puisqu'on par de la colonne D)
        Exit For 'sort de la boucle
    End If 'fin de la condition
Next I 'prochaine colonne de la boucle

'masque les lignes
For I = 2 To NL 'boucle sur toutes les lignes I de la plage PL (en partant de la seconde)
    'si le nombre de zéro dans la ligne de la boucle (en partant de la colonne D) est égal à NNC, masque la ligne
    If Application.WorksheetFunction.CountIf(OB.Cells(I, "D").Resize(1, NNC), 0) = NNC Then OB.Rows(I).Hidden = True
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
 

Dranreb

XLDnaute Barbatruc
C'est curieux, je ne suis pas arrivé à faire fonctionner WorksheetFunction.CountIf: ça me donnait chaque fois un mauvais résultat. Alors j'ai fini par écrire tout ça comme ça, vu que j'ai vu qu'il y avait des valeurs négatives qui risquaient de compenser exactement les positives dans une simple somme :
VB:
Sub MasquerCol()
   Dim Rng As Range, T(), L As Long, C As Long
   Set Rng = Worksheets("Base").UsedRange
   Set Rng = Rng(2, 4).Resize(Rng.Rows.Count - 1, Rng.Columns.Count - 3)
   T = Rng.Value
   For C = Rng.Columns.Count To 1 Step -1
      For L = UBound(T, 1) To 1 Step -1
         If T(L, C) <> 0 Then Exit For
         Next L
      If L >= 1 Then Exit For
      Next C
   Rng.EntireColumn.Hidden = True
   If C >= 1 Then Rng.Columns(1).Resize(, C).EntireColumn.Hidden = False
   End Sub
Sub MasquerLig()
   Dim Rng As Range, T(), L As Long, C As Long, RH As Range
   Set Rng = Worksheets("Base").UsedRange
   Set Rng = Rng(2, 4).Resize(Rng.Rows.Count - 1, Rng.Columns.Count - 3)
   T = Rng.Value
   For L = 1 To UBound(T, 1)
      For C = 1 To UBound(T, 2)
         If T(L, C) <> 0 Then
            If RH Is Nothing Then Set RH = Rng.Rows(L) Else Set RH = Union(RH, Rng.Rows(L))
            Exit For: End If
         Next C, L
   Rng.EntireRow.Hidden = True
   If Not RH Is Nothing Then RH.EntireRow.Hidden = False
   End Sub
 

Discussions similaires

Réponses
22
Affichages
690