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

VBA Access Discussion :

Fonction pour générer une date au dimanche à partir d'une semaine et une année


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Par défaut Fonction pour générer une date au dimanche à partir d'une semaine et une année
    Bonjour,

    Mon souci est le suivant : je travaille sur des variations de volumes d'une usine où les données me sont données avec des dates en semaine-année (par ex. 52-2013). J'ai besoin de convertir ces dates en dates jj/mm/aaaa pour pouvoir calculer des différences de dates (je prends ss-aaaa et je génère une date jj/mm/aaaa au lundi). Ensuite je reconvertis en semaine-année et j'obtiens un souci au moment du changement d'année (j'obtiens par ex semaine 53-2013 puis 2-2014, la semaine 1-2014 a disparu).

    C'est assez logique car le lundi que je génère va quasiment toujours se trouver lors de l'année précédente. Ainsi je cherche un moyen d'éviter cette semaine 53.

    j'ai trouvé sur le site grenier-Access cette fonction qui me permet de générer une date au lundi à partir d'un numéro de semaine et d'année.

    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
    Function convDate( _
      ByVal intAnnee As Long, _
      Optional ByVal intSemaine As Long = 1)
     
      Dim dt As Date
     
      ' Trouver le 1er jour de la semaine 1 de l'année
      ' (pas forcément le 1/1/aaaa en France !)
      dt = DateSerial(intAnnee, 1, 1)
      While DatePart("ww", dt, vbMonday, vbFirstFourDays) <> 1
        dt = dt + 1
      Wend
     
      ' Calculer le 1er jour de la semaine demandée
      dt = dt - DatePart("w", dt, vbMonday) + 1
      dt = dt + 7 * (intSemaine - 1)
     
      convDate = dt
    End Function
    J'aimerais à présent générer une date au dimanche : savez vous comment je peux le faire avec un minimum de modifications?
    Est-ce que l'option VbFirstFullWeek pour la semaine 1 peut-elle convenir (dans ce cas je garde mes dates au lundi)?

    Avez vous déjà rencontré ce "problème de semaine 53" et dans ce cas quelle est la meilleure solution?

    Je sais que ce n'est pas un sujet facile et je remercie grandement ceux qui prendront du temps pour me lire et me répondre.

    Merci beaucoup,

    Ostrich95

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Par défaut
    Comme ça à chaud, as-tu essayé tout simplement vbSunday à la place de vbMonday pour générer le premier dimanche de l'année?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Par défaut
    Je me suis renseigné et j'ai vu que la première semaine de l'année a forcément son jeudi dans la nouvelle année. Par ex en 2016, le 01/01 est un vendredi et donc ce n'est pas la première semaine car le jeudi est en 2015.

    Il faudrait donc que je génère la date au Jeudi. Comment dois-je modifier mon code pour cela?

    Merci d'avance,

    Ostrich95

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Par défaut
    Simple question, pour calculer la différence entre deux dates, pourquoi ne pas compter le nombre de jours au lieu du nombre de semaines?

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Par défaut
    Bonjour arthur57,

    par différence entre dates je veux plutot dire ceci:

    imaginons que je suis semaine 10-2014 et que j'ai besoin de la donnée de la semaine 10-2013.

    Je l'obtiens ainsi :

    dateadd("yyyy",-1,convdate(année,semaine))

    où convdate est la fonction que j'ai posté plus haut. Et ensuite je reconvertis en semaine et année avec format(,"ww" ou "yyyy").

    Et c'est lors de cette reconversion que j'obtiens des fois une semaine 53 qui me pose problème (car je n'ai aucune donnée correspondant à cette semaine).

    Aussi j'ai besoin de convdate pour comparer des dates dans les requêtes (par ex WHERE date < dateadd("yyyy",-1,convdate(année,semaine)) and date > dateadd("yyyy",-2,convdate(année,semaine))

    Vois-tu mon problème?

    Merci d'avance,

    ostrich95

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Par défaut
    Ce que tu cherche à obtenir, c'est bien une conversion entre semaines-années à jj/mm/aaaa ?
    Je comprends le problème, il y a 52,177457 semaines dans l'année.

    Mais lorsqu'une semaine commence disons fin 2014, et se termine début 2015, comment souhaites-tu gérer ceci? (Une demi-semaine en 2014, une autre en 2015 ?)

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Par défaut
    Arthur57,

    en essayant de coller au calendrier officiel (dans ce cas ce sera la semaine 1 car le jeudi est en 2015). Il faut donc que j'intègre le jeudi à la place du lundi dans la fonction mais il y a des choses à changer dans la fonction. Pour l'instant j'ai juste changé vbMonday en vbThursday mais ça n'a pas fonctionné.

    Ostrich95

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Par défaut
    Citation Envoyé par ostrich95 Voir le message
    calendrier officiel (dans ce cas ce sera la semaine 1 car le jeudi est en 2015). Il faut donc que j'intègre le jeudi à la place du lundi dans la fonction
    Il faudrait donc que tu remplace vbMonday par rapport au bon jour de l'année souhaitée?
    Comment comptes-tu gérer la "53ème semaine" ?

    Je ne saisis toujours pas la logique des semaines que tu souhaites appliquer.

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Par défaut
    en fait j'ai des données sous forme d'un classeur excel avec des semaines allant de 2011-52 à 2014-24 mais il n'y a jamais de semaine 53!

    Mon problème est que j'utilise convdate (la fonction) pour manipuler ces semaines et générer des dates (car il est plus facile d'ajouter 8 semaines à une date sous forme jj/mm/aaaa qu'à une date sous forme ss-aaaa).

    Ensuite quand j'ai fait l'opération sur la date je reconvertis en ss-aaaa et une semaine 53 apparaît (dans ce cas je n'ai plus de semaine 1 ensuite).

    Sauf que je n'ai strictement aucune donnée y correspondant et donc mes requêtes n'affichent plus rien.

    Je souhaite trouver une solution simple sur ma fonction convdate qui m'évitera ce problème (et donc affichera proprement 52-2013 puis 01-2014 par ex).

    Est-ce plus clair?

    Merci encore,

    ostrich95

Discussions similaires

  1. Trouver une date d'après un N° de semaine et une année
    Par lezinve dans le forum Général VBA
    Réponses: 2
    Dernier message: 26/02/2010, 12h38
  2. Réponses: 11
    Dernier message: 09/09/2009, 11h20
  3. Réponses: 11
    Dernier message: 05/12/2008, 16h10
  4. Réponses: 14
    Dernier message: 10/08/2006, 15h53

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