Enregistrer données cellules en fonction d'une liste déroulante

Bonjour,

Je souhaite rendre le plus interactif possible le planning ci-joint. Jusqu'à présent tout fonctionné comme sur des roulettes !

Je souhaitais que lorsque je passe d'un mois à l'autre ou d'une année à l'autre via mes 2 listes déroulantes, les données des cellules disparaissent pour la sélection précédente et apparaissent pour la sélection en cours...

J'ai comme l'impression qu'une formule VBA est inévitable 🙄 or je ne maitrise malheureusement pas et à mon plus grand désespoir ce sujet...

Pouvez-vous m'aider ? 🤔

Merci d'avance pour vos retours !

25planning.xlsm (111.25 Ko)

Bonjour,

J'ai un petit problème : de quelles données s'agit-il ? et où sont elles à l'ouverture du fichier ?

Je reste à ta disposition

Bonjour Jacky,

la plage de cellule est la suivante A6:G36

Exemple :

Pour le mois de janvier certaine cellule sont complétées, je souhaite que ces données disparaissent/s'enregistre lorsque je sélectionne un autre mois ou année et que les données des cellules du mois sélectionnés apparaissent.

J'espère avoir été assez clair :/

oui j'avais bien compris que la plage concernée est la plage "A6:G36", mais je voulais savoir :
1) où puis-je trouver ces données
2) et où faut-il les inscrire en fonction du mois choisi, c'est à dire quel est le critère qui me permet de les placer dans la plage du mois concerné ?
S'agit-il des "AP" et "DP" ? sinon quelles sont elles ?

Il n'y a pas de liste de données.

Les cellules de la plage B6:G36 seront complétées de façon aléatoire et manuellement en fonction de notre planning.

Bonjour,

pour visualiser la question de Jacky, voici un fichier :

Vous avez une feuille "remplie" de formule de recherche de données pour pouvoir afficher les données concernées pour chaque date.
Cette feuille n'est que consultative !

Vous avez une deuxième feuille qui regroupe les données par date, avec un début et une fin, que ce soit de congés, des voyage ou temps de chantier le principe est le même : une date de début, une date de fin et la période entre les deux qui est repérée.

La troisième feuille sert à gérer la présentation des mois et semaine jours fériés et ponts.

Donc plutôt que de copier/coller vos donner à chaque changement de date, l'idée ici est d'avoir une base de données de vos données, et en fonction du mois et de l'année demandée, ce sont les formules en zone A6G36 qui vont faire le rapatriement des informations en allant les chercher dans la base de données.

@ bientôt

LouReeD

Je suis désolé mais de ce fait je ne vois pas très bien comment faire
Restant toutefois à ton service, bonne journée

Le principe que vous voulez est :

- je change de mois
- scan des lignes du mois en cours
- mise en mémoire sur une feuille les données non vides en fonction de la date : Date; données : colonne B, colonne C, D, E F et G
- fin du scan du mois en cours
- effacer le planning actuel
- créer nouveau planning en colonne A avec les jour du mois sélectionné
- scanner la feuille mémoire pour trouver les différentes dates de ce mois
- copier les données des colonnes B à G à leur emplacement

A y regarder de plus près c'est ce que fait le fichier Piper, sauf que les données ne sont pas inscrites directement à leur emplacement sur le planning mais par l'intermédiaire d'un USF qui va alimenter la feuille mémoire. Ensuite ce sont des formules qui rapatries les données trouvées en fonction de l'année et du mois choisi.

Quoi qu'il en soit, comme le dit Jacky, il vous faut mettre en base de données vos données si vous voulez qu'Excel les retrouve soit par formules, soit par VBA.

@ bientôt

LouReeD

Si je vous montre la base de ce que je veux peut-être que ce sera plus clair :

Sub Masquer_Jour()
Dim Num_Col As Long
For Num_Col = 34 To 36 ' Boucle sur les cellules des jours 29, 30 et 31
If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then
Columns(Num_Col).Hidden = True
Else
Columns(Num_Col).Hidden = False
End If
Next
Range("A6:G26").ClearContents 'Supprime le contenu dans les cellules
End Sub

Une chose qui ne peut pas fonctionner dans ton bout de code

If Month(Cells(6, Num_Col)) >= Cells(1, 1) Then

Il n'y a rien dans la cellule Cells(1, 1) me semble-t-il, ou alors je n'ai pas le bon fichier

Ensuite tu veux cacher ou non les colonnes 34 à 36, pourquoi ? il n'y a rien non plus dans ces colonnes

