XL 2019 Masquer lignes entièrement vide

ALE37

XLDnaute Junior
Bonjour le forum,

Je souhaiterai pouvoir masquer (et démasquer) toutes les lignes entièrement vides (zéro, formules ou pas) dans cette matrice Excel.
Dans l'exemple de la ligne 14 à 159. J'ai fouillé un peu partout dans le forum mais je n'ai pas trouvé mon bonheur.
Quelqu'un pourrait il me proposer une solution ?
D'avance merci pour votre aide.
 

Pièces jointes

  • Test_masquer ligne entierement vides.xlsm
    73.7 KB · Affichages: 8
Solution
Je reviens sur le sujet. Finalement un collègue m'a proposé la solution suivante en VBA, extrêmement rapide.
Ci joint le code pour ceux qui seraient intéressés.

Sub masqueligne()
Dim i As Integer, derLig As Long
derLig = Cells(Rows.Count, 1).End(xlUp).Row 'ou 1 = le numéro de la colonne à tester pour savoir quelle est la deniere ligne utilisée
For i = 11 To derLig 'alors si on veux faire commencer l'opération à partir d'une ligne autre que 1 et on change le nombre
If Cells(i, 50) = "" Or Cells(i, 50) = 0 Then '(on teste sur la colonne 50 dans l'exemple, soit AX, car il s'agit d'un cumul, ligne i)
Cells(i, 11).EntireRow.Hidden = True
Else: Cells(i, 11).EntireRow.Hidden = False
End If
Next i
End Sub

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Ale,
Une solution simple parmi d'autres est de mettre en dernière colonne (AY) un filtre qui permet de masquer les lignes. Sur chaque cellule est noté "Utilisée" si la ligne est non vide. donc si on filtre sur "Utilisée" n'apparaissent que les bonnes lignes.
 

Pièces jointes

  • Test_masquer ligne entierement vides.xlsm
    79.3 KB · Affichages: 8

ALE37

XLDnaute Junior
Bonjour Ale,
Une solution simple parmi d'autres est de mettre en dernière colonne (AY) un filtre qui permet de masquer les lignes. Sur chaque cellule est noté "Utilisée" si la ligne est non vide. donc si on filtre sur "Utilisée" n'apparaissent que les bonnes lignes.
Bonjour Sylvanu, effectivement je n'y avais pas pensé! C'est une solution simple. Je cherchais une possibilité en VBA à l'origine. Dans l'immédiat je vais recourir à cette solution. Encore merci!
 

ALE37

XLDnaute Junior
Je reviens sur le sujet. Finalement un collègue m'a proposé la solution suivante en VBA, extrêmement rapide.
Ci joint le code pour ceux qui seraient intéressés.

Sub masqueligne()
Dim i As Integer, derLig As Long
derLig = Cells(Rows.Count, 1).End(xlUp).Row 'ou 1 = le numéro de la colonne à tester pour savoir quelle est la deniere ligne utilisée
For i = 11 To derLig 'alors si on veux faire commencer l'opération à partir d'une ligne autre que 1 et on change le nombre
If Cells(i, 50) = "" Or Cells(i, 50) = 0 Then '(on teste sur la colonne 50 dans l'exemple, soit AX, car il s'agit d'un cumul, ligne i)
Cells(i, 11).EntireRow.Hidden = True
Else: Cells(i, 11).EntireRow.Hidden = False
End If
Next i
End Sub
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir ALE37, sylvanu,

dans le code VBA de ton post #4 il y a :

Else: Cells(i, 11).EntireRow.Hidden = False

attention au caractère : qui se met parfois automatiquement juste à droite du Else !

car dans ce cas, ça signifie : « sinon ne rien faire du tout » !

et ce qui est à droite Cells(i, 11).EntireRow.Hidden = False

est indépendant du If donc exécuté de façon inconditionnelle !

mais si le code VBA te donne toujours correctement les résultats attendus,
c'est que le : malencontreux est seulement dans ton post #4,
pas dans ton vrai code VBA ! 🍀

soan
 
Dernière édition:

ALE37

XLDnaute Junior
Bonsoir Soan, merci pour ces remarques. Je vais vérifier mais il s’agit probablement d’un problème de retranscription lors de mon copier coller. La macro fonctionne bien mais je la trouve lente pour masquer les lignes. Existe t il un code pour accélérer cette procédure ?
 

soan

XLDnaute Barbatruc
Inactif
Bonjour ALE37, sylvanu,

change ainsi la ligne du Dim :

Dim derLig&, i%: Application.ScreenUpdating = 0

la même chose avec balises de code :

