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 :

Empêcher la conversion en date heure lors d'un chercher remplacer [XL-2007]


Sujet :

Macros et VBA Excel

  1. #21
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Oh oui je suis sûr...

    Comme je l'ai dit plus haut, j'ai déjà testé cela depuis pas mal d'années et chez pas mal de clients... J'aurais apprécié que la solution soit aussi simple que de laisser faire VBA, mais au final, la solution que je présente est simplissime, non?

    Pourquoi voudrais-tu que ton code fonctionne alors que, comme je l'ai dit plus haut, la conversion se fait au moment de la transformation en date par "le système". Pourquoi voudriez-vous que Excel ou VBA transforme votre donnée en fonction du format d'une cellule, qui n'est jamais que de l'habillage sur une valeur qui ne se modifie pas en fonction dudit format?
    Maintenant, ok pour le défi de trouver plus simple et qui fonctionne dans tous les cas
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #22
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Pierre,
    Parce que naïvement en mettant dans TextToColumns...FieldInfo:=Array(1, xlDMYFormat) ou xlDMYFormat = 4.

    je me dis qu'il doit faire ce qu'on lui demande ! prendre le jour en premier puis le mois et l'année !

    mais apparemment il n'en fait qu'à sa tête !

  3. #23
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Oliv,

    Ok. Je crois avoir compris ce que tu veux dire

    Tu t'attends à ce que Excel interprète correctement ta donnée à cause de l'option entourée dans la boite de dialogue suivante:
    Nom : 2015-12-02_214421.png
Affichages : 442
Taille : 21,0 Ko

    Au passage, remarque qu'il ne te donne pas de format (du type dd/mm/yy) mais simplement l'ordre des données JMA, MJA, ... (en fait, il va tenter de trouver une date qui correspond à ton schéma).


    Mais cela ne fonctionne que si la donnée est déjà une date ( ou interprétable comme telle, éventuellement via une conversion), et que tu veux l'interpréter dans un autre système de date. Or, tu as du texte dans ta cellule, même après avoir supprimé le "-". Donc, dans la fenêtre, pour pouvoir utiliser un autre système de dates, Excel convertit d'abord le texte en fonction des paramètres régionaux, puis applique à cette date le système de date renseigné par l'option. C'est donc toujours bien Excel qui interprète d'abord ton texte en date, et donc tu perds la main dessus.

    C'est pour cela qu'il faut parser.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #24
    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
    Citation Envoyé par Pierre Fauconnier Voir le message
    Docmarty,

    Ce que tu dois faire, c'est vérifier, via la fonction mois(), que la donnée est bien celle attendue. Le format que tu spécifies dans la formule te leurre visuellement sur la vraie valeur de la cellule.
    Voici donc un démo avec vérification des résultats obtenus, démontrant ma prétention qu'une date de type String lorsque envoyée vers une cellule au format autre que Texte, doit subir une conversion d'un type à un autre, conversion au cours de laquelle le jour et le mois seront inversés si VBA y reconnaît une date au format américain mm/jj/aa. Car VBA à l'origine ne connaissait que 2 formats de Date : le format mm/jj/aaaa et le format aaaa/mm/jj.

    Une date de type Date envoyée vers une cellule au format Texte provoque aussi l'inversion jour/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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub Demo_Inversions()
     
    Range("A11:d14").Clear
     
    Set B = Range("B12:B13")
    Set c = Range("c12:C13")
    Set D = Range("D12:D13")
     
     B.NumberFormat = "General"
     c.NumberFormat = "0.00"
     D.NumberFormat = "@"
     
     
     B(1).Offset(-1) = "'" & B.NumberFormat: B(1).Offset(-1).Select
     c(1).Offset(-1) = "'" & c.NumberFormat: c(1).Offset(-1).Select
     D(1).Offset(-1) = "'" & D.NumberFormat: D(1).Offset(-1).Select
     
     Range("B12:B14").NumberFormat = B(1).Offset(-1)
     Range("C12:C14").NumberFormat = c(1).Offset(-1)
     Range("D12:D14").NumberFormat = D(1).Offset(-1)
     
      B(1).Offset(, -1) = TypeName("10/01/2015"): B(1).Offset(, -1).Select
      B(2).Offset(, -1) = TypeName(CDbl(CDate("10/01/2015"))): B(2).Offset(, -1).Select
      B(3).Offset(, -1) = TypeName(CDate("10/01/2015")): B(3).Offset(, -1).Select
     
    'Valeur de type String
      B(1).Value = "10/01/2015": B(1).Select
      c(1).Value = "10/01/2015": c(1).Select
      D(1).Value = "10/01/2015": D(1).Select
     
    'Valeur de type Double
      B(2).Value = CDbl(CDate("10/01/2015")): B(2).Select
      c(2).Value = CDbl(CDate("10/01/2015")): c(2).Select
      D(2).Value = CDbl(CDate("10/01/2015")): D(2).Select
     
     'Valeur de type Date
      B(3).Value = CDate("10/01/2015"): B(3).Select
      c(3).Value = CDate("10/01/2015"): c(3).Select
      D(3).Value = CDate("10/01/2015"): D(3).Select
     
     For Each c In Range("B12:D14")
     
      c.Select
     
      If CDate(c.Value) <> CDate("10/01/2015") Then
       c.Interior.Color = RGB(255, 100, 50)
      Else
       c.Interior.Color = RGB(100, 255, 100)
      End If
     Next
     
    End Sub
    Cordialement

    Docmarti.

  5. #25
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut Docmarty,

    Je n'ai bien compris le sens de ton code. Avec la configuration régionale que j'ai illustrée plus haut, toutes les cellules renvoient octobre comme date, alors que ton code passe "10/01/2015" ==> la conversion ne fonctionne donc pas correctement.


    Nom : 2015-12-03_080919.png
