Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Macro pour trier des lignes en cachant des colonnes

Ned2

XLDnaute Nouveau
Bonjour à tous,

L'Excel dont je parle dans la suite se trouve en PJ.

Je souhaite aujourd'hui appliquer un filtre sur mes lignes. Pour cela, je crée un bouton de commande. Celui si affiche un formulaire qui me demande ce que je souhaite filtrer, et je peux donc sélectionner parmi des choix proposés (qui correspondent aux choix possibles pour compléter la ligne "Type de projet"). Mon objectif est que, quand je sélectionne le choix "Façades", le code parcourt toutes les colonnes, uniquement sur la ligne "Type de Projet" et me cache les colonnes où le type n'est pas "Façade".

Pour cela, j'ai appliqué le code suivant :

VB:
Dim Col As Integer
Dim LastCol As Long
Dim Colonne_Actu As Long
Dim onglet As Worksheet

Sub Last()
'trouver la dernière coloonne du tableau
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
End Sub

Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "Ouvrage Fonctionnel"
.AddItem "Ouvrage institutionnel"
.AddItem "Façade"
.AddItem "Syndic"
.AddItem "Retail"
.AddItem "Logements"
End With
End Sub

Private Sub Btn_CancelFiltre_Click()
    Columns("A:IV").EntireColumn.Hidden = False
    'IV est la dernière colonne existante
End Sub


Private Sub Btn_Filtrer_Click()

'boucle sur colonne
    For Colonne_Actu = 7 To LastCol:
        If Cells(6, Colonne_Actu) <> ComboBox1.Value Then
            Columns(Colonne_Actu).EntireColumn.Hidden = True
        End If
        Next Colonne_Actu
      
End Sub

Mon problème : Lorsque je clique sur le bouton Filtrer de mon Useform, rien ne se passe dans mon tableau. Le bouton Défiltrer fonctionne en revanche.

J'ai passé beaucoup de temps à le relire et à tenter de comprendre ce qui ne fonctionne pas, mais en vain.

Je remercie d'avance ceux qui prendront le temps de répondre à mon problème !

Ned2
 

Pièces jointes

  • Test Cacher Colonne Macro.xlsm
    30.5 KB · Affichages: 6
Solution
Bonsoir
En utilisant Option explicit tu te aurais peut être identifier le problème directement.
Tu fais une une de 7 jusqu'à LastCol qui vaut quoi?
Cordialement

VB:
Private Sub Btn_Filtrer_Click()
Application.ScreenUpdating = False
  Dim LastCol As Integer
  LastCol = Cells(4, Columns.Count).End(xlToLeft).Column
'boucle sur colonne
    For Colonne_Actu = 7 To LastCol
        If Cells(6, Colonne_Actu) <> ComboBox1.Value Then
            Columns(Colonne_Actu).EntireColumn.Hidden = True
        End If
    Next Colonne_Actu
Application.ScreenUpdating = True
End Sub

yal

XLDnaute Occasionnel
Bonsoir
En utilisant Option explicit tu te aurais peut être identifier le problème directement.
Tu fais une une de 7 jusqu'à LastCol qui vaut quoi?
Cordialement

VB:
Private Sub Btn_Filtrer_Click()
Application.ScreenUpdating = False
  Dim LastCol As Integer
  LastCol = Cells(4, Columns.Count).End(xlToLeft).Column
'boucle sur colonne
    For Colonne_Actu = 7 To LastCol
        If Cells(6, Colonne_Actu) <> ComboBox1.Value Then
            Columns(Colonne_Actu).EntireColumn.Hidden = True
        End If
    Next Colonne_Actu
Application.ScreenUpdating = True
End Sub
 

Ned2

XLDnaute Nouveau
Bonsoir
En utilisant Option explicit tu te aurais peut être identifier le problème directement.
Tu fais une une de 7 jusqu'à LastCol qui vaut quoi?
Cordialement
Qu'est ce que Option Explicit ?

Last Col correspond à la ligne :
VB:
Sub Last()
'trouver la dernière coloonne du tableau
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
End Sub

Je l'ai déplacé (cfr code ci dessous), mais pas de changement
VB:
Private Sub Btn_Filtrer_Click()
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
'boucle sur colonne
    For Colonne_Actu = 7 To LastCol:
        If Cells(6, Colonne_Actu) <> ComboBox1.Value Then
            Columns(Colonne_Actu).EntireColumn.Hidden = True
        End If
        Next Colonne_Actu
      
End Sub
 

Phil69970

XLDnaute Barbatruc
Bonjour @Ned @yal

Qu'est ce que Option Explicit ?
Option Explicit te force à déclarer tes variables

Ce qui est dingue c'est que Yal te donne un code qui fonctionne et tu t'amuses à le modifier et à recopier autre chose et dire après :
Je l'ai déplacé (cfr code ci dessous), mais pas de changement
Si tu fais défiler ta macro "Private Sub Btn_Filtrer_Click()" du post 1 pas à pas tu aurais vu que LastCol n'est pas initialisé

Et toujours en pas à pas de ta macro du post 3 tu aurais vu que LastCol vaut 1 alors que dans le post de Yal LastCol = 22 ==> donc la bonne valeur

Bonne lecture

@Phil69970
 

yal

XLDnaute Occasionnel
Bonjour @Phil @Ned2
Merci Phil pour le complément de pédagogie.
Ned
VB:
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
là tu cherches la dernière colonne de la ligne 1 qui est une ligne vide donc la première colonne c'est ? 1
Si j'ai mis 7 dans l'instruction c'est que c'était la ligne la plus remplie.
 

Ned2

XLDnaute Nouveau
Bonjour,

Je suis désolée, peut-être est ce du à la fatigue, je n'avais pas compris la première fois le code de Yal, qui fonctionne en effet. Tes explications sont claires également, je t'en remercie.

Il s'agissait d'un simple malentendu, je ne "m'amuse" pas, j'essaie d'apprendre...



Bonne journée,
Ned2
 
Dernière édition:

Ned2

XLDnaute Nouveau

J'ai bien compris ton code et mes erreurs maintenant, merci pour tes deux réponses qui m'auront permis d'avancer sur mon projet.

Bonne journée
Ned2
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…