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 :

Le format de "certaines" dates change après traitement dans une variable tableau. [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    GPMH
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : GPMH
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Le format de "certaines" dates change après traitement dans une variable tableau.
    Bonjour,

    Je consulte ce site depuis plusieurs mois et j'y trouve généralement des solutions, mais la je bloque (depuis 3 jours).
    Voici donc mon 1er message...

    Ce petit code m'affiche le bon format de date jusqu'au 30/09/2015. Ensuite, ça devient 10/01/2015, 10/02/2015... 10/12/2015 et à partir du 13, le format redevient correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim tabl()
     
    ReDim tabl(1 To 21)
    I = 1
     
    For dat = CDate("25/09/2015") To CDate("15/10/2015")
        tabl(I) = (dat)
        I = I + 1
    Next
     
    Range("A1").Resize(UBound(tabl)) = Application.Transpose(tabl)
     
    End Sub



    Merci d'avance pour vos réponses...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour, les date toujours au format internationale!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    ActiveCell = TrouveType("toto")
    ActiveCell.Offset(, 1) = TrouveType("5.2")
    ActiveCell.Offset(, 2) = TrouveType("01/01/2014")
    ActiveCell.Offset(, 3) = TrouveType("01/01/2014 15:20")
    End Sub
     
    Function TrouveType(V)
    TrouveType = V
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
    If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function
    End Function

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour

    Il est vrai que c'est compliqué en VBA de transférer une date vers une feuille.
    Robert a raison de prôner l'utilisation dans ce cas du format de date international dans un 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
    Sub testFormatInternational()
    Dim tabl()
     
    ReDim tabl(1 To 21)
    I = 1
     
    For dat = CDate("25/09/2015") To CDate("15/10/2015")
        tabl(I) = Format(dat, "yyyy-mm-dd")
        I = I + 1
    Next
     
    Range("e1").Resize(UBound(tabl)).Value = Application.Transpose(tabl)
     
    End Sub
    Il y a aussi une autre solution : l'utilisation de FormulaLocal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub testFormulaLocal()
    Dim tabl()
     
    ReDim tabl(1 To 21)
    I = 1
     
    For dat = CDate("25/09/2015") To CDate("15/10/2015")
        tabl(I) = dat
        I = I + 1
    Next
     
    Range("e1").Resize(UBound(tabl)).FormulaLocal = Application.Transpose(tabl)
     
    End Sub
    Cordialement

    Docmarti.

  4. #4
    Candidat au Club
    Homme Profil pro
    GPMH
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : GPMH
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Merci à vous pour ces réponses.
    Les 2 solutions fonctionnent, même si je comprend moins la solution .FormulaLocal , je prend quand même...

    au plaisir...

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    L'origine de ton problème est l'utilisation de Application.Transpose() qui transforme les valeurs Date en valeurs String.

    Pour éviter de devoir utiliser Transpose pour transformer ton tableau à une dimension en tableau à 2 dimensions, crée plutôt immédiatement un tableau à 2 dimensions :

    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
    Sub test()
     
    Dim tabl()
     
    'Tableau a 2 dimensions
    ReDim tabl(1 To 21, 1 To 1)
    I = 1
     
    For dat = CDate("25/09/2015") To CDate("15/10/2015")
     
         tabl(I, 1) = dat
        I = I + 1
    Next
     
    'Comme les valeurs de TABL sont de type DATE, si le format des cellules n'est pas GENERAL ou de type DATE, il y aura inversion jour/mois
    Range("A1").Resize(UBound(tabl)).NumberFormat = "General"
     
    Range("A1").Resize(UBound(tabl)).FormulaLocal = tabl
     
    End Sub
    Cordialement

    Docmarti.

  6. #6
    Candidat au Club
    Homme Profil pro
    GPMH
    Inscrit en
    Août 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : GPMH
    Secteur : Transports

    Informations forums :
    Inscription : Août 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour Docmarti,

    J'avais effectivement remarqué que application.transpose générait le problème, et je ne trouvai pas la solution.

    Merci pour l'astuce du tableau à 2 dimensions (et les solutions précédentes). Toutes ces technique vont me servir pour mes futurs projets...

    Cordialement.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a une autre solution avec la propriété NumberFormat de l'objet Range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Range("A1").Resize(UBound(tabl))
    .Value = Application.Transpose(tabl)
    .NumberFormat = "dd/mm/yyyy"
    End With
    End Sub
    Et toutes les combinaisons sont possibles NumberFormat = "ddd* dd/mm/yyyy", NumberFormat = "dddd, d mmmm yyyy", etc.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Une solution facile et ne présentant aucun risque d'inversion, est celle de Robert : l'utilisation du format de date international : "2015-01-20". VBA interprète toujours correctement ce format de date.

    Une autre solution facile : l'utilisation systématique de .FormulaLocal pour transférer des dates vers Excel.

    Avec .VALUE, pour utiliser les autres formats de date que le format de date international dans les valeurs à transférer vers Excel, il faut porter une attention extrême au format des cellules.

    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
    Sub Table_A_2_dimensions_Dates_et_Value()
     
    Dim tabl()
     
    'Tableau a 2 dimensions
    ReDim tabl(1 To 21, 1 To 1)
    I = 1
     
    For dat = CDate("25/09/2015") To CDate("15/10/2015")
         tabl(I, 1) = dat
        I = I + 1
    Next
     
    'Comme les valeurs dans TABL sont de type DATE, si le format des cellules etait STRING il y aurait inversion jour/mois avec .VALUE
    Range("B3").Resize(UBound(tabl)).NumberFormat = "@"
    Range("B3").Resize(UBound(tabl)).Value = tabl
    'Pas d'inversion avec .FORMULALOCAL
    Range("B3").Resize(UBound(tabl)).FormulaLocal = tabl
     
    'Comme les valeurs de TABL sont de type DATE, si le format des cellules EST GENERAL ou DATE, il n'y a pas risque d'inversion jour/mois avec .VALUE
    Range("B3").Resize(UBound(tabl)).NumberFormat = "General" 'ou "m/d/yyyy" ou un autre format Date reconnu
    Range("B3").Resize(UBound(tabl)).Value = tabl
    'Pas d'inversion avec .FORMULALOCAL
    Range("B3").Resize(UBound(tabl)).FormulaLocal = tabl
     
    'Par contre, si les dates dans TABL ataient de type STRING et le format des cellules est de type DATE, il y aurait inversion jour/mois avec .VALUE
    'Mais pas d'inversion avec .FORMULALOCAL
     
    End Sub
    Cordialement

    Docmarti.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    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 : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonsoir.

    Citation Envoyé par patricktoulon Voir le message
    Je l'avais vu. Excellent d'ailleurs.
    Ici, c'est un problème différent, car il s'agit de transférer vers une feuille le contenu d'une table contenant des dates au format String.
    Cordialement

    Docmarti.

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

Discussions similaires

  1. Stocker la date de la veille dans une variable
    Par weed dans le forum VBScript
    Réponses: 2
    Dernier message: 20/01/2011, 14h53
  2. [MDI] Erreur échange de MDIChild dans une variable
    Par Caesarus dans le forum Composants VCL
    Réponses: 1
    Dernier message: 26/02/2008, 18h15
  3. Réponses: 4
    Dernier message: 11/06/2007, 17h28
  4. [VBA-EXCEL] format de date lors d'écriture dans une cellule
    Par ustilago dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/02/2007, 18h44

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