Affichages : 426
Taille : 10,0 Ko



    Par contre, si je bascule en configuration "français (Belgique), j'ai janvier ou octobre selon les cas... Ce n'est guère plus probant.

    Nom : 2015-12-03_081010.png
Affichages : 345
Taille : 7,6 Ko





    Du coup, je ne comprends pas ce que tu souhaitais démontrer. Mais cela illustre que, par rapport à la demande initiale, il n'y a pour l'instant que le parsing qui passe correctement les tests et qui garantit que la valeur texte reçue est traduite correctement.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #26
    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
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Docmarty,

    Je n'ai bien compris le sens de ton code. Avec la configuration régionale que j'ai illustrée plus haut, toutes les cellules renvoient octobre comme date, alors que ton code passe "10/01/2015" ==> la conversion ne fonctionne donc pas correctement.
    Le "10/01/2015" pour un Américain, c'est le premier octobre 2015. C'est le seul pays au monde qui utilise ce format de date. Ca peut sûrement surprendre un Européen.

    Donc "10/01/2015" étant le mois d'octobre, ca veut dire que la conversion fonctionne correctement. D'ailleurs VBA ne connaissant que le format américain "10/01/2015" et le format international "2015-10-01", il n'y a pas de problème de dates sur VBA pour Excel pour les Américains.

    Le code suivant va être plus apte à illustrer le bonheur des Américains utilisateurs de Excel.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set c = Cells(16, 3)
     c.Value = "": c.Offset(, -2).Value = "": c.Offset(, -1).Value = ""
     c.Interior.Color = xlNone
     
     If Target.Count = 1 And Trim(Target.Value) <> "" Then
     If IsNumeric(Target.Value) Then
       c.Value = Format(CDate(Target), "mmmm")
       c.Interior.Color = Target.Interior.Color
       c.Offset(, -1).NumberFormat = "@":
       c.Offset(, -1).Value = "Mois = " & Month(CDate(Target.Value))
       c.Offset(, -2).Value = Target.Address
      ElseIf IsDate(Target.Value) Then
       c.Value = Format(Target, "mmmm")
       c.Interior.Color = Target.Interior.Color
       c.Offset(, -1).NumberFormat = "@":
       c.Offset(, -1).Value = "Mois = " & Month(CDate(Target.Value))
       c.Offset(, -2).Value = Target.Address
      End If
     End If
    End Sub
     
    Public Sub Demo_Inversions()
     
    Range("A11:d14").Clear
     
    Set B = Range("B12:B13")
    Set c = Range("c12:C13")
    Set D = Range("D12:D13")
     
     B.NumberFormat = "General"
     c.NumberFormat = "0.00"
     D.NumberFormat = "@"
     
     
     B(1).Offset(-1) = "'" & B.NumberFormat: B(1).Offset(-1).Select
     c(1).Offset(-1) = "'" & c.NumberFormat: c(1).Offset(-1).Select
     D(1).Offset(-1) = "'" & D.NumberFormat: D(1).Offset(-1).Select
     
     Range("B12:B14").NumberFormat = B(1).Offset(-1)
     Range("C12:C14").NumberFormat = c(1).Offset(-1)
     Range("D12:D14").NumberFormat = D(1).Offset(-1)
     
      B(1).Offset(, -1) = TypeName("10/01/2015"): B(1).Offset(, -1).Select
      B(2).Offset(, -1) = TypeName(CDbl(CDate("10/01/2015"))): B(2).Offset(, -1).Select
      B(3).Offset(, -1) = TypeName(CDate("10/01/2015")): B(3).Offset(, -1).Select
     
    'Valeur de type String
      B(1).Value = "10/01/2015": B(1).Select
     
      c(1).Value = "10/01/2015": c(1).Select
     
      D(1).Value = "10/01/2015": D(1).Select
     
    'Valeur de type Double
      B(2).Value = CDbl(CDate("10/01/2015")): B(2).Select
      c(2).Value = CDbl(CDate("10/01/2015")): c(2).Select
      D(2).Value = CDbl(CDate("10/01/2015")): D(2).Select
     
     'Valeur de type Date
      B(3).Value = CDate("10/01/2015"): B(3).Select
      c(3).Value = CDate("10/01/2015"): c(3).Select
      D(3).Value = CDate("10/01/2015"): D(3).Select
     
     For Each c In Range("B12:D14")
     
      c.Select
     
      If CDate(c.Value) <> CDate("10/01/2015") Then
       c.Interior.Color = RGB(255, 100, 50)
      Else
       c.Interior.Color = RGB(100, 255, 100)
      End If
     Next
     
    End Sub
    Cordialement

    Docmarti.

  7. #27
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    [...]

    Donc "10/01/2015" étant le mois d'octobre, ca veut dire que la conversion fonctionne correctement.[...]
    Le problème du départ (voir la question initiale) est de recevoir 10/01/2015 en tant que texte et le transformer en 10/01/2015 ( date valant 10 janvier, mode européenne) en VBA.

    Venir dire que "10/01/2015" est le mois d'octobre est ne pas tenir compte du tout de la question initiale... Cette discussion n'a aucun sens si tu ne tiens pas compte du problème initial et on perd tous notre temps!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #28
    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
    Tu as probablement raison.

    Je voudrais te remercier pour les magnifiques tutoriaux que tu as produits et mis à la disposition de tous sur ce forum. C'est absolument fantastique ce qu'on arrive à faire grâce à tes connaissances.
    Cordialement

    Docmarti.

  9. #29
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Bonjour, bonjour !

    Petit rappel concernant la fonction DateValue (cf Demo4)

    Sans compter la fonction CDate !


    ______________________________________________________________________________________________________
    Je suis Paris, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #30
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour Marc,

    Avec les paramètres régionaux tels que décrit plus haut, datevalue("10/01/2015") renvoie le 01 octobre 2015... (Ce qui n'est pas la demande de départ)... cdate("10/01/2015") aussi...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #31
    Invité
    Invité(e)
    Par défaut
    Bonjour tous,
    Désolé pierre, j'ai fait un tour sur le site d Microsoft, et je n'ai pas trouvé d'autres exemples que DateSerial!

  12. #32
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut rdurupt,

    Pas de soucis... Au delà du post initial, cette discussion permet de mettre en lumière que les paramètres régionaux peuvent jouer des tours assez gênants, notamment avec une formule du style =texte(a1;"jj/mm/aa") qui va mal passer sur un Excel anglais parce que "jj/mm/aa" ne sera pas traduit par Excel en "dd/mm/yy".

    Dans le monde globalisé dans lequel nous travaillons, il n'est pas rare qu'un fichier Excel "voyage" des USA en Inde en passant par la France puis le Japon... Dans ce cadre de travail, il est particulièrement important d'être attentif à ces notions de dates et de paramètres régionaux, que ce soit en Excel pur ou en VBA.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #33
    Invité
    Invité(e)
    Par défaut
    oui tu a raison, et les fichier CSV par exemple font légion!

  14. #34
    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
    Citation Envoyé par CeluiQuiCherche Voir le message
    Bonjour,

    j'ai un problème sur une macro sur Excel 2007. Je copie/colle une liste de date/heure d'un fichier .csv

    Le format est en texte sous la forme dd/mm/aa-hh:mm:ss

    Le copier/coller ne me pose aucun problème.

    Par contre lorsque je fais un rechercher/remplace pour enlever le tiret (-), Excel me converti automatiquement les date/heure en format date heure (jj/mm/aaaa hh:mm:ss) pour toutes les date du 1 au 12 du mois en inversant les mm et jj et me laisse les autre au format texte.

    Exemple: 05/11/15-19:30:28 devient 11/05/2015 19:30:28 en format date/heure
    alors que 13/11/15-00:00:44 devient 13/11/15 00:00:44 en format texte

    Ma question est comment empêcher la conversion en date des 12 premiers jours pour avoir un format cohérent pour le traitement suivant?
    Pierre
    La question initiale est :
    "Ma question est comment empêcher la conversion en date des 12 premiers jours pour avoir un format cohérent pour le traitement suivant?"

    Je vois que ton code répond parfaitement à la demande d'empêcher l'inversion non seulement des 12 premiers jours, mais également des jours qui suivent.
    Mais dans la question, il y a inversion seulement pour les 12 premiers jours et le demandeur aimerait savoir pourquoi.

    Mon code veut précisément expliquer pourquoi il y a inversion des 12 premiers jours dans le cas où la date correspond pourtant aux paramètres régionaux et veut montrer une façon d'éviter cette inversion.

    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
    Sub Demo_Inversion()
    Ladate = "10/01/15-02:03:04"
     
    Range("B1:D4").Clear
     
    Set B1 = Range("B1")
    Set b2 = Range("b2")
    Set b3 = Range("b3")
    Set b4 = Range("b4")
     
     B1.Value = Ladate
     b2.Value = Ladate
     b3.Value = Ladate
     b4.Value = Ladate
     
     B1.NumberFormat = "@"
     b2.NumberFormat = "dd/mm/yyyy"
     b3.NumberFormat = "dd/mm/yyyy"
     b4.NumberFormat = "@"
     
     B1.Offset(, 2) = TypeName(Replace(B1.Value, "-", " ")) & " vers " & B1.NumberFormat
     B1.Value = Replace(B1.Value, "-", " ")
     
     
     b2.Offset(, 2) = TypeName(Replace(b2.Value, "-", " ")) & " vers " & b2.NumberFormat
     b2.Value = Replace(b2.Value, "-", " ")
     
     b3.Offset(, 2) = TypeName(CDate(Replace(b3.Value, "-", " "))) & " vers " & b3.NumberFormat
     b3.Value = CDate(Replace(b3.Value, "-", " "))
     
     b4.Offset(, 2) = TypeName(CDate(Replace(b4.Value, "-", " "))) & " vers " & b4.NumberFormat
     b4.Value = CDate(Replace(b4.Value, "-", " "))
     
    End Sub
    La seule chose qui varie entre la ligne 1 et 2, c'est la propriété Numberformat de la cellule. Et il y a inversion dans un cas et pas dans l'autre.
    La seule chose qui varie entre la ligne 3 et 4, c'est la propriété Numberformat de la cellule. Et il y a inversion dans un cas et pas dans l'autre.

    Pourquoi n'y a-t-il pas inversion quand la valeur envoyée est de type String et la propriété Numberformat est Texte?
    Ou quand la valeur envoyée est de type Date et la propriété Numberformat est Date?

    Est-ce qu'il y aurait inversion seulement quand le type de la date envoyée est différent du type généré par la propriété NumberFormat ?
    Cordialement

    Docmarti.

  15. #35
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    Vraiment très intéressant et enrichissant ce sujet ! les experts sont en plus au rendez-vous.

    Alors ne pourrions nous pas ensemble créer une fonction qui fasse la conversion dans la majorité des cas ?
    Etant donné que généralement on ne fait pas cela juste pour une date mais tout une colonne, on doit avoir de la matière pour trouver où se trouvent les élements DD MM YYYY hh:m:ss.
    en éliminant les caractères incorrects puis en utilisant par exemple les REGEX,
    on peut trouver facilement l'année = 4 chiffres (sauf dans l'exemple ici présent de notre ami)
    on isole les heures avec la présence de ":"
    on parcours toutes les zones où il y a 2 chiffres et lorsque cela dépasse 12 = jour.

    si on n'a pas assez de matière on demande à l'utilisateur de parser la date...
    Qu'en pensez vous ?

  16. #36
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Pierre, j'ai dû avoir du bol car pour des applis développées en France et utilisées worldwide, je n'ai jamais eu ton cas ! …

    Citation Envoyé par Pierre Fauconnier Voir le message
    Au delà du post initial, cette discussion permet de mettre en lumière que les paramètres régionaux peuvent jouer des tours assez gênants, notamment avec une formule du style =texte(a1;"jj/mm/aa") qui va mal passer sur un Excel anglais parce que "jj/mm/aa" ne sera pas traduit par Excel en "dd/mm/yy".

    Dans le monde globalisé dans lequel nous travaillons, il n'est pas rare qu'un fichier Excel "voyage" des USA en Inde en passant par la France puis le Japon... Dans ce cadre de travail, il est particulièrement important d'être attentif à ces notions de dates et de paramètres régionaux, que ce soit en Excel pur ou en VBA.
    Pas de souci dans ce cas de mon côté en VBA soit via la propriété International soit via la puissante fonction Evaluate

    Exemple pour International

    Exemple pour Evaluate
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #37
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Yeah, Marc... Enfin une solution autre que le parsing qui tient la route... pour VBA Excel...

    Solution à laquelle je n'avais pas pensé parce que confronté au même problème en Access, qui n'expose pas EVALUATE par exemple, j'étais parti plus naturellement sur le parsing.

    Mais pour Excel, c'est à retenir.

    Merci!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #38
    Invité
    Invité(e)
    Par défaut
    Salut,

    Comme ça, cela fonctionne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub WriteDateInRange()
        Me.Range("E1").Value = CDate(Format$(VBA.Replace(Me.Range("A1").Value, "-", " "), "dd/mm/yy hh:mm:ss"))
    End Sub
    La donnée d'entrée est en A1, et est écrite en E1.
    Il n'y a pas de validation de données d'entrée. Le texte doit correspondre au format fourni par 'CeluiQuiCherche' en 1ère page (sous la forme 05/11/15-19:30:28).

    En espérant ne pas écrire de conneries

    EDITÉ
    Dernière modification par Invité ; 06/12/2015 à 11h50.

  19. #39
    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
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Docmarty

    ...

    De plus, le format n'influe en rien la valeur contenue dans la cellule. ...

    Personnellement, j'ai rencontré de nombreuses fois ce problème entre mon pc où tout fonctionne bien et celui de certains clients chez qui l'inversion était effectuée, et à ce jour, la seule réponse que j'ai trouvée est celle que j'ai renseignée.

    Mais si tu as d'autres pistes testées sur divers environnements au niveau des paramètres régionaux, je suis preneur...
    Bonjour Pierre

    Tu as raison de dire que "le format n'influe en rien la valeur contenue dans la cellule". Car il influe uniquement sur la future valeur qui sera attribuée à la cellule.
    D'après une recherche très poussée que j'ai effectuée, l'inversion jour/mois dans une cellule est toujours reliée au format de la cellule. Je t'en donne un exemple en reprenant ton code: l'inversion se fait avec tous les paramètres régionaux sauf le paramètre Anglais(Etats-Unis).

    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 ligneforme As Long
     
      Dim Cell As Range
     
      ligneforme = 0
     
      Set Cell = Cells(ligneforme + 1, 2)
     
      Do While Cell.Value <> ""
     
        Cell.Offset(, 1).NumberFormat = "@"
        Cell.Offset(, 1).Value = DateSerial(Mid(Cell.Value, 7, 2), Mid(Cell.Value, 4, 2), Left(Cell.Value, 2))
     
        Cell.Offset(, 2).NumberFormat = "General"
        Cell.Offset(, 2).Value = DateSerial(Mid(Cell.Value, 7, 2), Mid(Cell.Value, 4, 2), Left(Cell.Value, 2))
     
        Set Cell = Cell(2)
      Loop
    End Sub
    Cordialement

    Docmarti.

  20. #40
    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
    Tout le problème avec les dates au niveau des paramètres régionaux est au contraire relié au type de la valeur envoyée par VBA et au type de la cellule réceptrice, autrement dit à sa propriété NumberFormat. Je m'explique : la raison en est que, dès que VBA écrit une valeur dans une cellule, une fonction de conversion de type intervient
    1) d'abord pour vérifier si le type de la valeur envoyée par VBA et le type de valeur désiré par la cellule selon sa propriété NumberFormat sont identiques ( 3 types sont possibles dans la cellule : Date, Double ou Texte )
    2) si les types ne sont pas identiques, la fonction de conversion procède à la conversion du type de la valeur envoyée. Exemple : si la valeur envoyée est de type Date et la cellule de type Texte, une conversion de type a lieu.
    Notre problème avec les dates, c'est que cette fonction de conversion de type ne connaît que 2 formats de dates : le format américain (m/j/aaaa) et le format international (aaaa/m/j). D'où l'inversion jour/mois si le format de la date envoyée est j/m/aaaa.

    Sachant cela, il faut absolument s'arranger pour que cette inversion de dates n'ait pas lieu.
    Une façon de faire, c'est de toujours envoyer vers la cellule une valeur du type attendu par la cellule pour que la conversion de type ne soit jamais requise lors du transfert de la valeur vers la cellule. Pas de conversion de type, donc pas d'inversion jour/mois.

    Une autre façon de faire, c'est d'utiliser .FormulaLocal à la place de .Value pour indiquer à VBA que la valeur est une valeur locale qu'il doit accepter telle quelle sans la modifier.


    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
    Sub test_FormulaLocal_vs_Value()
    Dim t
    d = CDate("2015-01-31")
     
    Range("A1:A31").NumberFormat = "General"
    For i = 1 To 31
     Cells(i, 1).Value = d + i
    Next
     
    Set r = Range("A1:A31")
    t = r.Value
     
    Range("D1:D31").NumberFormat = "@"
    Range("E1:E31").NumberFormat = "@"
     
    Range("D1:D31").FormulaLocal = t '  Valeur de Type Date --> cellule Texte;  il n'y a pas d'inversion jour/mois avec FormulaLocal
    Range("E1:E31").Value = t '   Valeur de Type Date --> cellule Texte;  il y a inversion jour/mois avec Value
     
    End Sub
    'Illustration du rôle de la propriété NumberFormat dans l'inversion jour/mois

    En B5 une date de type Date vers une cellule qui attend une valeur de type Texte requiert la conversion de type et provoque l'inversion.
    En C8, une date de type String vers une cellule qui attend une valeur de type Date requiert la conversion de type et provoque l'inversion.
    En D8, une date de type String vers une cellule qui attend une valeur de type Double provoque l'inversion.
    En D5, une date de type Date vers une cellule qui attend une valeur de type Double ne requiert pas de conversion de type. Pas d'inversion.
    En C5, une date de type Date vers une cellule qui attend une valeur de type Date ne requiert pas de conversion de type. Pas d'inversion.
    En B8, une date de type String vers une cellule qui attend une valeur de type String ne requiert pas de conversion de type. Pas d'inversion.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Sub Typename_Date_vers_Numberformats()
    Columns("A:D").Clear
    Dim s As Date
     
    s = CDate("10-01-2000")
    Cells(1, 1) = "Valeur attendue"
    Cells(1, 2) = CDate(s)
    Cells(1, 3) = CDate(s)
    Cells(1, 4) = CDbl(CDate(s))
     
    col = 1
    lig = 5
     
    Cells(lig, "B").NumberFormat = "@"
    Cells(lig, "C").NumberFormat = "General"
    Cells(lig, "D").NumberFormat = "0"
     
    Cells(lig - 1, "B").Value = "'" & Cells(lig, "B").NumberFormat
    Cells(lig - 1, "C").Value = "'" & Cells(lig, "C").NumberFormat
    Cells(lig - 1, "D").Value = "'" & Cells(lig, "D").NumberFormat
     
    Cells(lig - 1, "A").Value = TypeName(s) & " -->"
    Cells(lig, "A").Value = "Valeur obtenue"
    Cells(lig, "B").Value = s
    Cells(lig, "C").Value = s
    Cells(lig, "D").Value = s
     
    Call Typename_String_vers_Numberformats
     
    Cells(lig - 2, "B").Value = "Proprietes NumberFormat"
     
    End Sub
     
     
     
    Sub Typename_String_vers_Numberformats()
    Dim s As String
     
    s = "10-01-2000"
    Cells(1, 2) = CDate(s)
    Cells(1, 3) = CDate(s)
    Cells(1, 4) = CDbl(CDate(s))
     
    col = 1
    lig = 8
     
    Cells(lig, "B").NumberFormat = "@"
    Cells(lig, "C").NumberFormat = "General"
    Cells(lig, "D").NumberFormat = "0"
     
    Cells(lig - 1, "B").Value = "'" & Cells(lig, "B").NumberFormat
    Cells(lig - 1, "C").Value = "'" & Cells(lig, "C").NumberFormat
    Cells(lig - 1, "D").Value = "'" & Cells(lig, "D").NumberFormat
     
    Cells(lig - 1, "A").Value = TypeName(s) & " -->"
    Cells(lig, "A").Value = "Valeur obtenue"
    Cells(lig, "B").Value = s
    Cells(lig, "C").Value = s
    Cells(lig, "D").Value = s
     
    End Sub
    Cordialement

    Docmarti.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Conversion de date et heure en Excel
    Par youcef81 dans le forum Excel
    Réponses: 2
    Dernier message: 03/10/2006, 12h39
  2. [datetime] conversion d'une chaîne en une date + heure
    Par jean-jacques varvenne dans le forum Général Python
    Réponses: 2
    Dernier message: 07/04/2005, 10h43
  3. [CR] pb (concaténation/Conversion/Addition) sur date/heure
    Par marvel dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 20/12/2004, 15h31
  4. Conversion date ->heures
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/09/2004, 16h08
  5. Conversion de date lors d'un import
    Par bilbon.S dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 26/03/2004, 14h33

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