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 :

Changement en format de date anglaise automatique [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Stagiaire vba
    Inscrit en
    Mai 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Stagiaire vba

    Informations forums :
    Inscription : Mai 2020
    Messages : 27
    Par défaut Changement en format de date anglaise automatique
    Bonjour,

    J'ai eu un bug intéressant alors que je rentrais des dates via vba dans des cellules Excel. Je les rentrais de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wb.Sheets(1).Cells(x, 3) = DateValue(jour & "/" & mois & "/" & Year(Now))
    Et pour une raison que j'ignore, le format de la cellule prenait automatiquement un format de date ANGLAISE (mm/jj/yyyy) et cela uniquement si le jour était inférieur à 10. Sinon la cellule gardait un format standard et la date était correcte.

    Je précise que les variables jour et mois sont initialisées avec une fonction Format() pour garder un 0 dans le cas où la valeur est inférieur à 10 et que je les récupère depuis une cellule ayant une valeur qui à une forme semblable à "Mar 12 Nov".

    Le problème est déjà réglé, j'ai juste donné un format texte à mes cellules avant de copier la date. Je voudrais juste savoir si quelqu'un connait ce problème et voudrais bien me partager son savoir, histoire de voir si j'ai fais une erreur quelque part et ne pas la reproduire.

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Stagiaire vba
    Inscrit en
    Mai 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Stagiaire vba

    Informations forums :
    Inscription : Mai 2020
    Messages : 27
    Par défaut
    Si quelqu'un veut voir comment j'initialise mes deux variables:
    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
            '-- Date
            '- Gestion du jour
            Dim j As String
            j = Right(wb.Sheets(nom).Cells(1, col).Value, Len(wb.Sheets(nom).Cells(1, col).Value) - 4)
            j = Left(j, 2)
            j = Format(val(j), "00")
     
            '- Gestion du mois
            Dim m As String
            m = Right(wb.Sheets(nom).Cells(1, col).Value, 5)
            m = Trim(m)
            Select Case m
                Case "Jan"
                    m = "01"
                Case "Fev"
                    m = "02"
                Case "Mars", "Mar"
                    m = "03"
                Case "Avr"
                    m = "04"
                Case "Mai"
                    m = "05"
                Case "Juin"
                    m = "06"
                Case "Juil"
                    m = "07"
                Case "Août"
                    m = "08"
                Case "Sep"
                    m = "09"
                Case "Oct"
                    m = "10"
                Case "Nov"
                    m = "11"
                Case "Déc"
                    m = "12"
                Case Else
                    Open ErrorFile For Append As #1
                        Print #1, "Erreur, le programme n'a pas pu identifier le mois d'une colonne"
                    Close #1
            End Select

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Airahn Voir le message
    Je les rentrais de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wb.Sheets(1).Cells(x, 3) = DateValue(jour & "/" & mois & "/" & Year(Now))
    Il serait préférable de procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wb.Sheets(1).Cells(x, 3) = DateSerial(Year(Now), mois, jour)
    Et pour une raison que j'ignore, le format de la cellule prenait automatiquement un format de date ANGLAISE (mm/jj/yyyy) et cela uniquement si le jour était inférieur à 10. Sinon la cellule gardait un format standard et la date était correcte.
    C'est un problème très connu et qui revient très régulièrement sur ce forum.
    VBA est anglophile, même s'il tourne sur un Excel francophone.
    Donc, il essaye d'imposer la date à l'américaine, sauf s'il se rend compte que c'est absurde (mois > 12) et, dans ce cas, il essayera le format local.

    Je précise que les variables jour et mois sont initialisées avec une fonction Format()
    Mauvaise idée.
    Avec DateSerial, laisse les valeurs sous forme d'entiers.

    Le problème est déjà réglé, j'ai juste donné un format texte à mes cellules avant de copier la date.
    Là encore, je pense que tu as tord.
    Une date est une date. La passer au format chaine de caractère, c'est aller au devant de problèmes et s'amputer de certaines fonctionnalités intrinsèques à ce format.

  4. #4
    Membre averti
    Homme Profil pro
    Stagiaire vba
    Inscrit en
    Mai 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Stagiaire vba

    Informations forums :
    Inscription : Mai 2020
    Messages : 27
    Par défaut
    En effet la fonction DateSerial semble fonctionner, merci, et ça m'évite le changement de format.
    Personnellement le changement de format ne me gênait pas mais je comprend que ça puisse déranger.

    Au passage, le Format(jour,"00") ne semble pas affecter le DateSerial. J'obtiens les même résultats dans les deux cas. Après je suis jamais contre une ligne de code en moins.

    Merci beaucoup et bonne journée à vous

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Airahn Voir le message
    Si quelqu'un veut voir comment j'initialise mes deux variables:
    Une version plus simple et plus sûre de ton 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
    16
    17
    18
    19
            '-- Date
            Dim jour As String, j As Long
            Dim mois As String, m As Long
     
            '- Gestion du jour
            jour = Right(wb.Sheets(nom).Cells(1, col).Value, Len(wb.Sheets(nom).Cells(1, col).Value) - 4)
            j = Val(Left(jour, 2))
     
            '- Gestion du mois
            mois = Trim(Right(wb.Sheets(nom).Cells(1, col).Value, 5))
            m = InStr("Jan  ,Fev  ,Mars ,Avr ,Mai  ,Juin ,Juil ,Août ,Sep  ,Oct  ,Nov  ,Déc  ", mois)
            If m = 0 Then
                Open ErrorFile For Append As #1
                Print #1, "Erreur, le programme n'a pas pu identifier le mois " & mois
                Close #1
            Else
                m = (m + 5) / 6
                wb.Sheets(1).Cells(x, 3) = DateSerial(Year(Now), m, j)
            End If
    Personnellement, au lieu d'envoyer les messages d'erreur dans un fichier en séquentiel, je les aurais envoyer vers la fenêtre d'exécution avec un Debug.Print.

  6. #6
    Membre averti
    Homme Profil pro
    Stagiaire vba
    Inscrit en
    Mai 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Stagiaire vba

    Informations forums :
    Inscription : Mai 2020
    Messages : 27
    Par défaut
    En effet cette gestion du mois est bien plus propre, surtout pour la gestion de l'erreur merci.

    je les aurais envoyer vers la fenêtre d'exécution avec un Debug.Print.
    J'ai un code assez long derrière cette gestion de date et le processus écrit un rapport pendant son déroulement qu'il est sensé enregistrer dans un dossier d'archive et m'envoyer en mail (quand outlook veut bien fonctionner). Mais merci pour l'idée, je ne pense jamais au Debug.Print

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

Discussions similaires

  1. [WD-2010] Personnaliser le format de date automatique
    Par StephBretagne dans le forum Word
    Réponses: 4
    Dernier message: 17/03/2013, 22h53
  2. Changement de format de date
    Par Yokooo dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 15/04/2010, 10h24
  3. changement de format pour date
    Par franz2b dans le forum SAS Base
    Réponses: 3
    Dernier message: 25/03/2010, 11h36
  4. changement de format de date
    Par yukonima dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 21/06/2008, 13h16
  5. Réponses: 6
    Dernier message: 21/06/2007, 15h26

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