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 :

CDate et mois en anglais


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut CDate et mois en anglais
    Bonjour à tous,

    Je converti depuis plusieurs mois des dates plus ou moins "éclatées" grace à la fonction "CDate". Ce matin, souhaitant updater mon fichier, je me suis trouvé confronté à une incompatibilité de type dû au mois de décembre.

    J'ai fait quelques recherches... sans succès. Je me trouve donc vers vous.

    J'explique d'avantage mon programme :
    Sur une ligne, j'ai le mois et l'année => ex : "November 2012".
    Sur les lignes du dessous j'ai tous les jours => ex : "Day 1" puis en dessous "Day 2", etc...

    J'applique donc 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
    17
    18
    19
    20
                off = 1
                'Test if the last 4 characters are numeric (= the year)
                If IsNumeric(Right(cell.Offset(i, 0), 4)) Then
                    'Execute the program while the three first characters = "Day"
                    Do While Left(cell.Offset(i + off, 0), 3) = "Day"
                        'Convert the whole into a date
                        If Len(cell.Offset(i + off, 0)) = 5 Then
                            dte = CDate(Right(cell.Offset(i + off, 0), 1) & " " & Left(cell.Offset(i, 0), 3) & Right(cell.Offset(i, 0), 5))
                        ElseIf Len(cell.Offset(i + off, 0)) = 6 Then
                            dte = CDate(Right(cell.Offset(i + off, 0), 2) & " " & Left(cell.Offset(i, 0), 3) & Right(cell.Offset(i, 0), 5))
                        End If
     
                        'Execute the function ChooseData
                        ChooseData dte, cell, Pvt, (i + off)
     
                        'Set the date to "Empty" and increments the offset
                        dte = Empty
                        off = off + 1
                    Loop
                End If
    Je test tout d'abord si les 4 derniers caractères sont numériques (pour me placer au niveau de la cellule "December 2012"). Ensuite, tant que les cellules suivantes commencent par "Day", je cast ma date avec le numéro du jour, les trois premières lettres du mois et l'année. => ex : "1 Nov 2012"

    Jusqu'à maintenant, je n'ai jamais eu de problème. J'ai fait des tests et il semblerait que "1 Dec 2012" ne soit pas reconnu comme date.

    Quelqu'un peut-il m'aider sur ce problème ?

    Je reste à votre disposition pour toutes précisions si je n'ai pas été suffisamment clair !
    Je vous remercie par avance !

    Kimy

    EDIT : J'ai fait de plus amples tests => mon fichier ne devrait pas reconnaitre les mois "February", "April", "May", "June", "July", "August" et "December". Cela signifie tout simplement que la fonction CDate tente de caster les mois en Francais. Y-a-t-il une option spécifique pour lui demander de reconnaitre les trois premières lettres des mois en Anglais ?

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bon, j'ai un petit truc à la mano... mais ma question tient toujours si, quelqu'un passe par ici :
    J'appelle une fonction "CMonth" qui me fait la correspondance entre mes trois premières lettres et le numéro du 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Function CMonth(str As String)
     
    Select Case str
        Case "Jan"
            CMonth = 1
        Case "Feb"
            CMonth = 2
        Case "Mar"
            CMonth = 3
        Case "Apr"
            CMonth = 4
        Case "May"
            CMonth = 5
        Case "Jun"
            CMonth = 6
        Case "Jul"
            CMonth = 7
        Case "Aug"
            CMonth = 8
        Case "Sep"
            CMonth = 9
        Case "Oct"
            CMonth = 10
        Case "Nov"
            CMonth = 11
        Case "Dec"
            CMonth = 12
    End Select
     
    End Function
    en modifiant légèrement mon programme d'origine :
    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
                off = 1
                'Test if the last 4 characters are numeric (= the year)
                If IsNumeric(Right(cell.Offset(i, 0), 4)) Then
                    'Call the function "CMonth"
                    'str_mth = Left(cell.Offset(i, 0), 3)
                    Mth = CMonth(Left(cell.Offset(i, 0), 3))
     
                    'Execute the program while the three first characters = "Day"
                    Do While Left(cell.Offset(i + off, 0), 3) = "Day"
                        'Convert the whole into a date
                        If Len(cell.Offset(i + off, 0)) = 5 Then
                            dte = CDate(Right(cell.Offset(i + off, 0), 1) & "/" & Mth & "/" & Right(cell.Offset(i, 0), 5))
                        ElseIf Len(cell.Offset(i + off, 0)) = 6 Then
                            dte = CDate(Right(cell.Offset(i + off, 0), 2) & "/" & Mth & "/" & Right(cell.Offset(i, 0), 5))
                        End If
     
                        'Execute the function ChooseData
                        ChooseData dte, cell, Pvt, (i + off)
     
                        'Set the date to "Empty" and increments the offset
                        dte = Empty
                        off = off + 1
                    Loop
                End If
    Si quelqu'un sait comment je peux réaliser un CDate (ou autre, Format par exemple) avec les trois premières lettres des mois en anglais (ou plus si besoin) sans avoir besoin de faire appel à un tableau ou un case, je suis preneur !

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Comme je suppose que tu boucle sur les mois avec un compteur, tu peux utiliser la fonction "MonthName" avec I en premier argument et le second à "True" pour avoir le nom du mois en abrégé.
    Comme ton code n'est ici pas complet, j'ai adapté pour l'exemple.
    Je ne sais pas comment est utilisée ta date dans la proc "ChooseData" c'est pourquoi j'ai mis aussi avec la date en String
    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
     
    Sub Test()
     
        Dim Dte As Date
        'Dim Dte As String '<-- à voir ?
        Dim Off As Integer
        Dim I As Integer
     
        For I = 1 To 12
     
            Off = 2
     
            'Test if the last 4 characters are numeric (= the year)
            If IsNumeric(Right(Cells(1, I), 4)) Then
     
                'Execute the program while the three first characters = "Day"
                Do While InStr(Cells(Off, I), "Day") <> 0
     
                    'Convert the whole into a date
                    Dte = CDate(Replace(Cells(Off, I), "Day ", "") & " " & MonthName(I, True) & Right(Cells(1, I), 5)) '<-- sous format "01/01/2012"
     
                    'Dte = Replace(Cells(Off, I), "Day ", "") & " " & MonthName(I, True) & Right(Cells(1, I), 5) '<-- ici, pour l'avoir sous format "1 janv 2012"
     
                    'Execute the function ChooseData
                    'ChooseData Dte, Cell, Pvt, (i + Off)
     
                    Debug.Print Dte '<-- test
     
                    Off = Off + 1
     
                Loop
     
            End If
     
        Next I
     
    End Sub
    Hervé.

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Hum...
    In Microsoft Excel, the MONTHNAME function returns a string representing the month given a number from 1 to 12.

    MonthName( number, [ abbreviate ] )
    source : http://www.techonthenet.com/excel/fo.../monthname.php

    MonthName retourne le nom du mois en fonction du nombre de celui-ci. Moi je voudrais qu'avec les trois premières lettres du nom je puisse caster en date.

    Je montre rapidement comment sont les mois de mon TCD :


    Merci pour la lecture kiki29 ! Il y a des choses pas mal dedant !

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Désolé, je n'avais vraiment pas bien saisie le sens de ta question :o(
    Donc, si j'ai bien compris, tu veux avoir la date au format court du genre "01/01/2012" en ayant seulement les 3 premières lettres des mois qui eux sont écris en anglais (ici, je n'en vois pas la nécessité mais bon !) sous des paramètres régionaux Français ?
    Je pense qu'il te faut utiliser la fonction "Text" des feuilles de calcul de façon à ce qu'Excel fasse la conversion implicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dte = Application.WorksheetFunction.Text(Replace(Cell.Offset(I + Off, 0), "Day ", "") & " " & Left(Cell.Offset(I, 0), 3) & Right(Cell.Offset(I, 0), 5), "dd/mm/yyyy")
    Ici, avec le mois en entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dte = Application.WorksheetFunction.Text(Replace(Cells(2, I), "Day ", "") & " " & Left(Cells(1, I), InStr(Cells(1, I), " ") - 1) & Right(Cells(1, I), 5), "dd/mm/yyyy")
    J'ai juste utilisé la fonction "Replace" afin que tu puisse virer le "If Then Else" pour récupérer les nombres des jours.
    Je suppose que la variable "Dte" est déclarée "Date" (Dim Dte As Date), j'ai testé comme ça.
    Adapte, teste et dis moi si ça convient.

    Hervé.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Oups,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dte = Application.WorksheetFunction.Text(Replace(Cells(2, I), "Day ", "") & " " & Left(Cells(1, I), InStr(Cells(1, I), " ") - 1) & Right(Cells(1, I), 5), "dd/mm/yyyy")
    J'ai posté ma ligne de code test et non celle qui devrait être la tienne pour avoir le nom du mois en entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dte = Application.WorksheetFunction.Text(Replace(Cell.Offset(I + Off, 0), "Day ", "") & " " & Left(Cell.Offset(I, 0), InStr(Cell.Offset(I, 0), " ") - 1) & Right(Cell.Offset(I, 0), 5), "dd/mm/yyyy")
    Hervé.

Discussions similaires

  1. Mois en anglais
    Par bakman dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 06/01/2011, 15h02
  2. Objet mois en anglais
    Par JuniorBI dans le forum Designer
    Réponses: 7
    Dernier message: 15/10/2010, 12h13
  3. forcer le mois en anglais
    Par gilgil dans le forum Administration système
    Réponses: 1
    Dernier message: 19/04/2010, 16h41
  4. Réponses: 2
    Dernier message: 18/08/2009, 11h15
  5. Un Grand Problem pour moi - Delphi & Anglais
    Par pierrefrench dans le forum EDI
    Réponses: 6
    Dernier message: 20/02/2006, 09h43

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