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 :

Excel 2024-VBA : problème de dates sur 90 jours pour des flux RSS


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité de passage
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut Excel 2024-VBA : problème de dates sur 90 jours pour des flux RSS
    Bonjour à tous,
    J'aurai besoin de conseils, sur un code créer qui récupère les titres à partir de flux RSS afin de créer une newsletter trimestrielle. Mon problème, quand je lance la macro, oK, mais cela me récupére les différents articles des différents flux, mais sur 2 mois et non sur 90 jours. Quelqu'un(e) aurait une idée ? mon code pour la partie date ci-dessous, et merci pour votre aide :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Function ParseRSSDateV2(pubDateStr As String) As Date
        Dim moisFrancais As Variant, moisAnglais As Variant
        Dim i As Integer, nbJours As Integer
        Dim temp As String
     
        On Error Resume Next
        pubDateStr = Trim(LCase(pubDateStr))
     
        ' === 1. Format relatif "il y a X jour(s)" ===
        If InStr(pubDateStr, "il y a") > 0 Then
            temp = Replace(pubDateStr, "il y a", "")
            temp = Replace(temp, "jours", "")
            temp = Replace(temp, "jour", "")
            temp = Trim(temp)
            nbJours = Val(temp)
            If nbJours > 0 Then
                ParseRSSDateV2 = Date - nbJours
                Exit Function
            End If
        End If
     
        ' === 2. Format JJ/MM/AAAA ou reconnu directement ===
        If IsDate(pubDateStr) Then
            ParseRSSDateV2 = CDate(pubDateStr)
            Exit Function
        End If
     
        ' === 3. Format anglais "September 17, 2025" ou "October 2025" ===
        moisAnglais = Array("january", "february", "march", "april", "may", "june", _
                            "july", "august", "september", "october", "november", "december")
        For i = 0 To 11
            If InStr(pubDateStr, moisAnglais(i)) > 0 Then
                ' Format complet "September 17, 2025"
                If InStr(pubDateStr, ",") > 0 Or InStr(pubDateStr, " ") > 0 Then
                    temp = Replace(pubDateStr, ",", "")
                    ParseRSSDateV2 = CDate(temp)
                    If Err.Number = 0 Then Exit Function
                End If
                ' Format partiel "October 2025"
                If IsNumeric(Right(pubDateStr, 4)) Then
                    ParseRSSDateV2 = DateSerial(Right(pubDateStr, 4), i + 1, 1)
                    Exit Function
                End If
            End If
        Next i
     
        ' === 4. Format français "17 septembre 2025" ou "octobre 2025" ===
        moisFrancais = Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", _
                             "août", "septembre", "octobre", "novembre", "décembre")
        For i = 0 To 11
            If InStr(pubDateStr, moisFrancais(i)) > 0 Then
                temp = Replace(pubDateStr, moisFrancais(i), CStr(i + 1))
                temp = Replace(temp, ",", "")
                temp = Trim(temp)
                ' Format complet "17 septembre 2025"
                If IsNumeric(Left(temp, 2)) And IsNumeric(Right(temp, 4)) Then
                    ParseRSSDateV2 = CDate(Left(temp, 2) & "/" & (i + 1) & "/" & Right(temp, 4))
                    Exit Function
                End If
                ' Format partiel "octobre 2025"
                If IsNumeric(Right(temp, 4)) Then
                    ParseRSSDateV2 = DateSerial(Right(temp, 4), i + 1, 1)
                    Exit Function
                End If
            End If
        Next i
     
    Debug.Print "Brut : " & pubDateStr & " ? Interprété : " & dateArticle
        ' === Si tout échoue ===
        ParseRSSDateV2 = 0
    End Function

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 269
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Ton code a l'air pas mal du tout, vu de l'extérieur
    Comme j'ignore comment s'écrivent les dates dans les flux RSS (en fait je ne sais même pas comment lire un flux RSS en VBA), je ne vois pas d'autre solution que de lancer ton code sur tous les articles, écrire dans une colonne d'une feuille Excel toutes les dates originales au format texte et toutes les dates interprétées par ton code dans la colonne d'à côté, puis d'analyser tout ça

  3. #3
    Invité de passage
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut
    Bonjour, en fait il existe différents formats sur des flux RSS français : 01/10/2025, 1 octobre 2025, 18 jours, voir format anglais....et c'est la complexité du code !

  4. #4
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 269
    Billets dans le blog
    2
    Par défaut
    Re,

    Oui, mais le conseil reste valide
    Essaye d'appliquer ta fonction sur de nombreux articles du flux RSS, pour identifier les cas où elle ne renvoie pas la bonne date éventuellement
    ça va demander une analyse manuelle mais je ne vois pas mieux pour identifier le soucis

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 473
    Par défaut
    Hello,

    Pour votre logique de filtrage vous avez sans doute utilisé la fonction DateDiff non ? On peut là voir ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Invité de passage
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut Résolu
    Bonjour, problème résolu. Voici le code qui focntionne si besoin, Merci à tous ceux qui ont bien voulu prendre un peu de temps pour me répondre : Function ParseRSSDateV2(pubDateStr As String) As Date
    Dim moisFrancais As Variant
    Dim moisAnglais As Variant
    Dim tempStr As String
    Dim i As Integer, nbJours As Integer

    On Error Resume Next
    ParseRSSDateV2 = 0
    pubDateStr = Trim(pubDateStr)
    If pubDateStr = "" Then Exit Function

    ' === Format relatif : "il y a X jours" ===
    If InStr(LCase(pubDateStr), "il y a") > 0 Then
    nbJours = Val(Replace(Replace(LCase(pubDateStr), "il y a", ""), "jours", ""))
    If nbJours > 0 Then
    ParseRSSDateV2 = Date - nbJours
    Exit Function
    End If
    End If

    ' === Format numérique : "10/10/2025" ou "17-09-2025" ===
    If IsDate(pubDateStr) Then
    ParseRSSDateV2 = CDate(pubDateStr)
    Exit Function
    End If

    ' === Format anglais long : "September 17, 2025" ou "Oct 10, 2025" ===
    On Error Resume Next
    ParseRSSDateV2 = CDate(pubDateStr)
    If Err.Number = 0 Then Exit Function
    On Error GoTo 0

    ' === Format français : "17 septembre 2025" ===
    moisFrancais = Array("janvier", "février", "mars", "avril", "mai", "juin", _
    "juillet", "août", "septembre", "octobre", "novembre", "décembre")
    tempStr = LCase(pubDateStr)
    For i = 0 To 11
    If InStr(tempStr, moisFrancais(i)) > 0 Then
    tempStr = Replace(tempStr, moisFrancais(i), CStr(i + 1))
    tempStr = Replace(tempStr, ",", "")
    tempStr = Application.WorksheetFunction.Trim(tempStr)
    On Error Resume Next
    ParseRSSDateV2 = CDate(tempStr)
    If Err.Number = 0 Then Exit Function
    On Error GoTo 0
    End If
    Next i

    ' === Format ISO : "2025-09-17T10:30:00" ou "2025-09-17" ===
    If InStr(pubDateStr, "-") > 0 Then
    tempStr = Split(pubDateStr, "T")(0)
    On Error Resume Next
    ParseRSSDateV2 = CDate(tempStr)
    If Err.Number = 0 Then Exit Function
    On Error GoTo 0
    End If

    ' === Format RFC 2822 : "Wed, 15 Oct 2025 06:59:05 +0000" ===
    If InStr(pubDateStr, ",") > 0 And InStr(pubDateStr, ":") > 0 Then
    Dim parts() As String
    parts = Split(pubDateStr, ",")
    tempStr = Trim(parts(1))
    tempStr = Split(tempStr, "+")(0)
    tempStr = Split(tempStr, "-")(0)
    On Error Resume Next
    ParseRSSDateV2 = CDate(tempStr)
    On Error GoTo 0
    End If
    End Function


    ' Fonction pour filtrer les articles des 90 derniers jours
    Function EstDansLes90Jours(dateArticle As Date) As Boolean
    Dim dateLimit As Date
    dateLimit = Date - 90

    ' Accepter si la date est APRÈS la limite ET pas dans le futur
    EstDansLes90Jours = (dateArticle > dateLimit And dateArticle <= Date And dateArticle > 0)
    End Function

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

Discussions similaires

  1. [XL-2010] Convertir une date format texte en format date sur une plage avec des cellules vides
    Par wkrystof1 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 19/04/2017, 17h10
  2. [Dates] Détecter la mise à jour d'un flux RSS
    Par eric41 dans le forum Langage
    Réponses: 3
    Dernier message: 30/07/2007, 09h34
  3. [VBA-E] Dbl Click sur une case pour afficher le contenu d'un USERFORM
    Par dado91400 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/03/2007, 11h41
  4. [Dev Web] Afficher des flux RSS sur un site
    Par R314R dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 01/09/2006, 09h27

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