Macros à la suite?

Bonsoir à tous,

J'ai réussi à créer une macro qui permet de masquer les colonnes d'un tableau en fonction de la valeur prise par certaines cellules d'une feuille Excel.

A ce stade, tout roule, le problème vient ensuite , la première macro fonctionne.

Par la suite, je souhaite masquer les lignes qui ont des cellules vides à partir de la colonne E, et la, la macro qui suit ne fonctionne pas.

Le code de la première macro (qui fonctionne) :

Sub Worksheet_Calculate()

Worksheets("Effectif").Select

' On efface les masques précédents

Rows("1:100").Select

Selection.EntireRow.Hidden = False

Columns("C:M").Select

Selection.EntireColumn.Hidden = False

' Si le nom est = vide => masquer

If Range("E2").Value = "" Then

Columns("E:E").Select

Selection.EntireColumn.Hidden = True

End If

If Range("F2").Value = "" Then

Columns("F:F").Select

Selection.EntireColumn.Hidden = True

End If

If Range("G2").Value = "" Then

Columns("G:G").Select

Selection.EntireColumn.Hidden = True

End If

If Range("H2").Value = "" Then

Columns("H:H").Select

Selection.EntireColumn.Hidden = True

End If

If Range("I2").Value = "" Then

Columns("I:I").Select

Selection.EntireColumn.Hidden = True

End If

If Range("J2").Value = "" Then

Columns("J:J").Select

Selection.EntireColumn.Hidden = True

End If

If Range("K2").Value = "" Then

Columns("K:K").Select

Selection.EntireColumn.Hidden = True

End If

End Sub

Mon tableau commence à la ligne 6, donc la valeur initiale de ma variable part de ce chiffre, dans la macro suivante :

Worksheets("Effectif").Select

Dim ligne As Integer

For ligne = 6 To 100

If Cells(ligne, 5) = "" And Cells(ligne, 6) = "" And Cells(ligne, 7) = "" And Cells(ligne, 8) = "" And Cells(ligne, 9) = "" And Cells(ligne, 10) = "" And Cells(ligne, 11) = "" Then

Rows(ligne & ":" & ligne).EntireRow.Hidden = True

End If

Next

End Sub

Je précise que ces macros sont appelées à la suite du changement de valeur d'une cellule d'une feuille du classeur, voici le code :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("D1").Address Then

Call Module1.Worksheet_Calculate

End If

Call Module1.Masquer_lignes

End Sub

Les colonnes du tableau sont bien masquées quand les cellules de critères sont remplies, mais en revanche les lignes vides ne disparaissent pas à la suite...

Je vous joins mon fichier :

Merci d'avance pour vos lumières!

Bonjour,

vous pouvez essayer avec ceci pour l'instruction de masquage des lignes :

Cells(ligne, 5).EntireRow.Hidden = True

On définie une cellule, puis on prend la ligne entière et on cache

Seules quelques lignes sont masquées car il y a beaucoup de "X" et comme il faut que ce soit vide partout "ET", il n'y a pas beaucoup de "VRAI" à la condition...

@ bientôt

LouReeD

Et vous pouvez ajoutez un :

Application.ScreenUpdating = False

au début de la Sub afin d'éviter à l'écran de "scintiller"

@ bientôt

LouReeD

Bonjour,

vous pouvez essayer avec ceci pour l'instruction de masquage des lignes :

Cells(ligne, 5).EntireRow.Hidden = True

On définie une cellule, puis on prend la ligne entière et on cache

Seules quelques lignes sont masquées car il y a beaucoup de "X" et comme il faut que ce soit vide partout "ET", il n'y a pas beaucoup de "VRAI" à la condition...

@ bientôt

LouReeD

Hey LouReed do you hear me? Haha

Donc je vire toutes les instructions avec AND dans la macro de masque?

Merci

Ce n'est pas ce que j'ai dis : je dis "il est normale qu'il n'y ait pas beaucoup de ligne à se masquer car il n'y a pas beaucoup de ligne où toutes les colonnes de 5 à 11 ( de E à K) sont vides"

Voilà ce que je dis

Si c'est la condition, alors gardez le "AND3 par contre si votre condition est "au moins une cellule de vide" alors il faut mettre un "OR"...

Il est vrai que vous dites :

Par la suite, je souhaite masquer les lignes qui ont des cellules vides à partir de la colonne E, et la, la macro qui suit ne fonctionne pas.