Je crois que tu confonds lignes et colonnes

En regardant de plus près ton travail, il me semble qu'avec le bout de code que tu nous as présenté, tu veux simplement adapter la colonne "A" de façon à ce que n'apparaîssent que les jours existants dans le mois choisi, c'est à dire que pour février par exemple les lignes 34, 35 et 36 disparaissent, mais pas 34 en cas d'année bissextile

Ai je bien compris ?

Exactement !

Voici ce que j'ai tenté mais il doit y avoir une erreur

Sub Masquer_Jour()
Dim Num_ligne As Long
For Num_ligne = 34 To 36 ' Boucle sur les cellules des jours 29, 30 et 31
If Month(Cells(1, Num_ligne)) >= Cells(1, 34) Then
Rows(Num_ligne).Hidden = True
Else
Rows(Num_ligne).Hidden = False
End If
Next
Range("A6:G26").ClearContents 'Supprime le contenu dans les cellules
End Sub

Voici ce que ça donne avec ce code VBA :/

9planning.xlsm (54.80 Ko)

Attention dans la cellule Cells(1,34) il n'y a rien
C'est bien ce que je pensais tu confonds lignes et cellules, Cells(1, 34) équivaut à Range ("AH1")

Ton but est de retrouver le mois considéré et en particulier son numéro (exemple 6 pour juin), ce numéro tu le retrouveras dans la listbox située dans la cellule "A3" soit Cells(3, 1), donc tu dois comparer tes "Month(Cells(1, Num_ligne))" au contenu de Cells(3, 1). Ensuite ta comparaison dépendra de la valeur de cette cellule Cells(3, 1), la valeur obtenue avec Cells(3, 1) correspond-t-elle à un mois de 30 ou 31 jours ?

Mais attention avec le mois de février selon que l'année est ou n'est pas bissextile

Il y a encore un peu de travail

Effectivement, je me suis emmêlé les pinceaux... 😁

Sub Masquer_Jour()
Dim Num_ligne As Long
   For Num_ligne = 34 To 36     ' Boucle sur les cellules des jours 29, 30 et 31
      If Month(Cells(1, Num_ligne)) >= Cells(3, 1) Then
         Rows(Num_ligne).Hidden = True
      Else
         Rows(Num_ligne).Hidden = False
     End If
   Next
   Range("A6:G26").ClearContents  'Supprime le contenu dans les cellules
End Sub

Je ne comprend pas ta question "la valeur obtenue avec Cells(3, 1) correspond-t-elle à un mois de 30 ou 31 jours ?"

Car la valeur obtenue en A3 dépend du mois sélectionné, Janvier = 31j Février = 28

If Month(Cells(1, Num_ligne)) >= Cells(3, 1) 

dans cette ligne tu compares deux nombres
1) Month(Cells(1,Num_ligne)), Nul_ligne étant succesivement égal à 34, 35 et 36, mais Cells(1,34), Cells(1,35) et Cells(1,36) sont vides, je te répète que cells(x,y) signifie cellule ligne x et colonne y
2) Cells(3,1) qui est la cellule dans laquelle se trouve la listbox "mois", donc elle contient le numéro du mois, 1 pour janvier, 2 pour février, .... 12 pour décembre
Essaie de voir ceci en ajoutant dans ton code : MsgBox Cells(3,1)

Regardes ceci de plus près et reviens vers moi

Bonjour Elise.DCLQ, Jacky, LouReeD, le forum,

En sélectionnant soit un mois en A3 (liste déroulante) ou une année en A4 (liste déroulante aussi), le calendrier se met à jour.

Si j'ai bien compris votre demande, inscrivez vos données dans le calendrier, changez de mois ou d'année, celles ci s'effacent, revenez sur le mois initial, elles réapparaissent.

Également, effacement automatique des jours n'appartenant pas au mois sélectionné. (attention, pour Février, les valeurs dans la colonne P sont masquées - peut-être à déplacer...)

Le classeur :

Cordialement.

AL 22

C'était parfaitement ça !!!! merci beaucoup !!! je n'ai plus qu'à copier les codes :)

Vous êtes trop fort.....

Bonne journée à tous et merci pour votre aide :)

Bonjour,