Dim derLig&, i%: Application.ScreenUpdating = 0

c'est inutile d'ajouter Application.ScreenUpdating = -1 car
c'est fait automatiquement avant la sortie de la sub.

remarque : 0 : idem que False ; et -1 : idem que True

soan
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Soan,
Ce n'est pas tout à fait vrai.
C'est le cas avec les versions VBA actuelles, mais MS précise bien :
VB:
Une fois l'exécution de la macro terminée, songez à redéfinir la propriété ScreenUpdating sur True.
Donc même si on le fait régulièrement, il est quand même bon de le préciser à quelqu'un qui ne connait pas.
 

soan

XLDnaute Barbatruc
Inactif
@sylvanu

moi, je n'ai jamais eu de problème en faisant comme je l'ai décrit ; mais bien sûr, s'il y a un MsgBox avant la sortie de sub et qu'on veut voir des résultats à jour en arrière-plan de la boîte de dialogue, alors là oui, il faut mettre Application.ScreenUpdating = True !

c'est pour ça que je n'ai jamais compris la recommandation de Microsoft que tu as indiquée ! quelle en est donc l'utilité ? vu que c'est dans un manuel de Microsoft qu'il était indiqué ce que j'ai écrit : mise à True automatique avant la sortie de la sub ; en fait, je crois que Microsoft a mis ça par prudence, envers ceux qui ne connaissent pas bien le VBA : ça évite que des débutants se demandent pourquoi des résultats en arrière-plan d'une boîte de dialogue MsgBox ne sont pas à jour s'ils ont omis de mettre avant la mise à True en question ; maintenant, chacun fait comme il préfère ! :)



autre exemple : Microsoft recommande avec raison de sauvegarder le Registre Windows avant toute modification ; mais quand tu es absolument sûr et certain de la modification que tu vas faire, c'est inutile de sauvegarder le Registre ! c'est juste une précaution que Microsoft prend pour se prémunir des fausses manips d'utilisateurs "béotiens". 😜

soan
 
Dernière édition:

ALE37

XLDnaute Junior
Bonjour ALE37, sylvanu,

change ainsi la ligne du Dim :

Dim derLig&, i%: Application.ScreenUpdating = 0

la même chose avec balises de code :

Dim derLig&, i%: Application.ScreenUpdating = 0

c'est inutile d'ajouter Application.ScreenUpdating = -1 car
c'est fait automatiquement avant la sortie de la sub.

remarque : 0 : idem que False ; et -1 : idem que True

soan
Oui j’avais essayé déjà avec Screen Updating mais il y avait peu de changement dans le rafraîchissement. Je vais essayer la méthode proposée et je te redis ça !
 

ALE37

XLDnaute Junior
Bonsoir ALE37, sylvanu,

dans le code VBA de ton post #4 il y a :

Else: Cells(i, 11).EntireRow.Hidden = False

attention au caractère : qui se met parfois automatiquement juste à droite du Else !

car dans ce cas, ça signifie : « sinon ne rien faire du tout » !

et ce qui est à droite Cells(i, 11).EntireRow.Hidden = False

est indépendant du If donc exécuté de façon inconditionnelle !

mais si le code VBA te donne toujours correctement les résultats attendus,
c'est que le : malencontreux est seulement dans ton post #4,
pas dans ton vrai code VBA ! 🍀

soan
En effet ce n'est pas une erreur de saisie...A priori celà me donne quand même les bons résultats mais merci pour l'info!
 

soan

XLDnaute Barbatruc
Inactif
@ALE37

ton fichier en retour. :)

j'ai bien optimisé ton code VBA, et j'ai testé la macro ; c'est OK ! 😊

code VBA (10 lignes) :

VB:
Option Explicit

Sub masqueligne()
  Dim derLig&, i%: Application.ScreenUpdating = 0
  derLig = Cells(Rows.Count, 1).End(3).Row 'dernière ligne, selon colonne A
  For i = 11 To derLig 'de la ligne 11 à la dernière ligne
    Rows(i).Hidden = Cells(i, "AX") = 0
  Next i
End Sub

merci de me donner ton avis. ;)

soan
 

Pièces jointes

  • Historique Heure PAMS.xlsx
    76.7 KB · Affichages: 11

ALE37

XLDnaute Junior
Rebonjour SOAN, je viens de tester. ça marche bien mais il faut compter 15s environ pour masquer ma matrice mais mon classeur compte pas mal d'onglets. C'est peut être pour cette raison que celà prend du temps ??
 

Discussions similaires

Réponses
30
Affichages
2 K
Réponses
2
Affichages
886