avec "qui ont des cellules vides" et non pas qui ont TOUTES les cellules vides, donc à la relecture je vous dirais de mettre un "OR" à la place des "AND".

@ bientôt

LouReeD

Bonjour le fil, bonjour le forum,

Dans ton exemple aucune ligne ne vérifie la condition pour la masquer... Sinon, j'écrirais les code comme ça :

Sub Worksheet_Calculate()
Dim O As Worksheet
Dim COL As Byte

Application.ScreenUpdating = False
Set O = Worksheets("Effectif")
O.Rows("1:100").Hidden = False
O.Columns("C:M").Hidden = False
For COL = 5 To 11
    If Cells(2, COL).Value = "" Then Columns(COL).Hidden = True
Next COL
Application.ScreenUpdating = True
End Sub

Sub Masquer_lignes()
Dim O As Worksheet
Dim LI As Integer

Set O = Worksheets("Effectif")
Application.ScreenUpdating = False
For LI = 6 To 100
    If Application.WorksheetFunction.CountBlank(O.Range(O.Cells(LI, 5), O.Cells(LI, 11))) = 7 Then O.Rows(LI).Hidden = True
Next LI
Application.ScreenUpdating = True
End Sub

Ce n'est pas ce que j'ai dis : je dis "il est normale qu'il n'y ait pas beaucoup de ligne à se masquer car il n'y a pas beaucoup de ligne où toutes les colonnes de 5 à 11 ( de E à K) sont vides"

Voilà ce que je dis

Si c'est la condition, alors gardez le "AND3 par contre si votre condition est "au moins une cellule de vide" alors il faut mettre un "OR"...

Il est vrai que vous dites :

Par la suite, je souhaite masquer les lignes qui ont des cellules vides à partir de la colonne E, et la, la macro qui suit ne fonctionne pas.

avec "qui ont des cellules vides" et non pas qui ont TOUTES les cellules vides, donc à la relecture je vous dirais de mettre un "OR" à la place des "AND".

@ bientôt

LouReeD

En fait je souhaite que ce soit les lignes qui n'ont aucun des critères de satisfait qui soient masquées, donc ne contenant que du blanc, pas simplement une colonne avec du blanc.

Bonjour le fil, bonjour le forum,

Dans ton exemple aucune ligne ne vérifie la condition pour la masquer... Sinon, j'écrirais les code comme ça :

Sub Worksheet_Calculate()
Dim O As Worksheet
Dim COL As Byte

Application.ScreenUpdating = False
Set O = Worksheets("Effectif")
O.Rows("1:100").Hidden = False
O.Columns("C:M").Hidden = False
For COL = 5 To 11
    If Cells(2, COL).Value = "" Then Columns(COL).Hidden = True
Next COL
Application.ScreenUpdating = True
End Sub

Sub Masquer_lignes()
Dim O As Worksheet
Dim LI As Integer

Set O = Worksheets("Effectif")
Application.ScreenUpdating = False
For LI = 6 To 100
    If Application.WorksheetFunction.CountBlank(O.Range(O.Cells(LI, 5), O.Cells(LI, 11))) = 7 Then O.Rows(LI).Hidden = True
Next LI
Application.ScreenUpdating = True
End Sub

Ton code me masque les colonnes de l'onglet "imprimer" au lieu de l'onglet "Effectif".

Test sur le fichier tu verras

Re,

Oui pardon ! Il y avait une erreur :

Sub Worksheet_Calculate()
Dim O As Worksheet
Dim COL As Byte

Application.ScreenUpdating = False
Set O = Worksheets("Effectif")
O.Rows("1:100").Hidden = False
O.Columns("C:M").Hidden = False
For COL = 5 To 11
    If O.Cells(2, COL).Value = "" Then O.Columns(COL).Hidden = True
Next COL
Application.ScreenUpdating = True
End Sub

Re,

Oui pardon ! Il y avait une erreur :

Sub Worksheet_Calculate()
Dim O As Worksheet
Dim COL As Byte

Application.ScreenUpdating = False
Set O = Worksheets("Effectif")
O.Rows("1:100").Hidden = False
O.Columns("C:M").Hidden = False
For COL = 5 To 11
    If O.Cells(2, COL).Value = "" Then O.Columns(COL).Hidden = True
Next COL
Application.ScreenUpdating = True
End Sub

Euh c'est le même code non?

Non ! Si tu avais testé tu l'aurais vu. Heu... Ça t'arrive de dire merci des fois ?...

