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 :

Conversion de date


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingenieur Securite
    Inscrit en
    Mai 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingenieur Securite
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 97
    Par défaut Conversion de date
    Bonjour à tous,

    Ca fait deux jours que je me casse les dents sur mon problème

    Sur un UserForm, j'ai un Label qui affiche la date du jour (ex: pour le 7 août 2013 => 07/08/2013) jusque là ça va.

    Là où ça se corse c'est lorsque que le Caption du Label va s'écrire dans la cellule choisie celle ci par enchantement ou ignorance se change en 08/07/2013 ; mais lorsque je sélectionne (dans mon calendar1) une date supérieure au 12 l'écriture dans ma cellule est correcte par rapport au format français (22/08/2013).

    J'ai eu beau déclarer dans un module la variable

    Dans et dans mon UserForm, essayer de mettre l'applcation international

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select Case Application.International(xlDateOrder)
        '0 = mois-jour-année
        '1 = jour-mois-année
        '2 = année-mois-jour
        Case 0
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "mm/dd/yyyy")
        Case 1
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "dd/mm/yyyy")
        Case 2
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "yyyy/mm/dd")
    End Select
    Voici l'intégralité du code de mon UserForm, peut être qu'une erreur s'est glissée.

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    Private Sub UserForm_Initialize()
    Dim nb_colonne As Long
        nb_colonne = Worksheets("Sections-Auditeurs-Machines").Cells(1 & Columns.Count).End(xlToLeft).Column
     
    'Affichage de la date du jour dans le label
        Lbl_Date_Formulaire.Caption = Date
     
    'Zone de liste vierge
        ComboBox_Section.Value = ""
        ComboBox_Auditeur.Value = ""
        ComboBox_Poste.Value = ""
        TextBox_Operateur.Value = ""
     
    'Ajout des valeurs des cellules A1 à ... de l'onglet "Sections-Auditeurs"
        For i = 1 To nb_colonne 'Liste des sections
            ComboBox_Section.AddItem Worksheets("Sections-Auditeurs-Machines").Cells(1, i)
        Next
        no_lignes = 0
    End Sub
    Private Sub ComboBox_Section_Change()
        'Zone de liste vidée (sinon les valeurs s'ajoutent)
        ComboBox_Auditeur.Clear
        ComboBox_Poste.Clear
     
        Dim no_section As Integer, nom_auditeur As Integer, no_poste As Integer
     
        'Numéro de la sélection "section" (ListIndex commence à 0)
        no_section = ComboBox_Section.ListIndex + 1
        'Nom des auditeurs de la colonne section choisie
        nom_auditeur = Worksheets("Sections-Auditeurs-Machines").Cells(1, no_section).End(4).Row
        'Nombre de lignes poste de la colonne section choisie
        no_poste = Worksheets("Sections-Auditeurs-Machines").Cells(7, no_section).End(xlDown).Row
        For i = 2 To nom_auditeur
            ComboBox_Auditeur.AddItem Worksheets("Sections-Auditeurs-Machines").Cells(i, no_section)
        Next
        For i = 7 To no_poste
            ComboBox_Poste.AddItem Worksheets("Sections-Auditeurs-Machines").Cells(i, no_section)
        Next
    End Sub
    Private Sub CdB_Valider1_Click()
    Dim i As Integer
    'Contrôle du nom opérateur
        For i = 1 To Len(TextBox_Operateur.Value)
            If IsNumeric(Mid(TextBox_Operateur.Value, i, 1)) Then
                MsgBox "Nom opérateur incorrect"
                TextBox_Operateur.Value = ""
                Exit Sub
            End If
        Next i
     
        Application.ScreenUpdating = False
     
    'Activation de la feuille de recueil
    With Worksheets("Recueil données")
        .Activate
     
        'Détermine la première ligne vierge sous le tableau
        no_lignes = Range("A" & Rows.Count).End(xlUp).Row + 1
     
        'Copier la dernière ligne pour formater le remplissage
        With Rows(no_lignes)
            .FillDown
        End With
     
        'Remplir les cellules avec les valeurs des ComboBox et TextBox
        Cells(no_lignes, 1) = Lbl_Date_Formulaire.Caption
        Cells(no_lignes, 2) = ComboBox_Section.Value
        Cells(no_lignes, 3) = ComboBox_Auditeur.Value
        Cells(no_lignes, 4) = ComboBox_Poste.Value
        Cells(no_lignes, 5) = TextBox_Operateur.Value
     
        'Ouvrir le questionnaire suivant
        Questionnaire1_Sécu.Show
     
        'Fermer l'USF Formulaire
        Unload Me
     
    End With
     
    End Sub
    Private Sub CdB_Date_Click()
        Calendrier.Show
    '    Me.Lbl_Date_Formulaire.Caption = Format(Dat, "dd/mm/yyyy")
     
    Select Case Application.International(xlDateOrder)
        '0 = mois-jour-année
        '1 = jour-mois-année
        '2 = année-mois-jour
        Case 0
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "mm/dd/yyyy")
        Case 1
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "dd/mm/yyyy")
        Case 2
            Me.Lbl_Date_Formulaire.Caption = Format(Dat, "yyyy/mm/dd")
    End Select
     
    End Sub
    Private Sub CdB_Annuler1_Click()
        delete_form ("Formulaire")
        MsgBox "Etes-vous sûre de vouloir arrêter?", vbYesNo + vbQuestion
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode = vbFormControlMenu Then Cancel = True
    End Sub
    Private Sub TextBox_Operateur_keyPress(ByVal keyAscii As MSForms.ReturnInteger) 'Force les MAJUSCULSES
        keyAscii = Asc(UCase(Chr(keyAscii)))
    End Sub
    Quelqu'un aurait une idée sur mon problème?

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    Ha la joie et la rigolade des date avec excel
    bon essayes ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(1,1)=CDate(Format(CStr(textbox1.value), "dd/mm/yyyy"))

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingenieur Securite
    Inscrit en
    Mai 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingenieur Securite
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 97
    Par défaut Bingo!!!
    Merci Daranc,

    Ta solution est bonne


    Pour ceux qui voudrait connaitre la solution

    Ancien code de la lgine 66
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(no_lignes, 1) = Lbl_Date_Formulaire.Caption
    Remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(no_lignes, 1) = CDate(Format(CStr(Lbl_Date_Formulaire.Caption), "dd/mm/yyyy"))
    Problème résolu

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Si tu remplaçais "dd/mm/yyyy" par "Short date", tu obtiendrais automatiquement le format de date adapté à la configuration
    linguistique régionale de Windows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(no_lignes, 1) = CDate(Format(Lbl_Date_Formulaire.Caption, "Short date"))
    CDate seul te donnerait également le format de date adapté à la configuration
    linguistique régionale de Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(no_lignes, 1) = CDate(Lbl_Date_Formulaire.Caption)

  5. #5
    Membre Expert

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    CDate seul te donnerait également le format de date adapté à la configuration
    linguistique régionale de Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(no_lignes, 1) = CDate(Lbl_Date_Formulaire.Caption)
    là j'ai essayer plusieurs fois le Cdate et j'ai souvent eu le 12/08/2012 en lieu et place du 08/12/2012 ça marche nikel pour 13/08/2012 mais dès que le quantième est inférieur ou égal à 12 j'ai 1 fois sur deux une inversion dans la date entre le mois et le jour. d'où la "bidouille" pour contraindre Excel au format lu

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Contrairement à la feuille Excel qui interprète les entrées de date en tenant compte des paramètres linguistiques régionaux, VBA ne tient pas compte des paramètres régionaux quand il recoit une date au format String (format Texte) et qu'il l'inscrit dans une cellule. Il utilise par défaut le format de date américain ("mm/dd/yy") quand c'est possible, c'est-à-dire quand la valeur mm (qui correspond au mois) est entre 1 et 12.
    Par contre, si la date string commence par un mois supérieur à 12, exemple 22/08/2013, ou 2013/08/22, il sait que le mois ne peut pas être 22 ou 2013; il tente alors d'interpréter la date en prenant comme mois la seconde valeur (ici 08 ).

    Par contre la fonction CDate dans VBA transforme correctement la valeur string en date en tenant compte du paramètre Date Courte des paramètres régionaux. Si le paramètre Date Courte est "jj/mm/aaaa", la valeur string "11/08/2013" envoyée à une cellule par CDate sera le 11 août 2013 alors que si on n'utilise pas CDate ou une variable Date, VBA enverra comme date le 8 novembre 2013.
    CDate ne fait pas d'erreur car il n'utilise pas comme VBA le format de date américain.

  7. #7
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut conversion de date
    Bonjour,

    Découvert récemment. Il semble que l'emploi de value2 en lieu et place de value résoudrait le problème soulevé (inversion jour et mois) pour les versions postérieures à 1997 et inférieures à 2007.

    Quelqu'un peut-il confirmer ? avec ma version 2010, je ne peux vérifier

    Cordialement

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    La propriété Value2 d'une cellule donne le numéro de série de la date contenue dans cette cellule.
    Ca donne l'équivalent de CLng(LaCellule.Value).
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  9. #9
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par nibledispo Voir le message
    Bonjour,

    Découvert récemment. Il semble que l'emploi de value2 en lieu et place de value résoudrait le problème soulevé (inversion jour et mois) pour les versions postérieures à 1997 et inférieures à 2007.

    Quelqu'un peut-il confirmer ? avec ma version 2010, je ne peux vérifier

    Cordialement
    Il faut simplement typer correctement la valeur en VBA pour éviter les problèmes liés aux paramètres régionaux.

    Voir dans le fichier ci-joint la démonstration des erreurs obtenues si on ne type pas les dates ou les valeurs numériques.
    Fichiers attachés Fichiers attachés

  10. #10
    Membre Expert

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    Au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    With Sheets(1)
    For t = 1 To 9
    '--------------------
    If t = 6 Then
    Controls("textbox" & t).Value = CDate(.Cells(Lg, t).Value)
    Else
    '===================
    Controls("textbox" & t).Value = .Cells(Lg, t).Value
    '====================
    End If
    '------------------------------
    Next
    je rajoute un test dans la boucle de lecture
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If SorTie = True Then
    For t = 1 To 9
    pose(t) = Controls("textbox" & t).Value
    If pose(6) <> "" Then pose(6) = CDate(TextBox6.Value)
    Next
    je rajoute un test dans la boucle de sortie
    à l'origine le truc c'était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pose(6)=CDate(Format(CStr(textbox6.value), "dd/mm/yyyy"))
    ce qui revient au même

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

Discussions similaires

  1. Conversion de date
    Par jdu dans le forum Access
    Réponses: 2
    Dernier message: 26/01/2005, 16h17
  2. Conversion de dates
    Par Gogoye dans le forum Modules
    Réponses: 5
    Dernier message: 10/08/2004, 11h39
  3. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  4. 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
  5. Conversion de date et division 64 bits
    Par dway dans le forum Assembleur
    Réponses: 38
    Dernier message: 27/01/2004, 10h31

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