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 :

Passer jjmmaa en jj/mm/aa [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2010
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 272
    Points : 222
    Points
    222
    Par défaut Passer jjmmaa en jj/mm/aa
    Bonjour à tous,

    Je pensais que cela serait facile, mais je me résous finalement à poster ici
    Je cherche à transformer automatiquement toute saisie du type jjmmaaaa dans une cellule de mon classeur en jj/mm/aaaa.

    Est-ce que c'est possible, en transformant de plus la cellule modifiée en un format date, sans passer par une cellule intermédiaire (sinon j'aurai fait avec les formules, plus simple....).

    Je préfère ne pas poster les bouts de code que j'avais préparés dans ma sub worksheet_change(byval target as range), les string, long et date s'y entremêlent sans cohérence...

    Merci par avance pour vos lumières, en espérant avoir été clair !

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Essaies ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim v As Double
      If Intersect(Target, [B2:B99]) Is Nothing Then Exit Sub  ' à adapter à la plage de saisie
      For Each c In Target.Cells
        v = Val(c.Formula)
        On Error Resume Next
        If Not IsDate(c.Text) Then If v >= 1011900 And v <= 31129999 And Int(v) = v Then c.Value = CDate(Format(v, "00\/00\/0000"))
        On Error GoTo 0
        If IsDate(c.Text) Then c.NumberFormatLocal = "jj/mm/aaaa" Else c.NumberFormatLocal = "Standard"
      Next c
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2010
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 272
    Points : 222
    Points
    222
    Par défaut
    Ma foi, je l'ai adapté à mon classeur et ça fonctionne vraiment nickel. Un grand merci à toi

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2010
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 272
    Points : 222
    Points
    222
    Par défaut
    Oups, je me permets de rouvrir finalement le topic...
    Ca marche dans "presque" tous les cas : lorsque je rentre une date commençant par 01 ou 02 (02/03/2019 par exemple), Excel l'interprète mal et ressors une date erronée (02032019 donne 23/06/7469, toujours par exemple).

    C'est d'autant plus surprenant qu'en testant pas à pas chaque étape du passage clé du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.Value = CDate(Format(v, "00\/00\/0000"))
    tout semble bien fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox(CDate(Format(v, "00\/00\/0000")))
    me donne même la bonne réponse...

    Où se situerait alors l'erreur de traitement ?
    Merci encore

  5. #5
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Le problème, pour ta demande, c'est que pour que ça puisse fonctionner, il faut que la cellule de saisie soit au format texte (sinon, un "0" en premier caractère ne sera pas conservé) et que la cellule résultat soit au format date.
    Donc, on ne pourra pas faire deux saisies dans la même cellule. La fonction Worksheet_Change modifiant le format de cellules, la saisie suivante ne se fera pas dans une cellule Texte, ce qui empêchera la macro de fonctionner.

    En partant du principe (écrit dans ta demande) que les dates sont saisies et non pas copiées ou importées, et donc que Worksheet_Change ne peut concerné qu'une cellule à la fois.
    En supposant que les cellules concernées sont celles de la zone B2:B99 (pour conserver l'hypothèse de Patrice740) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Temp As String
     
    If Intersect(Target, Range("B2:B99")) Is Nothing Then Exit Sub
    If Target.NumberFormatLocal <> "@" Then Exit Sub
     
    Temp = Target.Value
    Target.ClearContents
    Target.NumberFormatLocal = "jj/mm/aaaa"
    Target.Value = DateSerial(Right(Temp, 4), Mid(Temp, 3, 2), Left(Temps, 2))
     
    End Sub
    Je n'ai pas testé, il y aura donc peut-être du débugage à faire.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2010
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 272
    Points : 222
    Points
    222
    Par défaut
    Bonjour Menhir,

    Je te remercie de ton retour, que j'ai réussi à adapter à ma problématique.

    Ce qui me chagrine encore, c'est que je comprends bien tes arguments concernant les dates commençant avec un "0", hors il se trouve qu'une date en 03/../.... fonctionne parfaitement, idem pour les suivantes.
    Simplement les 01/../.... et 02/../.... qui restent capricieuses. J'aurais bien aimé comprendre pourquoi

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour

    Citation Envoyé par d0n32 Voir le message
    Oups, je me permets de rouvrir finalement le topic...
    Ca marche dans "presque" tous les cas : lorsque je rentre une date commençant par 01 ou 02 (02/03/2019 par exemple), Excel l'interprète mal et ressors une date erronée (02032019 donne 23/06/7469, toujours par exemple).
    Citation Envoyé par Menhir Voir le message
    Le problème, pour ta demande, c'est que pour que ça puisse fonctionner, il faut que la cellule de saisie soit au format texte...
    Pour que le code que j'avais proposé fonctionne, il faut absolument que la cellule de saisie soit au format Standard.

    Voici une correction de mon code, quoique la proposition de Menhir soit plus simple (mais elle évince le format texte) :
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim v As Double
    Dim f As String
      If Intersect(Target, [B2:B99]) Is Nothing Then Exit Sub  ' à adapter à la plage de saisie
      For Each c In Target.Cells
        f = c.NumberFormatLocal
        c.NumberFormatLocal = "Standard"
        v = Val(c.Formula)
        On Error Resume Next
        If Not IsDate(c.Text) Then If v >= 1011900 And v <= 31129999 And Int(v) = v Then c.Value = CDate(Format(v, "00\/00\/0000"))
        On Error GoTo 0
        If IsDate(c.Text) Then c.NumberFormatLocal = "jj/mm/aaaa" Else c.NumberFormatLocal = f
      Next c
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Janvier 2010
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 272
    Points : 222
    Points
    222
    Par défaut
    Et effectivement cela fonctionne désormais parfaitement... Merci à vous 2 !

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

Discussions similaires

  1. Passer un projet de la version 6 à la version 7
    Par clisson dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/02/2003, 11h37
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. pk passer de mysql à postgre
    Par pioums dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 03/10/2002, 10h31
  4. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

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