Bonjour tout le monde , tout d'abord je vous remercie pour ce forum pour résoudre différents problèmes confrontés lors de création des macros en Excel . je viens de m'inscrire aujourd'hui car je voulais comprendre beaucoup mieux ce programme pour trouver des solutions avec vos soutiens bien sûr à des questions sur les macros.
ma question d'aujourd'hui est la suivante:
je cherche à créer automatiquement un onglet à partir d'une première feuille et lui donner le nom avec la date du jour sous la forme jj-mm-aaaa.
le contenu de la feuille jj-mm-aaaa doit être sauvegardé et recopié dans la feuille jj+1-mm-aaaa.
ce travail est journalier !!
d'avance merci pour votre aide !
Hello papy je l'ai vu sur le GIF que t'as déjà envoyé avant et c'est ça que je me pose la question pourquoi ne m'a pas donné la même chose ??? je dois faire comment ? y a une macros ?
Re
Je viens de Lire et tu dis :
"je n'arrive pas à avoir le menu déroulant des lundis et quand j'ai changé la date au B2 ,D3 et D4 il affiche ce qui est en haut."
tu dis : "et quand j'ai changé la date au B2 ,D3 et D4"
Tu n'as pas a changer les dates , tu as Juste à sélectionner la semaine dans le Combobox.
les dates se mettent automatiquement .
Oui il y a des macros Lol
Tu Clicques droit sur le Nom de la feuille "BDD" et tu selectionnes : "Visualiser le Code" et tu verras "
VB:
Private Sub CBx_Semaines_Change()
With Worksheets("BDD")
' Année concernée
Anne_Select = Year(Date) ' Remplacez par l'année souhaitée
' Définir les dates
Premier_Jour_Annee = DateSerial(Anne_Select, 1, 1) ' Premier jour de l'année cible
Dernier_Jour_Annee = DateSerial(Anne_Select, 12, 31) ' Dernier jour de l'année cible
With .CBx_Semaines
Lundi_Semaine = .List(.ListIndex, 1) 'on récupére le Lundi de la semaine
Lundi_Semaine_Suivante = .List(.ListIndex, 2) 'on récupére le Lundi de la semaine suivante
Num_Semaine = .List(.ListIndex, 3) 'on récupére le Numéro de la semaine
End With
.Range("B2") = Date 'On colle la date du Jour
.Range("C3") = Premier_Jour_Annee 'On colle la date du premier jour de l'année
.Range("C4") = Dernier_Jour_Annee 'On colle la date du dernier jour de l'année
.Range("D3") = CDate(Lundi_Semaine) 'On colle la date du premier de la semaine concernée
.Range("D3").NumberFormat = "dddd dd mmmm yyyy" ' On formate la date
.Range("D4") = CDate(Lundi_Semaine_Suivante)
.Range("D4").NumberFormat = "dddd dd mmmm yyyy" ' On formate la date
.Range("I4") = "Semaine - " & Format(Num_Semaine, "00") ' On colle et on formate le Numéro de la semaine
.Range("B2").Select
End With
'*********************************************************
Filtrage Lundi_Semaine, Lundi_Semaine_Suivante 'On passe les deux dates en argument de la Procédure
'*********************************************************
End Sub
Ensuite de cette procédure qui traite la selection d'une ligne dans le Combobox "CBx_Semaines" Tu peux accéder au Code de la procédure "Filtrage" il te faut cliquer droit sur le Nom de cette Procédure puis de choisir "Définition" tu aura ainsi le Code de cette Procédure soit qui se trouve dans le Module nommé "Mdl_Filtrage" :
Code:
Option Explicit
Public Function Filtrage(Lundi_Semaine As Date, Lundi_Semaine_Suivante As Date) As Boolean
Dim LigneFiltre As Range
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
' Définir la feuille et la plage des données dynamiquement
Set Ws_Cible = Worksheets("BDD")
With Ws_Cible
Set PlageFiltre = .Range("B6:N" & .Cells(.Rows.Count, "B").End(xlUp).Row) ' Trouve la dernière ligne automatiquement
' Désactiver les filtres existants
If .AutoFilterMode Then .AutoFilterMode = False
' Appliquer le filtre
With PlageFiltre
.AutoFilter Field:=1, _
Criteria1:=">=" & Format(Lundi_Semaine, "mm/dd/yyyy"), _
Operator:=xlAnd, _
Criteria2:="<=" & Format(Lundi_Semaine_Suivante, "mm/dd/yyyy")
End With
' Vérifier si des lignes sont visibles après filtrage
If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
Filtrage = True
Else
MsgBox "Aucune ligne ne correspond aux critères de filtre.", vbInformation
Filtrage = False
End If
End With
Application.ScreenUpdating = True
Exit Function
ErrorHandler:
' Gestion des erreurs
MsgBox "Erreur : " & Err.Description, vbExclamation
Filtrage = False
End Function
Tu as aussi du Code dans le Module "Mdl_AlimenterComboBoxSemaines"
Code:
Option Explicit
Public x As Byte
Public Indx As Byte
Public Ws_Cible As Worksheet
Public CBx As Object
Public PlageFiltre As Range
Public Anne_Select As Integer
Public Premier_Jour_Annee As Date
Public Dernier_Jour_Annee As Date
Public Lundi_Semaine As Date
Public Lundi_Semaine_Suivante As Date
Public Num_Semaine As Byte
Public Detail_Semaine As String
Public Premier_Lundi As Date
Public Semaine_Actuelle As Byte
Public Str_Semaine$
Sub AlimenterComboBoxSemaines(Anne_Select As Integer)
' Référence à la feuille contenant le ComboBox
Set Ws_Cible = ThisWorkbook.Worksheets("BDD")
x = 0
' Référence au ComboBox sur la feuille
Set CBx = Ws_Cible.OLEObjects("CBx_Semaines ").Object ' Assurez-vous que le nom est correct
'Semaine actuelle
Semaine_Actuelle = WorksheetFunction.IsoWeekNum(Date) ' Numéro de semaine ISO
' Définir les dates
Premier_Jour_Annee = DateSerial(Anne_Select, 1, 1) ' Premier jour de l'année cible
Dernier_Jour_Annee = DateSerial(Anne_Select, 12, 31) ' Dernier jour de l'année cible
' Trouver le premier lundi de l'année
Premier_Lundi = Premier_Jour_Annee - Weekday(Premier_Jour_Annee, vbMonday) + 1 ' Trouver le premier lundi de janvier
' Inclure la semaine 52 de l'année précédente si elle contient les 1er et 2 janvier
If Weekday(Premier_Jour_Annee, vbMonday) <> 1 Then
' La semaine 52 de l'année précédente commence le lundi 25 décembre 2023
Lundi_Semaine = DateSerial(Anne_Select - 1, 12, 25) ' Dernier lundi de l'année précédente
Else
' Si la semaine 1 commence normalement
Lundi_Semaine = Premier_Lundi
End If
With CBx
' Nettoyer le contenu existant du ComboBox
.Clear
' Définir le nombre de colonnes du ComboBox
.ColumnCount = 4 ' On définit le Nombre de Colonnes
.ColumnWidths = "1;0;0;0" ' On définit la largeur des colonnes (1 visible)
.ListRows = 10 'On définit le Nombre de Lignes affichées
End With
' Parcourir les semaines et remplir le ComboBox
Do While Lundi_Semaine <= Dernier_Jour_Annee
Num_Semaine = WorksheetFunction.IsoWeekNum(Lundi_Semaine) ' Numéro de semaine ISO
If Num_Semaine = Semaine_Actuelle And Year(Lundi_Semaine) = Year(Date) Then
Indx = x
Str_Semaine = "S-[" & Num_Semaine & "]" 'on formate l'affichage de la semaine si semaine en cours
Else
Str_Semaine = "S-" & Format(Num_Semaine, "00") 'on formate l'affichage de la semaine si semaine autre
End If
Detail_Semaine = Application.Proper(Trim(Format(Lundi_Semaine, "dddd dd mmmm yyyy")) & " au " & _
Trim(Format(Lundi_Semaine + 6, "dddd dd mmmm yyyy")) & _
" " & Str_Semaine) 'On définit le texte à afficher dans la première colonne du Combobox des Semaines
' Ajouter les informations dans le ComboBox
With CBx 'Avec La Combobox des Seamines
.AddItem Detail_Semaine 'On colle le Texte des Limites de chaque semaines
.List(.ListCount - 1, 1) = CDate(Lundi_Semaine) ' On colle le le Lundi de la semaine
.List(.ListCount - 1, 2) = CDate(Lundi_Semaine + 7) ' On colle le Lundi de la semaine suivante
.List(.ListCount - 1, 3) = Num_Semaine 'On colle le numéro de la semaine considérée
x = .ListCount 'on récupére l'index de la semaine qui est ajoutée
End With
Lundi_Semaine = Lundi_Semaine + 7 ' On Passe au Lundi de la semaine suivante
Loop
CBx.ListIndex = Indx 'on affiche la semaine en fonction de l'Index définit 0 ou semaine en Cours
End Sub
j'y ai mis des commentaires à presque chaque Ligne .
tu vois et tu n'hésite pas !
Jean marie
Comme je l'ai dit, en B2 tu as la date d'aujourd'hui, qui est ensuite utilisée pour calculer la date du premier jour de la semaine contenant la date inscrite en B2.
Donc tu peux mettre n'importe quelle date en B2, tu auras toujours l'affichage de 8 jours commençant le lundi.
je reviens vers toi pour la modification que tu as faite à partir du fichier de notre camarade TooFatBoy est très intéressante dans le sens où tu affiche juste la feuille de la semaine en cours.
je suis nul !! j'aimerai bien que tu m'explique comment faire ce fichier stp ! ta macros si t'en as une et/ou les quelques fonctions que tu as utilisées !! et c'est pour cela que j'ai demandé si possible de se donner RDV sur teams ou par téléphone ou me faire une vidéo explicative pour pouvoir comprendre ce que tu as fait et pouvoir le refaire de moi même !! excuse moi je suis très " soif " pour apprendre!!!.
tu m'as fait rire quand tu m'as dit " j'ai simplement ...." deriere ton fichier il y a beaucoup de travail !!!! l'entête qui est figée ? comment tu as mis en grand " du lundi ..........au ......." tout ça j'aimerai bien comprendre ....
coucou TooFatBoy ! j'ai réussi à enregistré ton fichier en fin avec macros ! chapeau camarade mille merciiiiiiiiiiiiiiiiiiiiiiii il est en essai pour pouvoir comprendre toutes les fonctions et les macros petit à petit avec la version de jean marie !! franchement vous êtes pros j'aurai certainement des questions pour vous au fur et à mesure ! mille merciiiiiiiiiiiiiiiiiii
Re
Je viens de Lire et tu dis :
"je n'arrive pas à avoir le menu déroulant des lundis et quand j'ai changé la date au B2 ,D3 et D4 il affiche ce qui est en haut."
tu dis : "et quand j'ai changé la date au B2 ,D3 et D4"
Tu n'as pas a changer les dates , tu as Juste à sélectionner la semaine dans le Combobox.
les dates se mettent automatiquement .
Oui il y a des macros Lol
Tu Clicques droit sur le Nom de la feuille "BDD" et tu selectionnes : "Visualiser le Code" et tu verras "
VB:
Private Sub CBx_Semaines_Change()
With Worksheets("BDD")
' Année concernée
Anne_Select = Year(Date) ' Remplacez par l'année souhaitée
' Définir les dates
Premier_Jour_Annee = DateSerial(Anne_Select, 1, 1) ' Premier jour de l'année cible
Dernier_Jour_Annee = DateSerial(Anne_Select, 12, 31) ' Dernier jour de l'année cible
With .CBx_Semaines
Lundi_Semaine = .List(.ListIndex, 1) 'on récupére le Lundi de la semaine
Lundi_Semaine_Suivante = .List(.ListIndex, 2) 'on récupére le Lundi de la semaine suivante
Num_Semaine = .List(.ListIndex, 3) 'on récupére le Numéro de la semaine
End With
.Range("B2") = Date 'On colle la date du Jour
.Range("C3") = Premier_Jour_Annee 'On colle la date du premier jour de l'année
.Range("C4") = Dernier_Jour_Annee 'On colle la date du dernier jour de l'année
.Range("D3") = CDate(Lundi_Semaine) 'On colle la date du premier de la semaine concernée
.Range("D3").NumberFormat = "dddd dd mmmm yyyy" ' On formate la date
.Range("D4") = CDate(Lundi_Semaine_Suivante)
.Range("D4").NumberFormat = "dddd dd mmmm yyyy" ' On formate la date
.Range("I4") = "Semaine - " & Format(Num_Semaine, "00") ' On colle et on formate le Numéro de la semaine
.Range("B2").Select
End With
'*********************************************************
Filtrage Lundi_Semaine, Lundi_Semaine_Suivante 'On passe les deux dates en argument de la Procédure
'*********************************************************
End Sub
Ensuite de cette procédure qui traite la selection d'une ligne dans le Combobox "CBx_Semaines" Tu peux accéder au Code de la procédure "Filtrage" il te faut cliquer droit sur le Nom de cette Procédure puis de choisir "Définition" tu aura ainsi le Code de cette Procédure soit qui se trouve dans le Module nommé "Mdl_Filtrage" :
Code:
Option Explicit
Public Function Filtrage(Lundi_Semaine As Date, Lundi_Semaine_Suivante As Date) As Boolean
Dim LigneFiltre As Range
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
' Définir la feuille et la plage des données dynamiquement
Set Ws_Cible = Worksheets("BDD")
With Ws_Cible
Set PlageFiltre = .Range("B6:N" & .Cells(.Rows.Count, "B").End(xlUp).Row) ' Trouve la dernière ligne automatiquement
' Désactiver les filtres existants
If .AutoFilterMode Then .AutoFilterMode = False
' Appliquer le filtre
With PlageFiltre
.AutoFilter Field:=1, _
Criteria1:=">=" & Format(Lundi_Semaine, "mm/dd/yyyy"), _
Operator:=xlAnd, _
Criteria2:="<=" & Format(Lundi_Semaine_Suivante, "mm/dd/yyyy")
End With
' Vérifier si des lignes sont visibles après filtrage
If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
Filtrage = True
Else
MsgBox "Aucune ligne ne correspond aux critères de filtre.", vbInformation
Filtrage = False
End If
End With
Application.ScreenUpdating = True
Exit Function
ErrorHandler:
' Gestion des erreurs
MsgBox "Erreur : " & Err.Description, vbExclamation
Filtrage = False
End Function
Tu as aussi du Code dans le Module "Mdl_AlimenterComboBoxSemaines"
Code:
Option Explicit
Public x As Byte
Public Indx As Byte
Public Ws_Cible As Worksheet
Public CBx As Object
Public PlageFiltre As Range
Public Anne_Select As Integer
Public Premier_Jour_Annee As Date
Public Dernier_Jour_Annee As Date
Public Lundi_Semaine As Date
Public Lundi_Semaine_Suivante As Date
Public Num_Semaine As Byte
Public Detail_Semaine As String
Public Premier_Lundi As Date
Public Semaine_Actuelle As Byte
Public Str_Semaine$
Sub AlimenterComboBoxSemaines(Anne_Select As Integer)
' Référence à la feuille contenant le ComboBox
Set Ws_Cible = ThisWorkbook.Worksheets("BDD")
x = 0
' Référence au ComboBox sur la feuille
Set CBx = Ws_Cible.OLEObjects("CBx_Semaines ").Object ' Assurez-vous que le nom est correct
'Semaine actuelle
Semaine_Actuelle = WorksheetFunction.IsoWeekNum(Date) ' Numéro de semaine ISO
' Définir les dates
Premier_Jour_Annee = DateSerial(Anne_Select, 1, 1) ' Premier jour de l'année cible
Dernier_Jour_Annee = DateSerial(Anne_Select, 12, 31) ' Dernier jour de l'année cible
' Trouver le premier lundi de l'année
Premier_Lundi = Premier_Jour_Annee - Weekday(Premier_Jour_Annee, vbMonday) + 1 ' Trouver le premier lundi de janvier
' Inclure la semaine 52 de l'année précédente si elle contient les 1er et 2 janvier
If Weekday(Premier_Jour_Annee, vbMonday) <> 1 Then
' La semaine 52 de l'année précédente commence le lundi 25 décembre 2023
Lundi_Semaine = DateSerial(Anne_Select - 1, 12, 25) ' Dernier lundi de l'année précédente
Else
' Si la semaine 1 commence normalement
Lundi_Semaine = Premier_Lundi
End If
With CBx
' Nettoyer le contenu existant du ComboBox
.Clear
' Définir le nombre de colonnes du ComboBox
.ColumnCount = 4 ' On définit le Nombre de Colonnes
.ColumnWidths = "1;0;0;0" ' On définit la largeur des colonnes (1 visible)
.ListRows = 10 'On définit le Nombre de Lignes affichées
End With
' Parcourir les semaines et remplir le ComboBox
Do While Lundi_Semaine <= Dernier_Jour_Annee
Num_Semaine = WorksheetFunction.IsoWeekNum(Lundi_Semaine) ' Numéro de semaine ISO
If Num_Semaine = Semaine_Actuelle And Year(Lundi_Semaine) = Year(Date) Then
Indx = x
Str_Semaine = "S-[" & Num_Semaine & "]" 'on formate l'affichage de la semaine si semaine en cours
Else
Str_Semaine = "S-" & Format(Num_Semaine, "00") 'on formate l'affichage de la semaine si semaine autre
End If
Detail_Semaine = Application.Proper(Trim(Format(Lundi_Semaine, "dddd dd mmmm yyyy")) & " au " & _
Trim(Format(Lundi_Semaine + 6, "dddd dd mmmm yyyy")) & _
" " & Str_Semaine) 'On définit le texte à afficher dans la première colonne du Combobox des Semaines
' Ajouter les informations dans le ComboBox
With CBx 'Avec La Combobox des Seamines
.AddItem Detail_Semaine 'On colle le Texte des Limites de chaque semaines
.List(.ListCount - 1, 1) = CDate(Lundi_Semaine) ' On colle le le Lundi de la semaine
.List(.ListCount - 1, 2) = CDate(Lundi_Semaine + 7) ' On colle le Lundi de la semaine suivante
.List(.ListCount - 1, 3) = Num_Semaine 'On colle le numéro de la semaine considérée
x = .ListCount 'on récupére l'index de la semaine qui est ajoutée
End With
Lundi_Semaine = Lundi_Semaine + 7 ' On Passe au Lundi de la semaine suivante
Loop
CBx.ListIndex = Indx 'on affiche la semaine en fonction de l'Index définit 0 ou semaine en Cours
End Sub
j'y ai mis des commentaires à presque chaque Ligne .
tu vois et tu n'hésite pas !
Jean marie
hello jean marie ! mille merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
en fin j'ai réussi à mettre en route ton fichier !! il est en essai et il est très bien fait chapeau !!!
je suis entrain de comprendre le programme avec les commentaires que tu as mis sur les macros.
pour le menu déroulant avec les les lundis des semaines = il va changer automatiquement pour 2025 avec la date du système ??
Bonsoir Le Fil
Oui car il y a cette procédure dans le Thisworkbook du Classeur !
VB:
Private Sub Workbook_Open()
Application.ScreenUpdating = False
AlimenterComboBoxSemaines Year(Date) 'On passe l'année de la date du jour en Argument de la procédure
End Sub
Donc c'est a partir de la date du Jour que le Combobox des semaines est mis a jour .
n'hésite pas si besoin!
bonne fin de Soirée
Jean marie
coucou TooFatBoy ! j'ai réussi à enregistré ton fichier en fin avec macros ! chapeau camarade mille merciiiiiiiiiiiiiiiiiiiiiiii il est en essai pour pouvoir comprendre toutes les fonctions et les macros petit à petit avec la version de jean marie !! franchement vous êtes pros j'aurai certainement des questions pour vous au fur et à mesure ! mille merciiiiiiiiiiiiiiiiiii
Il ne comporte qu'une seule macro dont le code est :
VB:
Sub Filtrage()
'
Sheets("BDD").Range("$B$6:$N$1470").AutoFilter Field:=1, _
Criteria1:=">=" & Range("D3").Value2, _
Operator:=xlAnd, _
Criteria2:="<=" & Range("D4").Value2
End Sub
Tu vois qu'elle est super simple, puisqu'elle se contente d'utiliser le filtre du tableau contenant toute l'année.
Comme tu le vois, le filtrage se fait entre la date inscrite en D3 et la date inscrite en D4.
C'est tout.
Donc soit tu inscrits manuellement les dates de début et de fin en D3 et D4, soit tu y mets des formules qui calculeront les dates de début et de fin de la période à afficher.
Ca te permet d'afficher le nombre de jours que tu veux (un jour, une semaine, deux semaines, un mois, un trimestre, etc.).
Tu n'as donc besoin de rien de plus que cette toute petite macro.
Bonsoir Le Fil
Oui car il y a cette procédure dans le Thisworkbook du Classeur !
VB:
Private Sub Workbook_Open()
Application.ScreenUpdating = False
AlimenterComboBoxSemaines Year(Date) 'On passe l'année de la date du jour en Argument de la procédure
End Sub
Donc c'est a partir de la date du Jour que le Combobox des semaines est mis a jour .
n'hésite pas si besoin!
bonne fin de Soirée
Jean marie
Il ne comporte qu'une seule macro dont le code est :
VB:
Sub Filtrage()
'
Sheets("BDD").Range("$B$6:$N$1470").AutoFilter Field:=1, _
Criteria1:=">=" & Range("D3").Value2, _
Operator:=xlAnd, _
Criteria2:="<=" & Range("D4").Value2
End Sub
Tu vois qu'elle est super simple, puisqu'elle se contente d'utiliser le filtre du tableau contenant toute l'année.
Comme tu le vois, le filtrage se fait entre la date inscrite en D3 et la date inscrite en D4.
C'est tout.
Donc soit tu inscrits manuellement les dates de début et de fin en D3 et D4, soit tu y mets des formules qui calculeront les dates de début et de fin de la période à afficher.
Ca te permet d'afficher le nombre de jours que tu veux (un jour, une semaine, deux semaines, un mois, un trimestre, etc.).
Tu n'as donc besoin de rien de plus que cette toute petite macro.
Bonjour le Fil
Un fichier perfectible , car il n'est pas évident de travailler avec des ActiveX Lol
j'ai ajouté la possibilité de Chercher une Journée .
Tu regardes et tu mes dis .Si besoin de Plus de commentaires !
n'hésite pas .
Jean marie
Bonjour le Fil
Un fichier perfectible , car il n'est pas évident de travailler avec des ActiveX Lol
j'ai ajouté la possibilité de Chercher une Journée .
Tu regardes et tu mes dis .Si besoin de Plus de commentaires !
n'hésite pas .
Jean marie