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 :

Test d'une date MMDD [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut Test d'une date MMDD
    Bonjour,

    Je n'arrive pas à tester correctement une date entrée dans une cellule au format MMDD, la cellule en dessous représente cette date convertie :

    Appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case Traitement_Date(1, 10)
    La fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Traitement_Date(ByVal Ligne As Integer, ByVal Colonne As Integer) As Boolean
    Dim celldate As Range: Set celldate = ThisWorkbook.Worksheets("coller").Cells(Ligne, Colonne)
    With celldate
        If Len(.Text) <> 4 Then:          MsgBox "Longeur de la cellule doit être de 4 caractères": .Select: Exit Function:
        If Not IsNumeric(.Value) Then:    MsgBox "La date doit être au format numérique": .Select: Exit Function:
        .Offset(1, 0) = Mid$(.Value, 1, 2) & "/" & Mid$(.Value, 3, 2) & "/" & Year(Now)
        If Not IsDate(.Offset(1, 0)) Then MsgBox "Date au format mmdd attendu": .Select: Exit Function:
    End With
     
    Traitement_Date = True
     
    End Function

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    avec cette petite modif ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function Traitement_Date(ByVal Ligne As Integer, ByVal Colonne As Integer) As Boolean
    Dim celldate As Range: Set celldate = Sheets("Feuil1").Cells(Ligne, Colonne)
    With celldate
        If Len(.Text) <> 4 Then:          MsgBox "Longeur de la cellule doit être de 4 caractères": .Select: Exit Function:
        If Not IsDate(.Value) Then:    MsgBox "La date doit être au format numérique": .Select: Exit Function:
        .Offset(1, 0) = Day(.Value) & "/" & Month(.Value) & "/" & Year(Now)
        If Not IsDate(.Offset(1, 0)) Then MsgBox "Date au format mmdd attendu": .Select: Exit Function:
    End With
     
    Traitement_Date = True
     
    End Function
    A+

  3. #3
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Merci de s'intéresser à mon cas.

    La solution ne fonctionne pas car le champ n'est pas reconnu comme étant une date.

    Dans la cellule, j'ai un chiffre par exemple 1231 qui correspond au 31 décembre
    Mon problème c'est lorsque j'indique 3112 la date dans la cellule du dessous est automatiquement transformée et donc considérée comme valide.

    La date sur 4 caractères me sert pour enregistrer le nom des fichiers.

    Edit : la première cellule est au format Text

    Je viens d'essayer ça qui ne fonctionne pas non plus :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Format(.Value, "mmdd")

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Compris,
    si c'est en texte tu n'a pas de format puisque tu dit que la cellule contient.. 1231
    faudrait alors remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .Offset(1, 0) = Day(Val(Right(.Value, 2))) & "/" & Month(Val(Left(.Value, 2))) & "/" & Year(Now)
    Et mettre ensuite le format voulu.

    pour avoir directement le format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       .Offset(1, 0) = Format(Day(Val(Right(.Value, 2))) & "/" & _
        Month(Val(Left(.Value, 2))) & "/" & Year(Now), "ddmm")
    EDIT:
    Mais en fait, ce que tu veux c'est avoir directement ..3112 ?Si oui, il n'est pas nécessaire de passer par date ? sauf si tu veux tester que ce n'est pas, par ex: 3613

  5. #5
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Merci beaucoup, je vais regarder le code dés que j'ai un peu de temps.

    Effectivement, je veux 2 choses, tester le format sur 4 caractères, je ne veux ni le mois inversé par rapport au jour, et que le champ corresponde bien à une date valide.

    La date affichée dans la cellule en dessous n'est là que pour l'information de l'utilisateur, en réalité c'est la date sur 4 caractères qui est utilisée pour donner un nom à des fichiers générés.

    Habituellement pas de problèmes car c'est mon outil et il récupère cette date depuis une autre application.

    Le soucis c'est que je doit fournir cet outil à quelqu'un autre car mon contrat de prestation se termine, alors je dois blinder un peu plus certains de mes outils

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Day(Val(Right(.Value, 2)
    Me donne un numéro que je ne peux pas exploiter, mais je sens que je vais y arriver bientôt avec les indications fournies !

    Bon je reprendrai ça demain parce que là je tourne en rond

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    je n'aime pas la valeur donnée à tes cellules car elle est loin de te protéger ...
    tu ne peux vérifier la validité d'un jour par rapport à 1 mois (la chose est vraie pour tous les mois sauf février, qui peut avoir 28 ou 29 jours selon l'anné ....)

    Mais si tu y tiens, on va considérer que toutes les années sont bissectiles, alors ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Function verifie(nb As String) As Boolean
      Dim mois As Integer
      If nb Like "!####" Then Exit Function
      mois = IIf(nb \ 100 > 12, 0, nb \ 100) ' attention : c'est bien \ et non /
      If Not IsDate(nb Mod 100 & "/" & mois & "/2000") Then Exit Function
      verifie = True
    End Function
    A appeler ainsi, si toto est la chaine de caractères à vérifier :

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

Discussions similaires

  1. [AC-2007] Test sur une Date nulle
    Par fredo6951 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/09/2014, 00h37
  2. Test d'une Date en String
    Par mouss4rs dans le forum Langage
    Réponses: 12
    Dernier message: 20/01/2012, 16h19
  3. test sur une date
    Par frboyer dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2009, 16h03
  4. Test sur une date
    Par Treuze dans le forum Access
    Réponses: 5
    Dernier message: 13/08/2006, 14h10
  5. test la valeur d'une date dans une requete
    Par TuxP dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 14h53

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