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

Excel Discussion :

Fonction liste de numéros de semaine ISO pour une plage de dates


Sujet :

Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Fonction liste de numéros de semaine ISO pour une plage de dates
    Bonjour,

    je reviens vers vous aujourd'hui car j'ai un petit soucis avec un SOMMEPROD utilisant une fonction perso.

    J'ai récupéré sur le web, merci les contributeurs, une fonction pour trouver le numéro de semaine ISO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function NumSemISO(ByVal d As Date)
    Dim wd As Long
    wd = Weekday(d, vbMonday)
    NumSemISO = Int((d - DateSerial(Year(d - wd + 4), 1, 1) - wd + 11) / 7)
    End Function
    Cela fonctionne très bien. Mais je devais utiliser cela sur toute une plage de dates pour intégrer dans le SOMMEPROD. J'ai donc adapté le code :
    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
    Public Function NumSemISOm(ByVal RnDates As Range)
    Dim wd As Long
    Dim dat As Date
    Dim TabDates() As Integer
    Dim i As Integer
     
    ReDim TabDates(RnDates.Rows.Count)
    For i = 0 To UBound(TabDates)
        d = RnDates(i + 1)
        wd = Weekday(d, vbMonday)
        TabDates(i) = Int((d - DateSerial(Year(d - wd + 4), 1, 1) - wd + 11) / 7)
    Next i
    NumSemISOm = TabDates
     
    End Function
    Si j'utilise une formule du type MAX(NumSemISOm(ListeDates)), aucun soucis, j'obtiens 52, et MIN, j'obtiens 1.
    Je travaille sur deux années, c'est donc d'une logique implacable

    Mais si j'essaie de l'utiliser dans un SOMMEPROD avec par exemple *NumSemISOm(ListeDates)=3*, c'est comme si je n'avais rien mis ...

    Donc ma question, ce code vous paraît-il correct pour ce que je veux en faire ?

    Merci d'avance.

    Edit : En fait la fonction marche parfaitement bien. J'ai essayé avec un SOMMEPROD plus basique, tous les résultats sont logiques. Le problème est que j'essaie d'appliquer un critère année et ensuite un critère numéro de semaine sur la même plage de cellules ... ce qui ne fonctionne pas.

    J'ai modifié le titre de la discussion, si quelqu'un cherche une fonction telle que celle-ci, il trouvera plus facilement.
    Et un si un modo passe par là pour déplacer dans la partie VBA

    Par contre, je sens que je vais ouvrir un nouveau sujet avec mon problème de sommeprod avec critère sur une même colonne avant la fin de la journée

    Fred

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    j'ai un peu modifié ta fonction :
    - il y a plus simple pour le calcul du n° de semaine.
    - pour être matricielle une fonction personnalisée doit être As Variant
    - comme tu veux une colonne en retour il faut transposer ta matrice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function NumSemISOm(RnDates As Range) As Variant
        Dim TabDates() As Integer, i As Integer
        ReDim TabDates(1 To RnDates.Rows.Count)
        For i = 1 To UBound(TabDates)
            TabDates(i) = DatePart("ww", RnDates(i), vbMonday, vbFirstFourDays)
        Next i
        NumSemISOm = Application.Transpose(TabDates)
    End Function
    Teste si c'est mieux...

    eric

    edit :
    Le problème est que j'essaie d'appliquer un critère année...
    Tu pourrais faire une autre fonction qui te retourne 201326 pour la 26ème semaine de 2013, d'une pierre 2 coups.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bonjour Eric,

    merci de t'intéresser à mon cas
    Apparemment, cela fonctionne du coup beaucoup mieux dans mon SOMMEPROD. Je pensais que c'était parce que je travaillais sur la même plage de cellules que j'avais des soucis. En fait, je travaille bien sur la même plage, mais sur des matrices différentes, l'une pour les années, l'autre pour les semaines. Donc je ne devrais pas avoir de soucis de ce côté là. Enfin ... si j'ai bien tout compris

    Je retiens donc deux choses, Variant pour retourner une matrice, comme c'est d'ailleurs expliqué chez crosoft :http://support.microsoft.com/kb/463444/fr
    Et ne pas oublier le transpose pour remettre à la verticale. Un jour je percuterai dès que je créerai ma variable tableau

    Par contre, pour le datepart, après avoir lu :
    http://support.microsoft.com/?kbid=200299
    et
    http://blog.developpez.com/philben/p...o_des_semaines
    Je vais garder la solution de philben (finalement je n'avais pas cherché la solution si loin que cela).
    En effet, comme expliqué sur le site de microsoft et testé à l'instant dans Excel, avec datepart :
    28/12/2003 semaine 52
    29/12/2003 semaine 53
    30/12/2003 semaine 1


    Apparemment, ce problème de semaine ISO fait couler beaucoup d'encre (ou de pixels) sur le net ...

    Je me rends compte également que je déclarais dans mon code une variable "dat" qui ne me sert pas, et que j'utilisais "d" (déclarée en début de module comme publique). Pas très propre tout ça.

    Donc au final, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function NumSemISOm(RnDates As Range) As Variant
        Dim TabDates() As Integer, i As Integer, wd As Long
        ReDim TabDates(1 To RnDates.Rows.Count)
        For i = 1 To UBound(TabDates)
            wd = Weekday(RnDates(i), vbMonday)
            TabDates(i) = Int((RnDates(i) - DateSerial(Year(RnDates(i) - wd + 4), 1, 1) - wd + 11) / 7)
        Next i
        NumSemISOm = Application.Transpose(TabDates)
    End Function
    A première vue, cela fonctionne.

    Merci Eric.

    Fred

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Je vais garder la solution de philben (finalement je n'avais pas cherché la solution si loin que cela).
    En effet, comme expliqué sur le site de microsoft et testé à l'instant dans Excel, avec datepart :
    28/12/2003 semaine 52
    29/12/2003 semaine 53
    30/12/2003 semaine 1
    Effectivement, j'avais noté des erreurs sur ces dates :
    29/12/1947
    31/12/1951
    30/12/1963
    29/12/1975
    31/12/1979
    30/12/1991
    29/12/2003
    31/12/2007
    30/12/2019
    29/12/2031
    31/12/2035
    30/12/2047
    29/12/2059.
    Je modifie mes notes et adpote aussi la solution de Philben... ;-)

    eric

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/12/2014, 17h15
  2. Réponses: 2
    Dernier message: 23/09/2009, 21h24
  3. Faire des calculs sur le numéro de semaine ISO
    Par Fiona08 dans le forum SQL
    Réponses: 13
    Dernier message: 20/10/2008, 11h28
  4. Numéro de semaine à partir d'une date
    Par LaPanic dans le forum Excel
    Réponses: 5
    Dernier message: 31/03/2008, 23h06
  5. numéro de semaine à partir d'une date
    Par christophe_halgand dans le forum Excel
    Réponses: 3
    Dernier message: 18/01/2008, 11h12

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