1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Santé

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut Excel 2010 macro conversion champ date

    Bonjour,

    j'ouvre ce sujet faute d'avoir trouvé une solution par moi-même.

    Je débute en macro excel et je souhaitais automatiser une action manuelle.

    En pratique :
    - dans un classeur excel 2010, j'ai deux colonnes J et K avec des dates de la façon suivante
    colonne J colonne K
    08/août./2017 10:25 10/août./2017 15:13
    Mon objectif est d'extraire le numéro du mois dans une autre colonne.
    Pour cela, je remplace par l'outil recherche/remplace (ctrl+f) "./" en "/".
    Cette action marche très bien, car le "août./" devient "août/" et est converti automatiquement en 08. (j’extrais par la suite ce mois par une autre fonction)

    J'ai enregistré cette action manuelle dans une macro...et là c'est le drame.
    Via la macro l'action de remplacement marche bien, mais la valeur dans le cellule reste à "août" et non "08".
    Aprés chercher sur internet, je pensais que la solution était de faire un convertir en format JMA des cellules.
    Manuellement c'est Ok, mais toujours KO via une macro.

    Voici la macro.
    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
    Sub MAJ_MOIS()
    '
    ' MAJ_MOIS Macro
    '
     
    '
        Columns("J:K").Select
        Range("J4").Activate
        Selection.Replace What:="./", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
        Columns("K:K").Select
        Range("K4").Activate
     
      'converstion JMA  
            ActiveWindow.ScrollColumn = 2
        ActiveWindow.ScrollColumn = 3
        ActiveWindow.ScrollColumn = 4
        Range("J6").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.TextToColumns Destination:=Range("J6"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
        Range("K6").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.TextToColumns Destination:=Range("K6"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
     
     
    End Sub

    Merci d'avance pour votre aide.
    Sylvain

  2. #2
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Salut.

    D'abord, je te conseille, dans la mesure du possible et petit à petit, de te détacher de l'enregistreur de macros. Inspire-toi des codes que tu verras sur les forums et dans les tutos. Notamment, évite les Select qui sont lourds et ralentissent l'exécution, en plus de modifier la situation du fichier Excel, ce qui produit souvent une expérience utilisateur désagréable...

    Essaie également de ne pas tout placer dans la même procédure. Tout mettre dans une même proc amène des problèmes lors des tests (surtout avec des Select), rend la maintenance plus pénible et le code moins pérenne, et empêche sa réutilisation.

    Par exemple, pour ton problème spécifique de date, on devrait travailler avec une fonction qui ne fait que la transformation. Je t'en propose une ci-dessous, mais il y a d'autres manières de procéder. Le principe étant de diviser ta longue macro en morceaux qui n'ont qu'une seule responsabilité, puis d'assembler les différents morceaux au travers d'une procédure qui sera "le chef d'orchestre". C'est en procédant ainsi que tu travailleras de plus en plus facilement en 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
     
    Function TransformDate(ByVal strDate As String) As Date
      Dim Months
      Dim Pos As Long
      Dim Found As Boolean
      Dim Dates
     
      Months = Array("Janvier.", "Février.", "Mars.", "Avril.", "Mai.", "Juin.", "Juillet.", "Août.", "Septembre.", "Octobre.", "Novembre.", "Décembre.")
      Pos = 0
      Do While Pos < 12 And Not Found
        If InStr(1, strDate, Months(Pos), vbTextCompare) > 0 Then
          strDate = Replace(strDate, Months(Pos), Pos, , , vbTextCompare)
          Dates = Split(strDate, "/")
          TransformDate = DateSerial(Dates(2), Dates(1) + 1, Dates(0))
          Found = True
        End If
        Pos = Pos + 1
      Loop
    End Function
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Santé

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Tout d'abord merci pour ton retour et réactivité @Pierre Fauconnier

    Je prends note de tes conseils avisés .
    A chaud, je n'ai pas tout compris sur ton code :-) et je réfléchis encore à comment l'adapter à ma situation.

    Je ferais un retour après avoir travaillé dessus.

  4. #4
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    Bonjour
    et une petite fonction perso ca t'intéresse

    exemple

    sub pour tester une cellule par vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox convert_mois(Cells(1, 1))
    End Sub
    fonctionconvert_mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function convert_mois(cel)
        mois = Array("", "janv.", "fevr.", "mars.", "avr.", "mai.", "juin.", "juil.", "aout.", "sept.", "oct.", "nov.", "dec.", "")
        tabl = Split(cel, "/")
        If UBound(tabl) <> 0 Then
            moislettre = tabl(1)
            For i = 1 To 13
                If tabl(1) = mois(i) Then Exit For
            Next
                   convert_mois = IIf(i < 13, i, "nodate")
        Else
        convert_mois = "nodate"
     
        End If
    End Function
    exemple d'utilisation par formule

    a mettre dans la cellule ou tu veux que le mois en numérique apparaisse
    exemple ici je vais mettre en E1 le mois de A1 et en f1 le mois de B1
    formule en E1
    =SI(A1<>"";convert_mois(A1);"")
    formule en F1
    =SI(B1<>"";convert_mois(B1);"")
    résultat

    Nom : Capture.JPG
Affichages : 35
Taille : 81,9 Ko
    si ce n'est pas une date valide ainsi que si le mois ne respecte pas l'orthographe abrégé des 12 mois, tu aura "nodate" dans la cellule resultat
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    j'ai poussé un peu plus loin la reconnaissance du mois

    amélioration
    1. reconnaissance de deux formats de date (séparateur slashs ou tiret)
    2. reconnaissance du format de date de nos chers yanky
    3. reconnaissance des deux orthographe des mois (entier /abrégés)



    la formule en celluleou la sub pour tester reste les mêmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function convert_mois(cel)
        Dim T$, MoisL, MoisN, I#
        convert_mois = "nodate"
        T = Replace(cel, "-", "/")
        MoisL = Array("", "janv", "janvier", "fevr", "fevrier", "mars", "avr", "avril", "mai", "juin", "juil", "juillet", "aout", "sept", "septembre", "oct", "octobre", "nov", "novembre", "dec", "decembre", "")
        MoisN = Array("", 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, "")
        tabl = Split(T, "/")
        If UBound(tabl) <> 0 Then
            moislettre = tabl(1)
            For I = 1 To UBound(MoisL) - 1
                If Replace(tabl(1), ".", "") = MoisL(I) Or Replace(tabl(0), ".", "") = MoisL(I) Then convert_mois = MoisN(I): Exit For
            Next
        End If
    End Function
    Nom : Capture.JPG
Affichages : 31
Taille : 89,6 Ko
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Santé

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Merci beaucoup @patricktoulon

    Je viens de prendre connaissance de ta proposition.

    Je vais essayer de voir ça cette après-midi et je ferais un retour après les tests

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Santé

    Informations forums :
    Inscription : août 2017
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Bonjour,

    merci pour votre aide.

    J'ai opté pour la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function convert_mois(cel)
        Dim T$, MoisL, MoisN, I#
        convert_mois = "nodate"
        T = Replace(cel, "-", "/")
        MoisL = Array("", "janv", "janvier", "févr", "fevrier", "mars", "avr", "avril", "mai", "juin", "juil", "juillet", "aout", "sept", "septembre", "oct", "octobre", "nov", "novembre", "déc", "decembre", "")
        MoisN = Array("", 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, "")
        tabl = Split(T, "/")
        If UBound(tabl) <> 0 Then
            moislettre = tabl(1)
            For I = 1 To UBound(MoisL) - 1
                If Replace(tabl(1), ".", "") = MoisL(I) Or Replace(tabl(0), ".", "") = MoisL(I) Then convert_mois = MoisN(I): Exit For
            Next
        End If
    End Function
    Et dans mes cellules excel j'ai mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(convert_mois(K1150)="nodate";MOIS(K1150);convert_mois(K1150))

    Maintenant j'essaye d'adapter pour une extraction sur l'année, mais je galère...
    J'ai des années de ce type 15/déc./14 05:21:15 PM ou 15/déc./2014 05:21:15 PM
    Elle se trouve sur 2 ou 4 chiffres. J'aimerais l'extraire sur 4 chiffres et avoir dans ce cas 2014.

    J'ai utilisé ce code, mais ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function convert_annee(cel)
        Dim T$, AnneeL, AnneeN, I#
        convert_annee = "nodate"
        T = Replace(cel, "-", "/")
        AnneeL = Array("", "14", "2014", "15", "2015", "16", "2016", "17", "2017", "18", "2018", "19", "2019", "20", "2020", "21", "2021", "22", "2022", "23", "2023", "")
        AnneeN = Array("", 2014, 2014, 2015, 2015, 2016, 2016, 2017, 2017, 2018, 2018, 2019, 2019, 2020, 2020, 2021, 2021, 2022, 2022, 2023, 2023, "")
        tabl = Split(T, "/")
        If UBound(tabl) <> 0 Then
    '         anneelettre = tabl(1)
            For I = 1 To UBound(AnneeL) - 1
                If tabl(3) = AnneeL(I) Then convert_annee = AnneeN(I): Exit For
            Next
        End If
    End Function


    Pouvez-vous m'éclairer une nouvelle fois s'il vous plait ?
    Merci par avance

  8. #8
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Comprends-tu maintenant pourquoi je te conseillais de convertir ta donnée en date et non en mois?

    Maintenant, tu dois réinventer une fonction pour convertir l'année. Si tu avais directement converti ta donnée en date, tu aurais le jour, le mois et l'année pour le même prix, et éventuellement les heures, minutes et secondes si tu le souhaites, puisque ces données semblent faire également partie de la saisie.

    Je reviens donc avec ma proposition de transformer ta saisie en date, en fonction des possibilités de saisie. Pour la date, tu pourrais déjà extraire ce qui précède le premier espace, puis splitter pour récupérer les données. Quitte à utiliser une autre fonction perso pour la recherche du mois qui renverra l'indice numérique du mois en fonction de la chaine récupérée par le splittage. C'est comme cela que l'on programme proprement

    Voici le début d'une fonction qui pourrait traiter ta saisie. Il faudra évidemment envisager les différents cas de saisie du mois. C'est beaucoup plus simple à traiter en travaillant de cette façon, crois-moi.

    Nom : 2017-08-17_114624.png
Affichages : 23
Taille : 28,2 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  9. #9
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    Bonjour spy20

    on risque d'avoir un problème insoluble dans ce cas la
    regarde ces trois dates et selon l'interprétation de la date on peut être en 2014 ou 2004 ou 2012 comme Excel ne devine pas et qu'il va certainement l'interpréter comme une date format Français ou anglo-saxon tu aura donc des erreurs
    12/04/2014
    14/04/12
    14-dec.-04
    donc pour la 1ere c'est 2014 ca on est sur
    la 2 eme cela peut etre 14 ou 12
    et pareil pour la 3eme
    il faudrait au moins que tes dates de sur soit au même format partout exemple jour/mois/année ou année/mois/jours

    après abrégée ou pas on s'en fout mais elle doivent toute être écrite le même ordre

    dis moi qu'elles sont toujours dans le même ordre je te règle ca en 2 minutes
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par patricktoulon Voir le message
    [...]
    il faudrait au moins que tes dates de sur soit au même format partout exemple jour/mois/année ou année/mois/jours

    après abrégée ou pas on s'en fout mais elle doivent toute être écrite le même ordre

    dis moi qu'elles sont toujours dans le même ordre je te règle ca en 2 minutes
    Où as-tu vu que les dates n'étaient pas toujours saisies dans le même ordre? Spy a juste dit qu'il avait des années sur deux ou quatre chiffres. Si en plus tu l'embrouilles...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  11. #11
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Spy,

    Voici deux fonctions qui permettent de convertir tes saisies en date (à adapter pour GetMonth() si d'autres subtilités de saisie viennent s'ajouter dans l'expression du mois). En travaillant ainsi, tu as du code propre et facilement testable...

    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
    Function GetDate(Text As String) As Date
      Dim strDay As String, strMonth As String, strYear As String
      Dim Temp As String
      Dim intMonth As Integer
     
      Temp = Left(Text, InStr(1, Text, " ") - 1)
      strDay = Split(Temp, "/")(0)
      strMonth = Split(Temp, "/")(1)
      strYear = Split(Temp, "/")(2)
     
      intMonth = getMonth(strMonth)
      GetDate = DateSerial(strYear * 1, intMonth, strDay * 1)
    End Function
     
    Function getMonth(strMonth As String) As Integer
      Dim Months
      Dim Found As Boolean
      Dim Counter As Long
     
      Months = Array("janv", "fév", "mar", "avr", "mai", "juin", "juil", "aou", "sept", "oct", "nov", "déc")
      Counter = 0
      Do While Counter < 11 And Not Found
        If strMonth Like Months(Counter) & "*" Then Found = True
        Counter = Counter + 1
      Loop
      If Found Then getMonth = Counter
    End Function
    L'illustration suivante montre que tu récupères alors l'année ou le mois grâce aux fonctions natives Year() et Month()...

    Nom : 2017-08-17_121323.png
Affichages : 21
Taille : 3,6 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  12. #12
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    ou Pierre dans ce cas la si les dates sont toutes dans cet ordre

    un simple split sur l'espace puis sur le "/"(2)


    mais bien vu Pierre Fauconnier on pourrait même utiliser day()
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    sinon j'en ai une qui sert pour les 3 (jour,mois,année)
    juste pour tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
        Dim donnée_date$
        madate = "05/08/2017 08:45"
           donnée_date = examine_date(madate, 2)
        MsgBox donnée_date
    End Sub
    la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function examine_date(madate, ind) As String
        mois = Array("", "janv", "fév", "mar", "avr", "mai", "juin", "juil", "aou", "sept", "oct", "nov", "déc")
        madate = Replace(Split(madate, " ")(0), "-", "/")
        tabl = Split(madate, "/")
        If UBound(tabl) < 2 Then examine_date = "nodate": Exit Function
        For i = 1 To 12: If tabl(1) Like mois(i) & "*" Then tabl(1) = i
        Next
       examine_date = tabl(ind - 1)
    End Function
    'exemple de formule
    =SI(A2<>"";examine_date(A2;3);"")
    argument en rouge

    3 pour l'année
    2 pour le mois
    1 pour le jour
    mais attention contrairement a mon ancienne version ca implique un format identique a toute les cellule soit jour mois année en lettre ou en numérique
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    A partir du moment où une fonction renvoie une date, je ne vois pas l'intérêt d'une fonction qui renverrait une des trois parties selon un paramètre, puisque les fonctions natives existent, tant en Excel qu'en VBA. C'est justement l'intérêt de passer par une fonction qui renvoie une date que de pouvoir après en faire ce qu'on veut sans réinventer la roue...

    Mais bon, si tu y tiens...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  15. #15
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    re
    Pierre Fauconnier

    ceci
    20-aout-2017 08:30
    même en splittant l'heure ca me renvoie pas une date chez moi
    les fonctions natives fonctionnent avec un certains format je vais pas te l'apprendre
    toi tu met le mois en numerique si j'ai bien lu ton code mais tu ne traite pas la syntaxe "format"
    tu ne traite que les "/" (format classique)
    alors je te met moins combien vu ton statut ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    madate = "20-aout-2017"   ' Ou madate = "20/aout/2017"
    MsgBox IsDate(madate)
    End Sub
    donne résultat faux

    dans ma fonction je gère aussi les séparateurs

    en gros j'utilise même pas les fonctions simplement un tableau 1,2,3

    le moins un est injustifié même j'en ai un peu rien a ciré
    convertir en date
    a oui!! avec ceci
    12/03/14 07:00
    va chercher l'année toi
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par patricktoulon Voir le message
    [...]
    toi tu met le mois en numerique si j'ai bien lu ton code [...]i
    Lis mon code, je montre expressément que le mois est mis en texte (soit en abrégé soit en long), histoire de coller à la demande du début.

    Et effectivement, ma fonction ne gère que le / comme séparateur, alors que la tienne les gère tous (enfin, en gère plusieurs...). Wouah, quel exploit. Je peux ajouter la gestion des séparateurs dans la mienne, si tu y tiens, et gérer également les heures, minutes et secondes. Ca ne changera rien à la démarche que je recommande à Spy

    Ce que je veux te faire comprendre, mais que tu ne comprends pas car tu veux jouer à qui à la plus grosse, c'est que la fonction qui traitera la donnée doit renvoyer une date (éventuellement avec l'heure), de manière à pouvoir la traiter en tant que telle dans la suite du processus, alors que ta fonction renvoie une partie de la date selon un paramètre que l'on doit préciser. Et si demain il faut extraire l'heure ou les minutes ou les secondes, tu vas obliger l'utilisateur à passer 5, 6 ou 7 en paramètre alors que les fonctions Heure(), Minute() et seconde() existent. C'est d'une insondable absurdité, ce truc. Et je veux te faire comprendre que cette démarche est inutile puisque le VBA expose des fonctions qui permettent de faire cela. Inventer un tableau de trois données ou plus pour récupérer une partie de la date alors que des fonctions natives existent, c'est juste improductif et non professionnel.

    Si demain Spy veut calculer l'écart de jours entre 25/avr./2017 et 14/septembre/18 (pour reprendre des exemples qu'il a cités), tu vas lui inventer une nouvelle fonction? Avec ma façon de procéder, tu transformes les deux valeurs en date, puis soit tu calcules la différence, soit tu utilises DateDiff, ce qui permet en plus de calculer d'autres écarts que le nombre de jours.

    C'est la démarche proposée et mise en place qu'il te faut comprendre. Je ne peux rien pour toi si tu n'y arrives pas.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  17. #17
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par patricktoulon Voir le message
    [...]
    a oui!! avec ceci
    12/03/14 07:00
    va chercher l'année toi
    Je n'ai rien compris à cette partie de ton message. Je te rappelle que la demande est de pouvoir retrouver le mois en numérique lorsqu'il est exprimé en textuel, selon les exemples donnés par Spy au long de la discussion, pas de créer une usine à gaz qui tient compte de trucs qui ne sont pas demandés au départ.


    Quant à ton "exemple"...
    Citation Envoyé par patricktoulon Voir le message
    [...]
    12/03/14 07:00
    va chercher l'année toi
    Nom : 2017-08-17_150253.png
Affichages : 20
Taille : 1,3 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  18. #18
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    juillet 2012
    Messages
    4 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2012
    Messages : 4 293
    Points : 8 190
    Points
    8 190
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    je rebondis sur la fonction getMonth de Pierre, sur ton message #11

    la boucle Do While est un choix éclairé (je veux bien entendu parler du LIKE) ou d'habitude ?

    en utilisant Match on peut également s'en sortir, mais ici c'est uniquement en correspondance exacte


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function getMonthJOE(strMonth As String) As Integer
    Dim Result
        Result = Application.Match(strMonth, Array("janv", "fév", "mar", "avr", "mai", "juin", "juil", "aou", "sept", "oct", "nov", "déc"), False)
        getMonthJOE = IIf(IsError(Result), 0, Result)
    End Function
    J'ai fais le fainéant en supprimant la variable Months qui hébergeait ton Array

  19. #19
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 527
    Points : 25 926
    Points
    25 926
    Billets dans le blog
    4

    Par défaut

    Salut Joe,

    Ca permet éventuellement d'utiliser la fonction ailleurs que dans du VBA pour Excel. De plus, Spy disait avoir parfois 05/avr./17 et parfois 05/avril/17, d'où la nécessité soit d'utiliser le joker, soit de doubler le tableau. J'ai préféré la boucle avec le joker (6 boucles en moyenne par rapport à un match, je ne suis pas certain que ce soit très pénalisant).

    Mais pour une utilisation VBA Excel et une recherche exacte, ton approche est plus lisible, assurément, et évite la gestion de la sortie de boucle avec Found...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

  20. #20
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9 937
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 9 937
    Points : 15 909
    Points
    15 909
    Billets dans le blog
    1

    Par défaut re

    Quant à ton "exemple"...

    Envoyé par patricktoulon
    [...]
    12/03/14 07:00
    va chercher l'année toi





    voila tu a la réponse rassure moi on est bien d'accords que c'est faux
    ps:
    dans ta version avant split tu pourrais ajouter un replace "-" par "/" et "." par"/" y compris l'espace aussi histoire de prendre le plus grand nombre d'écriture
    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [XL-2010] Un trio infernal : BI - Excel 2010 - Macro.
    Par Steph-B dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/02/2013, 10h03
  2. [Débutant] Import de fichier Excel ds datagrid et champs dates
    Par shaun_the_sheep dans le forum Windows Forms
    Réponses: 0
    Dernier message: 14/11/2012, 14h10
  3. montée de version excel 2010 macro plantée
    Par bigokou dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/10/2012, 15h01
  4. [XL-2003] Filtre automatique par macro pour champ date et heure
    Par jedineofr dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/06/2011, 15h37
  5. Macro conversion de date
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/06/2008, 12h30

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