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 !
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) ThenIl 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 :/
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 SubJe 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 :
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 SubLe code peut certainement être optimisé car j'ai quelque lacune dans l'utilisation des tableaux structurés par VBA...
@ bientôt
LouReeD