Lier un filtre et une macro masquant colonnes sous conditions

gommettes

XLDnaute Nouveau
Bonjour,

Je débute en macro sur excel et voici ma demande : j'aimerais associer un filtre à un bouton/macro qui me permettrait de cacher des colonnes ne remplissant pas ma condition.
J'aimerais qu'une fois le filtre appliqué sur ma première colonne, je puisse appuyer sur le bouton/macro et que les colonnes ne contenant pas de "oui" soient masquées.
Est-ce qu'il serait possible que le bouton/macro marche peu importe le filtre appliqué ?

Merci beaucoup pour votre aide.

Voici mon fichier :
 

Pièces jointes

  • Classeurdiffusion.xlsx
    18.5 KB · Affichages: 57

job75

XLDnaute Barbatruc
Bonjour gommettes, salut Philippe,

La dernière question n'est pas claire, s'il s'agit de travailler sur un tableau transposé créez-le manuellement par Copier-Collage spécial.

En attendant voici une variante à la solution de l'ami Philippe :
Code:
Private Sub CommandButton1_Click()
Dim c As Range, masque As Range
With [A1].CurrentRegion
  If CommandButton1.Caption Like "M*" Then
    For Each c In .Columns
      If c.SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count = 1 _
        Then Set masque = Union(c, IIf(masque Is Nothing, c, masque))
    Next
    If Not masque Is Nothing Then masque.EntireColumn.Hidden = True
    CommandButton1.Caption = "Afficher les colonnes"
  Else
    .Columns.Hidden = False
    CommandButton1.Caption = "Masquer les colonnes"
  End If
End With
End Sub
A+
 

Pièces jointes

  • Classeurdiffusion(1).xlsm
    40.2 KB · Affichages: 36

job75

XLDnaute Barbatruc
Re,

Si j'ai bien compris ce que vous voulez voici le code de la feuille "BDD transposée" :
Code:
Private Sub Worksheet_Activate()
Dim i&, ligmasque As Range, colmasque As Range
With Sheets("BDD").[A1].CurrentRegion
  For i = 1 To .Columns.Count
    If .Columns(i).Hidden Then Set ligmasque = Union(Rows(i), IIf(ligmasque Is Nothing, Rows(i), ligmasque))
  Next
  For i = 1 To .Rows.Count
    If .Rows(i).Hidden Then Set colmasque = Union(Columns(i), IIf(colmasque Is Nothing, Columns(i), colmasque))
  Next
End With
Application.ScreenUpdating = False
Rows.Hidden = False: Columns.Hidden = False 'RAZ
If Not ligmasque Is Nothing Then ligmasque.EntireRow.Hidden = True
If Not colmasque Is Nothing Then colmasque.EntireColumn.Hidden = True
End Sub
Attention la méthode Union pose problème s'il y a beaucoup de plages disjointes à unir.

S'il y a beaucoup de lignes dans la feuilles "BDD" il faudra décharger périodiquement la variable colmasque.

Fichier (2).

A+
 

Pièces jointes

  • Classeurdiffusion(2).xlsm
    50.6 KB · Affichages: 40

job75

XLDnaute Barbatruc
Re,

Si l'on veut recréer le tableau transposé à chaque activation de la feuille :
Code:
Private Sub Worksheet_Activate()
Dim i&, ligmasque As Range, colmasque As Range
Application.ScreenUpdating = False
Cells.Delete 'RAZ
With Sheets("BDD") 'à adapter
  .Visible = xlSheetVisible 'au cas où...
  .Copy 'nouveau classeur
  With ActiveSheet
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    .Rows.Hidden = False: .Columns.Hidden = False
    .[A1].CurrentRegion.Copy
    [A1].PasteSpecial xlPasteAll, Transpose:=True
    Application.CutCopyMode = 0
    .Parent.Close False
  End With
  [A1].Select
  Columns(1).HorizontalAlignment = xlLeft
  Columns(1).ColumnWidth = 35 'largeur modifiable
  Rows.AutoFit 'ajustement hauteur
  With .[A1].CurrentRegion
    For i = 1 To .Columns.Count
      If .Columns(i).Hidden Then Set ligmasque = Union(Rows(i), IIf(ligmasque Is Nothing, Rows(i), ligmasque))
    Next
    For i = 1 To .Rows.Count
      If .Rows(i).Hidden Then Set colmasque = Union(Columns(i), IIf(colmasque Is Nothing, Columns(i), colmasque))
    Next
  End With
End With
If Not ligmasque Is Nothing Then ligmasque.EntireRow.Hidden = True
If Not colmasque Is Nothing Then colmasque.EntireColumn.Hidden = True
End Sub
Fichier (3).

Bonne fin de soirée.
 

Pièces jointes

  • Classeurdiffusion(3).xlsm
    51.3 KB · Affichages: 41

gommettes

XLDnaute Nouveau
Bonjour,

Je suis désolée de ne pas m'être manifestée plus tôt afin de vous remercier et de vous faire mon retour. J'ai eu quelques difficultés et je voulais vous faire un retour détaillé.

Le code ci-dessus correspond exactement à ce que je souhaite faire et je vous en remercie.
Cependant j'aurais souhaité restreindre la transposition à un ensemble de colonne seulement, est-ce possible ?

En fait dans mon idée, la feuille BDD transposée correspond à mon fichier global et devrait comporter plus de colonnes. Je voudrais donc que la transposition ne s'applique qu'aux dates (colonnes avec des oui) mais que le filtrage inclut toutes les autres colonnes. C'est-à-dire que dans BDD transposée seule les dates sélectionnées apparaissent et seule les lieux avec des oui apparaissent mais que les autres colonnes informatives correspondant aux lieux apparaissent dans BDD transposée sans que j'ai à les inscrire dans BDD.

Je vous remercie encore pour votre aide.

Belle journée,

Laurène
 

gommettes

XLDnaute Nouveau
Bonjour,

En fait suite à votre poste, j'ai testé la macro et ai perdu toutes les données de mon fichier et pour x raison je n'ai pas pu les récupérer. J'étais vraiment dépitée et j'ai pris le temps de m'en remettre pour revenir vers vous. Je comprends votre incompréhension.

Sur le fichier ci-joint vous trouverez une troisième feuille avec les colonnes supplémentaires que je voudrais inclure à la BDD transposée et auxquelles j'aimerais appliquer le filtrage.

Ma question en substance : comment appliquer votre macro sur une partie seulement des colonnes ?

Merci beaucoup
 

Pièces jointes

  • Classeurdiffusion(3) (1).xlsm
    51.3 KB · Affichages: 31

gommettes

XLDnaute Nouveau
Re,

En faisant un collage spécial transposé avec =TRANSPOSE, je résous une partie du problème et du coup j'aimerais en fait simplement, que le filtrage effectué en BDD s'applique en BDD transposé.

J'espère être le plus claire possible. Merci encore pour votre aide.
 

Discussions similaires

Réponses
2
Affichages
208
Haut Bas