IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème filtre automatique [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut Problème filtre automatique
    Bonjour à tous,

    Nouveau sur le forum j'ai terriblement besoin de votre aide pour résoudre un problème lié à la fonction autofilter pour la création d'un planning automatique pour les formations dans mon entreprise.
    Je dois réaliser une macro qui :
    -crée un autre onglet avec la date du jour
    -prend en compte seulement les lignes avec des "x" suivant la date du jour.

    Sur la page qui sera créer ne doit figurer seulement le nom, prénom et service des individus disposant d'une formation à la date du jour.

    J'ai commancer à rédiger les lignes de codes : pour la première partie, j'ai réussi à créer un autre onglet avec comme nom la date du jour. Pour la seconde je n'y arrive pas.

    J'ai utilisé la fonction Autofilter sans grande réussite car les dates de l'année figure dans une plage de colonne or cette fonction ne prend en compte qu'une seule colonne pour la réalisation d'un filtre : Comment faire si vous plait?

    Pour mieux comprendre vous trouverez ci-joint mon fichier excel et ci-dessous les lignes de codes déja écrites:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub planning()
     
    Sheets("PLANNING").Select
        NbFeuilles = Sheets.Count 'Compte le nombre de feuilles du fichier actif
        Sheets("PLANNING").Copy Before:=Sheets(NbFeuilles)
        Sheets("PLANNING (2)").Select
        ActiveSheet.Name = Format(Date, "dd-mm-yyyy")
        ActiveSheet.Unprotect
        Application.EnableEvents = False ' => désactive les événements
     
         If Err.Number = 1004 Then ' Renseigne l'utilisateur. Puis efface l'objet
        MsgBox "Erreur une feuille du même nom pour la même semaine existe déja"
    End If
     
    Selection.AutoFilter Field:=4:304, Criteria1:=Format(Date, "dd-mm-yyyy"), Criteria2:="x"
    VBA Planning.xlsx

    Merci encore pour vos réponses.

    Bonne journée.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Sub Planning()
    Dim Dte As String, Msg As String
    Dim Plage As Range, c As Range
    Dim Sh As Worksheet
    Dim LastLig As Long
    Dim Col As Integer
     
    Application.ScreenUpdating = False
    Dte = Format(Date, "dd-mm-yyyy")
    If Existe(Dte) Then
        Set Sh = ThisWorkbook.Worksheets(Dte)
        Sh.UsedRange.Clear
    End If
     
    With Worksheets("PLANNING")
        .AutoFilterMode = False
        Set c = .Range("D3:BP3").Find(Date, LookIn:=xlFormulas, lookat:=xlWhole)
        If Not c Is Nothing Then
            Col = c.Column
            Set c = Nothing
            LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
            Set Plage = .Range(.Cells(3, 1), .Cells(LastLig, Col))
            Plage.AutoFilter Field:=Col, Criteria1:="<>"
            If Plage.Columns(Col).SpecialCells(xlCellTypeVisible).Count > 1 Then
                Dte = Format(Date, "dd-mm-yyyy")
                If Sh Is Nothing Then
                    Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))
                    Sh.Name = Dte
                End If
                .Range("A3:C" & LastLig).SpecialCells(xlCellTypeVisible).Copy Sh.Range("A1")
            Else
                Msg = "Aucune formation programmée aujourd'hui"
            End If
            Set Plage = Nothing
        Else
            Msg = "La date d'aujourd'hui inexistante sur la planning"
        End If
        .AutoFilterMode = False
    End With
    Set Sh = Nothing
    If Msg = "" Then Msg = "Création feuille terminée"
    MsgBox Msg
    End Sub
     
    Function Existe(ByVal ShName As String) As Boolean
    Dim Sh As Worksheet
     
    For Each Sh In ThisWorkbook.Sheets
        If Sh.Name = ShName Then
            Existe = True
            Exit For
        End If
    Next Sh
    End Function

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Merci Énormément, cela fonctionne parfaitement.

    Très bonne soirée et merci encore mercatog.

    Bonjour Mercatoc,

    Je reviens vers vous pour savoir si il était possible de rajouter des lignes et des colonnes dans les nouveaux onglets qui seront crées. Je souhaiterai effectuer cette opération afin d'améliorer la mise en page du planning de la journée.

    Merci de votre réponse,

    Bonne journée.

    Cordialement

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ajoute une procédure de mise en page avec comme paramètre la feuille de calcul qu'on appelle à partir de notre procédure principale.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub Planning()
    Dim Dte As String, Msg As String
    Dim Plage As Range, c As Range
    Dim Sh As Worksheet
    Dim LastLig As Long
    Dim Col As Integer
     
    Application.ScreenUpdating = False
    Dte = Format(Date, "dd-mm-yyyy")
    If Existe(Dte) Then
        Set Sh = ThisWorkbook.Worksheets(Dte)
        Sh.UsedRange.Clear
    End If
     
    With Worksheets("PLANNING")
        .AutoFilterMode = False
        Set c = .Range("D3:BP3").Find(Date, LookIn:=xlFormulas, lookat:=xlWhole)
        If Not c Is Nothing Then
            Col = c.Column
            Set c = Nothing
            LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
            Set Plage = .Range(.Cells(3, 1), .Cells(LastLig, Col))
            Plage.AutoFilter Field:=Col, Criteria1:="<>"
            If Plage.Columns(Col).SpecialCells(xlCellTypeVisible).Count > 1 Then
                Dte = Format(Date, "dd-mm-yyyy")
                If Sh Is Nothing Then
                    Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))
                    Sh.Name = Dte
                End If
                .Range("A3:C" & LastLig).SpecialCells(xlCellTypeVisible).Copy Sh.Range("A1")
                'Ici appel macro mise en page
                Call MiseEnPage(Sh)
            Else
                Msg = "Aucune formation programmée aujourd'hui"
            End If
            Set Plage = Nothing
        Else
            Msg = "La date d'aujourd'hui inexistante sur la planning"
        End If
        .AutoFilterMode = False
    End With
    Set Sh = Nothing
    If Msg = "" Then Msg = "Création feuille terminée"
    MsgBox Msg
    End Sub
     
    Private Function Existe(ByVal ShName As String) As Boolean
    Dim Sh As Worksheet
     
    For Each Sh In ThisWorkbook.Sheets
        If Sh.Name = ShName Then
            Existe = True
            Exit For
        End If
    Next Sh
    End Function
     
    'Par exemple
    Private Sub MiseEnPage(ByVal Ws As Worksheet)
     
    With Ws
        .Rows(2).Insert
        .Range("D1:E1") = Array("Lieu", "Observations")
        With .Range("A1:E1")
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
            .Interior.ColorIndex = 16
        End With
        .UsedRange.Borders.LineStyle = xlContinuous
    End With
    End Sub

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Merci infiniment,

    Sa marche impeccable.

    Par hasard, serais-tu comment inserer une ligne au milieu d'un tableau car j'ai fait pas mal de recherche sur google et j'ai rien trouvé.

    Merci pour tout

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Que veux tu dire avec insérer une ligne en milieu.
    Que signifie milieu?

    Pour insérer une ligne avant la ligne 10 de la feuille Feuil1, tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Rows(10).Insert
    Reste à savoir pour ton cas, le n° de la ligne correspondant à ton milieu décrit ton ton post.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Le tableau créer lors de ma macro sera long, ce que je souhaite c'est diviser ce tableau en deux (au milieu) en insérant une ligne pour répartir les formations le matin et les autres l'après midi.

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je ne sais si j'ai bien compris mais essaies ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub MiseEnPage(ByVal Ws As Worksheet)
    Dim LastLig As Long, Lig As Long
     
    With Ws
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        Lig = Int(LastLig / 2) + 1
        .Rows(Lig).Insert
    End With
    End Sub

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Parfait, c'est exactement cela. Par contre comment fais tu pour fusionner les cellules de la ligne créer car elle peut ce situer n'importe ou, tu ne peux pas mettre Range("")


    Merci pour tout.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bonjour Mercatog

    Aurais tu une réponse à la question d'hier car j'essaye depuis sans grande réussite,

    J'ai essayé la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range("A:A").SpecialCells(xlCellTypeBlanks).Select
    .MergeCells=true
    Le résultat n'est pas très convaincant.

    Merci encore pour ton aide.

  11. #11
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub MiseEnPage(ByVal Ws As Worksheet)
    Dim LastLig As Long, Lig As Long
     
    With Ws
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        Lig = Int(LastLig / 2) + 1
        .Rows(Lig).Insert
        .Range("A" & Lig & ":E" & Lig).Merge
    End With
    End Sub

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Merci,

    Je te sollicite une dernière si tu le veux bien,

    J'aimerai juste rajouter des lignes de code pour interdire l'exécution de la macro si la feuille du jour à déja été crée avec un messbox.
    Pour conclure l'utilisateur peut cliquer une seule fois sur la macro.Merci

    Cordialement

  13. #13
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Il faudrait absolument que tu parvienne à comprendre le code, sinon tu ne t'en sortiras pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub Planning()
    Dim Dte As String, Msg As String
    Dim Plage As Range, c As Range
    Dim Sh As Worksheet
    Dim LastLig As Long
    Dim Col As Integer
     
    Application.ScreenUpdating = False
    Dte = Format(Date, "dd-mm-yyyy")
    If Not Existe(Dte) Then
        Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))
        Sh.Name = Dte
        With Worksheets("PLANNING")
            .AutoFilterMode = False
            Set c = .Range("D3:BP3").Find(Date, LookIn:=xlFormulas, lookat:=xlWhole)
            If Not c Is Nothing Then
                Col = c.Column
                Set c = Nothing
                LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
                Set Plage = .Range(.Cells(3, 1), .Cells(LastLig, Col))
                Plage.AutoFilter Field:=Col, Criteria1:="<>"
                If Plage.Columns(Col).SpecialCells(xlCellTypeVisible).Count > 1 Then
                    Dte = Format(Date, "dd-mm-yyyy")
                    .Range("A3:C" & LastLig).SpecialCells(xlCellTypeVisible).Copy Sh.Range("A1")
                    'Ici appel macro mise en page
                    Call MiseEnPage(Sh)
                Else
                    Msg = "Aucune formation programmée le " & Dte
                End If
                Set Plage = Nothing
            Else
                Msg = "La date d'aujourd'hui inexistante sur la planning"
            End If
            .AutoFilterMode = False
        End With
        Set Sh = Nothing
    Else
        Msg = "Feuille du " & Dte & " a été déjà créée"
    End If
    If Msg = "" Then Msg = "Création de la feuille du " & Dte & " terminée"
    MsgBox Msg
    End Sub

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Merci Mercatog

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Macro filtre automatique données multiples dans une cellule +Problème si cellule vide
    Par jocky34000 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/04/2012, 06h36
  2. [Toutes versions] [EXCEL] Problèmes de chargements -> Filtre automatique
    Par azertyqwerty001 dans le forum Excel
    Réponses: 2
    Dernier message: 29/04/2009, 15h53
  3. problème de filtre automatique
    Par cladsam dans le forum Excel
    Réponses: 2
    Dernier message: 15/12/2007, 13h11
  4. problème macro et filtre automatique par une variable texte
    Par Drozo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/08/2007, 10h05
  5. [VBA-E] Problème Filtre automatique
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/05/2007, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo