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 :

Function avec Split [AC-365]


Sujet :

VBA Access

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 223
    Par défaut Function avec Split
    Bonjour,
    j'ai un formulaire "Formulaire_exportation" ou je change l'année sur un champ indépendant "choix_annee_occurences"
    J'ai une fonction qui vient faire un décompte lancé par une requête.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Function NbreOccurrences_verifie(Serie As String) As Integer
    'Occurences Vérifié: NbreOccurrences_verifie([Notes_dossier])
      Dim t() As String
      t = Split(Serie, "Vérifié le : " & "17/06/" & Form_Formulaire_exportation.choix_annee_occurences)
      NbreOccurrences_verifie = UBound(t)
    End Function
    je voudrai remplacer le 17/06 par ##/##/ pour prendre n'importe qu'elle date de l'année de Form_Formulaire_exportation.choix_annee_occurences ?

    J'y arrive pas ! si quelqu'un a une idée de faisabilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Serie, "Vérifié le : " & "##/##/" & Form_Formulaire_exportation.choix_annee_occurences)
    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    SPLIT découpe la chaine là où le paramètre est présent...

    Dans l'exemple SPLIT(Data, "Vérifié le : " & "17/06/") vous "matcherez" toutes les occurrences qui contiennent "Vérifié le : " & "17/06/"

    Si vous voulez obtenir la partie droite de l'occurrence, alors il faut le préciser comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strMaDate=SPLIT(MonChampInfoDate,"Vérifié le : ")(1)
    Ainsi, toutes les occurrences qui contiennent une date valide seront prises comme critère dans votre filtre : mais il y a risque d'erreur (9).

    Ce que je ne comprends pas dans votre demande, c'est que la date qui figure après l'occurrence à vérifier est bien puisée quelque part ?
    Pourquoi ne vous basez vous pas vers cette date qui doit se trouver dans un champ pour construire votre requête plutôt que de faire un SPLIT, qui plus est est risqué car vous vous exposez éventuellement à la fameuse erreur 9 si toutefois le champ ne contient pas l'occurrence attendue.

    De plus, si vous voulez obtenir le nombre d'occurrences qui contiennent la date attendue si toutefois il y a une date de précisée, pourquoi ne pas faire directement une requête plutôt qu'un SPLIT ?

    La question qu'il faut se poser, c'est où se trouve ladite date pour compter le nombre d'occurrences ?

    Un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(Champ) FROM MaTable WHERE MaDate BETWEEN  #dd/mm/yyyy# AND #dd/mm/yyyy#;
    suffit... Non ?

    Quel est le but du coup ?

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 223
    Par défaut
    Bonsoir,
    le but est de compter le nombre d'occurrence correspondant au champ Form_Formulaire_exportation.choix_annee_occurences du formulaire.
    Ex dans le champ du formulaire il y a 2022

    J'ai un enregistrement ou il y a un champ [Notes_dossier] avec :
    Vérifié le : 17/06/2022
    Vérifié le : 09/02/2022
    Vérifié le : 24/07/2021
    Vérifié le : 06/01/2021

    le but est de compter le nombre de fois ou il y a eu Vérifié le : en 2022
    Sur cet enregistrement l'occurrence doit être de 2 .

    Merci.

  4. #4
    Membre Expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 887
    Par défaut
    Bonjour Apoulit, argyronet,

    Si votre but est de compter le nombre d'occurrences = "2022" dans le champ "[Notes_dossier]" ou une autre année, je crois que la fonction "inStr" est beaucoup plus à propos.

    Voici un exemple de fonction qui ferait cela, dans un module standard le code suivant:
    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
    Option Compare Database
    Option Explicit
     
     
    Public Function fuNombreAn(ByVal Serie As String, ByVal YearToFind As String, Optional ByVal NombreAn As Long = 0, Optional ByRef lResult As Long = 0) As Long
     
        NombreAn = NombreAn + 1
        NombreAn = InStr(NombreAn, Serie, YearToFind)
        If NombreAn > 0 Then
            lResult = lResult + 1
            NombreAn = fuNombreAn(Serie, YearToFind, NombreAn, lResult)
        End If
     
        fuNombreAn = lResult
     
    End Function
    Les 2 derniers arguments de la fonction ne sont utiles qu'a la fonction elle même et se doivent donc d'être omis. La fonction parcours votre champs "Notes_dossier" et compte chaque fois qu'elle rencontre la string passé en paramètre.

    Si je reprend votre exemple, j'utiliserais la fonction comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une variable quelconque ou un champ de votre formulaire = fuNombreAn([Notes_dossier], Form_Formulaire_exportation.choix_annee_occurences)
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur :resolu:

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 454
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 454
    Par défaut
    Hello,

    Via une expression régulière ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Function getYearsCount(ByVal Data As String, ByVal year As String) As Integer
        Dim rx As Object        '// VBScript_RegExp_55.RegExp
        Set rx = CreateObject("VBScript.RegExp")
     
        rx.Global = True
        rx.Pattern = "(?:[012][1-9]|3[01])\/(?:0[1-9]|1[012])\/" & year
     
        Dim matchs As VBScript_RegExp_55.MatchCollection
        Set matchs = rx.Execute(Data)
        getYearsCount = matchs.Count
    End Function

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 223
    Par défaut
    Citation Envoyé par Apoulit Voir le message
    Bonsoir,
    le but est de compter le nombre d'occurrence correspondant au champ Form_Formulaire_exportation.choix_annee_occurences du formulaire.
    Ex dans le champ du formulaire il y a 2022

    J'ai un enregistrement ou il y a un champ [Notes_dossier] avec :
    Vérifié le : 17/06/2022
    Vérifié le : 09/02/2022
    Vérifié le : 24/07/2021
    Vérifié le : 06/01/2021

    le but est de compter le nombre de fois ou il y a eu Vérifié le : en 2022
    Sur cet enregistrement l'occurrence doit être de 2 .

    Merci.
    Bonjour, merci pour vos réponses, mais j'ai pas poussé mon explication assez loin (je m'en veux) il faut tenir comte de "Vérifié le : "

    Vérifié le : 17/06/2022
    Finalisé le : 15/08/2024
    Vérifié le : 09/02/2022
    Vérifié le : 24/07/2021
    Relancé le : 17/04/2019
    Vérifié le : 06/01/2021

    Voilà pourquoi c'est compliqué ! Vérifié le en 2022 ça fait 2

  7. #7
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 022
    Par défaut
    Aussi possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nb_occurences= dcount("*", "", instr( [Notes_dossier] , "Vérifié le : en 2022") > 0 )"
     
    ' comme la valeur de l'année est paramétrée :
    nb_occurences= dcount("*", "", instr( [Notes_dossier] , "Vérifié le : en " & Form_Formulaire_exportation.choix_annee_occurences )> 0 )"
    "Always look at the bright side of life." Monty Python.

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Ce qui se conçoit bien s'énonce clairement...

    Si vous aviez dès le départ précisé que l'information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Vérifié le : 17/06/2022
    Finalisé le : 15/08/2024
    Vérifié le : 09/02/2022
    Vérifié le : 24/07/2021
    Relancé le : 17/04/2019
    Vérifié le : 06/01/2021
    était située dans un seul et même champ, je ne vous aurais pas raconté la messe ainsi que je l'ai fait.

    Et effectivement, par découpage, ce n'est pas la bonne piste ou si mais avec un tableau dans lequel il faudra parcourir chaque occurrence.
    La solution de l'expression régulière est idéale et si je reprends la bonne proposition de deedolith
    il suffit de modifier le pattern comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Vérifié le : (?:[012][0-9]|3[01])\/(?:0[1-9]|1[012])\/" & year
    dans une fonction comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function CombiendAnnees(ByVal Champ As String, ByVal QuelleAnnee As String) As Integer
        Dim oRegex As Object
        Dim oResult As Object
     
        Set oRegex = CreateObject("VBScript.RegExp")
     
        oRegex.Pattern = "Vérifié le : (?:[012][0-9]|3[01])\/(?:0[1-9]|1[012])\/" & QuelleAnnee
        oRegex.Global = True
        Set oResult = oRegex.Execute(Champ)
        CombiendAnnees = oResult.Count
    End Function

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 223
    Par défaut
    Citation Envoyé par argyronet Voir le message
    Bonjour,

    Ce qui se conçoit bien s'énonce clairement...

    Si vous aviez dès le départ précisé que l'information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Vérifié le : 17/06/2022
    Finalisé le : 15/08/2024
    Vérifié le : 09/02/2022
    Vérifié le : 24/07/2021
    Relancé le : 17/04/2019
    Vérifié le : 06/01/2021
    était située dans un seul et même champ, je ne vous aurais pas raconté la messe ainsi que je l'ai fait.

    Et effectivement, par découpage, ce n'est pas la bonne piste ou si mais avec un tableau dans lequel il faudra parcourir chaque occurrence.
    La solution de l'expression régulière est idéale et si je reprends la bonne proposition de deedolith
    il suffit de modifier le pattern comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Vérifié le : (?:[012][0-9]|3[01])\/(?:0[1-9]|1[012])\/" & year
    dans une fonction comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function CombiendAnnees(ByVal Champ As String, ByVal QuelleAnnee As String) As Integer
        Dim oRegex As Object
        Dim oResult As Object
     
        Set oRegex = CreateObject("VBScript.RegExp")
     
        oRegex.Pattern = "Vérifié le : (?:[012][0-9]|3[01])\/(?:0[1-9]|1[012])\/" & QuelleAnnee
        oRegex.Global = True
        Set oResult = oRegex.Execute(Champ)
        CombiendAnnees = oResult.Count
    End Function

    Argy
    Oui vos deux solution fonctionnent avec un temps beaucoup plus long de calcul mais ça le fait ! Merci beaucoup.

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

Discussions similaires

  1. split - function avec image
    Par mimagyc dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 13/05/2008, 23h35
  2. pb avec split...
    Par peuf23 dans le forum Langage
    Réponses: 4
    Dernier message: 27/07/2005, 12h10
  3. [DEBUTANT] probleme avec split ?
    Par matN59 dans le forum ASP
    Réponses: 6
    Dernier message: 23/10/2004, 16h47
  4. [String] Probleme incomprehensible avec split
    Par scorpiwolf dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/07/2004, 22h21
  5. [langage] Problem avec split
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 08/07/2004, 15h42

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