Non ! Si tu avais testé tu l'aurais vu. Heu... Ça t'arrive de dire merci des fois ?...

Merci pardon.

J'ai testé et ça ne change rien. Les colonnes sont biens masquées mais les lignes non.

Désolé encore,

Non ! Si tu avais testé tu l'aurais vu. Heu... Ça t'arrive de dire merci des fois ?...

En fait j'ai l'impression que la macro Masquer Ligne ne fonctionne pas dans tous les cas de figure.

Dans un cas où seul deux critères sont nécessaires (deux colonnes), le filtre ne s'applique pas, de même en situation d'un seul critère.

Le fichier avec le code :

Je te prie de m'excuser si je n'ai pas explicité certains point, merci d'avance.

Re,

Je ne comprends pas ce que tu veux dire. Dans ton dernier exemple, seules les lignes 34 et 71 respectent la condition pour être masquées. Pour la ligne 50, la colonne E n'est pas vide donc condition non respectée. La macro fonctionne parfaitement ou alors ton explication n'était pas claire...

Peut être qu'il faudrait utiliser la référence du tableau au lieu de la feuille de calcul?

Le tableau se nomme TabAg.

Genre avec Application.Goto Reference:="TabAg".

Mmh, compliquée cette affaire.

Re,

Si tu disais ce qui ne va pas !... Car pour moi le problème est réglé et on ne pourra pas t'aider davantage si tu manques de clarté.

Re,

Je ne comprends pas ce que tu veux dire. Dans ton dernier exemple, seules les lignes 34 et 71 respectent la condition pour être masquées. Pour la ligne 50, la colonne E n'est pas vide donc condition non respectée. La macro fonctionne parfaitement ou alors ton explication n'était pas claire...

C'est possible, désolé encore.

Dans le dernier fichier que j'ai posté, à l'onglet "imprimer", j'ai renseigné en cellule D1, la valeur "8".

Cela déclenche la macro sur l'onglet "Effectif", masque les colonnes qui ne correspondent pas au critère cochés dans la zone au dessus du tableau TabAg contenant les noms.

Sur la capture d'écran que je joins à ce message... :

capture

...tu peux voir par toi même que les lignes "vides" (cad qui le sont sauf les colonnes de A à D) sont toujours bien présentes.

De même dans cet autre cas, où seulement deux critères sont à prendre en ligne de compte :

capture2

J'espère que j'ai été plus clair que précédemment, et encore désolé.

Merci merci merci

Bonjour,

indépendamment de la question je ne trouve pas que le choix de l'événement soit judicieux : Worksheet_Calculate

Exécuter ces actions le plus souvent inutilement à chaque saisie n'importe où est douteux.

eric

Bonjour,

indépendamment de la question je ne trouve pas que le choix de l'événement soit judicieux : Worksheet_Calculate

Exécuter ces actions le plus souvent inutilement à chaque saisie n'importe où est douteux.

eric

Bonjour eric,

Oui, ça fait un peu bricolé, mais je n'ai trouvé d'alternatives...

Je suis sur ce fichier depuis un bail, sans succès.

Ce n'est pas ce que j'ai dis : je dis "il est normale qu'il n'y ait pas beaucoup de ligne à se masquer car il n'y a pas beaucoup de ligne où toutes les colonnes de 5 à 11 ( de E à K) sont vides"

Voilà ce que je dis

Si c'est la condition, alors gardez le "AND3 par contre si votre condition est "au moins une cellule de vide" alors il faut mettre un "OR"...

Il est vrai que vous dites :

Par la suite, je souhaite masquer les lignes qui ont des cellules vides à partir de la colonne E, et la, la macro qui suit ne fonctionne pas.

avec "qui ont des cellules vides" et non pas qui ont TOUTES les cellules vides, donc à la relecture je vous dirais de mettre un "OR" à la place des "AND".

@ bientôt

LouReeD

Le truc c'est qu'une fois certaines colonnes masquées, le nombre de lignes "vides" (donc excepté de A à D) change!

Une ligne ne serait pas masquée car aurait un nombre de critères satisfaits dans un cas (Exemple: On a 2 critères),

capture2

mais dans un autre elle serait masquée (Ex: 1 critère)

capture

Tu vois où je veux en venir? [Dans les captures, les lignes ne sont pas masquées car la macro ne fonctionne pas]

Merci merci

Rechercher des sujets similaires à "macros suite"