ayant travaillé sur votre demande, je me permet de fournir mon fichier exemple, qui correspond au "logigramme" de mon précédent message :
- détection de changement de valeur mois ou année
- scanne des lignes de la page actuelle afin de les mettre en mémoire s'il y a des données et effacer les lignes de la mémoire s'il n'y a plus de données.
- effacement de la page, puis création de la colonne de date et mise en place des bordures
- scanne des lignes et recherche de la date dans le tableau de mémoire des données, si elle existe importation des données

Le fichier :

8planning.xlsm (25.69 Ko)

Le code :

Sub ChangementDePage() ' Changement de page
    Dim Cel As Range, I As Integer, J As Integer, MonTab As ListObject, lRow As ListRow, NbJour As Integer, LaDate As Date, LeMois As Integer
    ' on arrête la mise à jour de l'écran
    Application.ScreenUpdating = False
    ' on arrête la surveillance événementielle
    Application.EnableEvents = False
    ' on attribue à la variable MonTab le premier tableau de la feuille Feuil2
    Set MonTab = Sheets("Feuil2").ListObjects(1)
    ' on indentifie la date de la nouvelle page
    LaDate = "01 " & Range("A1") & " " & Range("A2")
    ' on récupère le numéro de ce mois
    LeMois = Month(LaDate)
    ' on scanne les lignes date et on enregistre les lignes qui contiennent des données
    For I = 6 To 36
        ' s'il y a une date
        If Feuil1.Cells(I, 1) <> "" Then
            ' la ligne contient des données
            If WorksheetFunction.CountA(Feuil1.Range("B" & I & ":G" & I)) > 0 Then
                ' on cherche la date correspondante dans le tableau MonTab
                Set Cel = MonTab.ListColumns("Date").DataBodyRange.Find(Feuil1.Cells(I, 1))
                ' si la date existe
                If Not Cel Is Nothing Then
                    ' on remplace les données des colonnes B à G
                    For J = 1 To 6
                        Cel.Offset(, J) = Feuil1.Cells(I, 1 + J)
                    Next J
                ' si la date n'existe pas
                Else
                    ' on crée une nouvelle ligne dans le tableau BDD
                    Set lRow = MonTab.ListRows.Add()
                    ' avec cette ligne
                    With lRow
                        ' on lui attribue en colonne 1 la date en cours de scan
                        .Range.Cells(1).Value = Feuil1.Cells(I, 1)
                        ' on crée une boucle de 1 à 6 pour remplir les 6 colonnes suivantes
                        For J = 1 To 6
                            .Range.Cells(J + 1) = Sheets("Feuil1").Cells(I, J + 1).Value
                        Next J
                    ' on a fini de jouer avec la ligne
                    End With
                End If
            ' la ligne ne contient pas de données
            Else
                ' on cherche la date correspondante dans le tableau BDD
                Set Cel = MonTab.ListColumns("Date").DataBodyRange.Find(Feuil1.Cells(I, 1))
                ' si la date existe
                If Not Cel Is Nothing Then
                    ' on efface la ligne car plus de données présente
                    Cel.EntireRow.Delete
                End If
            End If
        End If
    Next I

    ' une fois toutes les lignes scannées
    ' calcul du nombre de jour du mois choisi
    NbJour = Day(DateSerial(Feuil1.Range("A2"), LeMois + 1, 1) - 1)
    ' on efface les données de l;a zone du calendrier
    Feuil1.Range("A6:G36").ClearContents
    ' on efface les bordures
    Feuil1.Range("A6:G36").Borders.LineStyle = xlNone
    ' on crée le mois sélectionné
    For I = 1 To NbJour
        ' on inscrit chaque jour dans la colonne
        Cells(5 + I, 1) = CDate(DateSerial(Feuil1.Range("A2"), LeMois, I))
    Next I
    ' on met les bordures en place
    Range("A6:G" & NbJour + 5).Borders.Color = 0
    ' on scanne les lignes date
    For I = 6 To NbJour + 5
        ' on cherche la date correspondante dans le tableau BDD
        Set Cel = MonTab.ListColumns("Date").DataBodyRange.Find(Feuil1.Cells(I, 1))
        ' si la date existe
        If Not Cel Is Nothing Then
            ' on importe les données des colonnes B à G
            For J = 1 To 6
                Feuil1.Cells(I, 1 + J) = Cel.Offset(, J)
            Next J
        End If
    Next I
Fin:
    Application.EnableEvents = True
End Sub

Le code peut certainement être optimisé car j'ai quelque lacune dans l'utilisation des tableaux structurés par VBA...

@ bientôt

LouReeD

Rechercher des sujets similaires à "enregistrer donnees fonction liste deroulante"