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 :

Générer une liste de dates à partir d'une date de début et d'une date de fin [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 53
    Points : 26
    Points
    26
    Par défaut Générer une liste de dates à partir d'une date de début et d'une date de fin
    Bonjour,

    Ma DAF vient de me faire un cadeau empoisonné pour le WE. Elle me demande de générer pour chaque passage dans une unité (caractérisée par une date d'entrée et une date de sortie) un calendrier des occupations. Pour faire court, en F2 j'ai le numero de mon unité en J2 ma date d'entrée, en K2 ma date de sortie. Je dois générer toute la liste des dates sur la même ligne entre la date d'entrée et de sortie. J'arrive aisément à le faire avec des formules mais comme il peut y avoir X lignes , et X jours entre la date d'entrée et la date de sortie...je pense qu'une macro serait plus à même de résoudre mon problème (boucle). Mais voilà, je n'y connais pas grand chose en langage VBA, aussi si quelq'un pouvait m'aider? Pour être plus clair , je vous ai fait une impression d'écran du fichier (surligné en jaune, ce que la macro devrait générer).

    Merci

    M75Dates.docx

  2. #2
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Voici un peu de lecture pour comprendre et apprendre VBA : http://bidou.developpez.com/article/VBA/
    Qu'as-tu fais pour l'instant ? Quel est ton problème ? As-tu une erreur ? Laquelle, où ?
    Qu'est-ce que tu ferais "à la main" ?
    Tu écris la première date sur la première cellule, ensuite tu vas à la cellule d'à côté et tu écris la date du jours suivant etc ... et tu fais cela tant que la date que tu écris est inférieure ou égale à la date de fin.
    Maintenant, il faut traduire ça en code.
    Essaie de voir avec le lien que je t'ai donné ce que tu peux faire et reviens vers nous si tu as encore besoin d'aide

  3. #3
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    Dans ton cas, je me passerai de VBA. Si tu maîtrisais, ok et encore.

    Dès que je peux faire sans VBA, moi j'achète l'idée.

    Voila les deux formules que je te propose de mettre.
    Dans la colonne M (pour reprendre ton impression ecran)
    Et bien sûr tu recopie vers le bas.
    Plus costaud, en N
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(SI(M2+1<=$K2;M2+1;"");"")
    Le principe de la formule est de dire regarde la date placée avant et fait + 1 jusqu'à arriver à la date de fin placée en colonne K.
    Cette formule, tu la recopies vers le bas et vers la droite, tu peux être large.

    En espérant que c'est bien ce que tu veux.
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 53
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Je voulais tout d'abord te remercier Jérôme pour la formule qui est au point virgule près ce que je voulais faire et crois bien que si ce fichier avait été destiné à mon seul usage , cette formule aurait fait mon bonheur, mais voilà, ce tableur est destiné à ma DAF qui doit charger un état ; cliquer sur un bouton et disposer du résultat dans la seconde qui suit, puis purger le fichier et recommencer la manœuvre toutes les semaines. Alors malheureusement, je pense que la macro est incontournable. J'ai réalisé une ébauche de macro sur le fichier ci joint justement avec cette formule mais l'inconvénient majeur c'est que ma macro s'arrête à la colonne Z et est déjà fort longue (1 paragraphe par colonne) et quand on sait qu'entre 2 dates il peut y avoir 363j ce type de script n'est tout simplement pas viable. Alors je sais qu'il faut qualifier des variables, coller un next à la fin pour réaliser une boucle mais mes compétences ne vont guère plus loin pour réaliser un script efficace qui tienne en une quinzaine de lignes. Si quelqu'un peut m'aider ...

    M75
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    Salut,

    j'avoue ne pas avoir regardé ton code. Je n'aime pas trop ouvrir les fichiers avec les macros ...

    Voici un code qui devrait faire ce que tu veux. j'ai commenté le tout pour que tu puisses comprendre ce que j'ai fait.

    Mais, je ne peux que t'inviter à suivre le conseil de Riaolle en allant sur ce site
    http://bidou.developpez.com/article/VBA/

    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
    Sub LesDates()
    'déclaration des variables
        Dim l As Integer 'variable pour gérer les lignes du tableau
        Dim c As Integer 'variable pour gérer les colonnes où vont s'ecrire les dates
        Dim debut As Date 'variable pour stocker la date de début de la ligne en cours de traitement
        Dim fin As Date  'variable pour stocker la date de fin de la ligne en cours de traitement
        Dim nouveau As Date 'variable pour stocker la nouvelle date à mettre dans les colonnes à coté
     
        'variable pour gérer les lignes. début du tableau en ligne 2
        l = 2
     
        'boucle pour aller jusqu'à la fin du tableau
        Do Until Cells(l, 10).Value = ""
            'on mémorise les dates de début et de fin
            debut = Cells(l, 10).Value
            fin = Cells(l, 11).Value
     
            'variable pour gérer la colonne à traiter pour nouvelle date à coté. 13 = col M
            c = 13
            'on défini la date à afficher dans la 1ere colonne
            nouveau = debut
            'boucle pour remplir la ligne avec les dates
            Do While nouveau <= fin
                'mise en plae de la date dasn la bonne lign et bonne colonne
                Cells(l, c).Value = nouveau
                'on ajoute 1 à la nouvelle date
                nouveau = nouveau + 1
                'on passe à la colonne suivante
                c = c + 1
            Loop
            'quand la ligne est remplie, on passe à la ligne suivante
            l = l + 1
        Loop
    End Sub
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    rien de plus simple

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ta date de depart en A1 =05/04/2017
    ta date de fin en B1=21/04/2017
     
    date1=cdate([A1].value)
    date2=cdate([b1].value)
    for i = date1 to date2 step 1
    [b1].offset(0,i)=format(date1+1,"dd/mm/yyyy")' le format que tu veux 
    next
    pour une colonne il suffit de remplacer A1 et B1 par cells(x,y ou z ) dans une boucle sur x(lignes) et y et z ( y et z étant la colonne A ou B )
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 53
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Un grand merci pour vos interventions. Jérôme, les commentaires de la macro que tu m'as envoyé sont limpides (F8 aidant...) et ce qui ne gache rien celle-ci fonctionne parfaitement. Je vais suivre tes conseils et ceux de Riaolle et me plonger dans la lecture de l'article VBA. Sinon, pour finir mon projet je dois encore compter le nombre de dates (occurences) pour une unité donnée sur l'onglet résultat, mais voila NB.SI ne marche que pour la 1ère unité (formule: =SI((Worksheet!F2:F152)=$A2;NB.SI(Worksheet!L2:Y152;B$1);""). Je vous fais parvenir une impression d'ecran de l'onglet source (Worksheet) et de l'onglet résultat.Dates résultat.docx

    Encore merci

  8. #8
    Expert confirmé Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Points : 4 299
    Points
    4 299
    Par défaut
    salut,

    Et oui parfois, je bosse, d'où mon absence sur le forum ce jour ...

    Si tu veux compter le nombre de fois où une date apparaît pour pour une UF (je ne sais pas ce que c'est mais c'est pas grave), c'est plutôt une formule de ce type qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NB.SI.ENS(Worksheet!L2:Y152;B$1;Worksheet!F2:F152;$A2)
    La fonction NB.SI.ENS est la grande soeur de la fonction NB.SI. Avec le NB.SI, tu peux compter en prenant en compte un seul et unique critère.
    Avec la NB.SI.ENS, tu peux avoir jusqu'à 255 critères pour déterminer ce que tu veux comptabiliser.

    Après, il faut juste vérifier la plage L2:Y152. par rapport à ton tableau (s'il na pas changé je prendrait plutôt P2:AA152

    En espérant avoir visé juste.
    Jérôme

    " Je pense donc je suis. Tu es donc j'apprends ". (GCM)

    Si ce message vous à aidé, merci de cliquer sur . Si ce message est résolu, cliquez sur .

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 53
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Je ne reproche rien à personne et surtout pas de travailler. Plus sérieusement j'avais envisagé la fonction NB.SI.ENS, mais du fait que mes 2 critères sont sur des plages de tailles différentes.... j'ai droit à #valeur.

  10. #10
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MesDates()
        DL& = Cells(Rows.Count, 10).End(xlUp).Row
        For i = 2 To DL
            If Cells(i, 10) > "" And Cells(i, 11) > "" Then
                cpt = CDbl(Cells(i, 11)) - CDbl(Cells(i, 10)): ReDim TabDate(1 To cpt + 1)
                For j = 1 To UBound(TabDate): TabDate(j) = CDate(CDbl(Cells(i, 10)) + j - 1): Next
                Cells(i, 12).Resize(, UBound(TabDate)) = TabDate
            Else
                Cells(i, 12).Value = "Stand by ENTREE/SORTIE"
            End If
        Next
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 53
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup,

    Grace à vous j'ai pu considérablement avancer dans mon projet.

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 18/06/2008, 19h01
  2. Réponses: 2
    Dernier message: 03/04/2008, 13h24
  3. Réponses: 7
    Dernier message: 28/03/2007, 12h16
  4. Réponses: 12
    Dernier message: 28/11/2006, 15h34
  5. Réponses: 4
    Dernier message: 14/10/2003, 08h58

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