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 :

Encore les dates


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut Encore les dates
    Bonjour,

    J'ai cherché dans les nombreux posts sur le sujet (surement mal) et lu les différents tutos mais je n'ai pas trouvé de réponse à ma question. Je vous la soumets donc.

    Je lis un fichier texte que je charge dans Excel. Ce fichier contient des dates mais celles ci sont gérées différemment par Excel: on dirait qu'Excel n'en considère que certaines comme des dates.

    Voici mon code et le résulat en fichier joint.
    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
    'Lit un fichier de données de revision et alimente un tableau de données
    'Paramètres : - nom complet du fichier
    '           : - le tableau à alimenter
    Function Lecture_fich_revision(ByVal nomFichierComplet As String, ByRef tableau() As Variant) As Boolean
     
        Dim intFic As Integer, i As Integer
        Dim strligne As String, codeCompte As String
        Dim signe As Integer
     
        Lecture_fich_revision = False
     
        intFic = FreeFile
     
        'Ouverture fichier
        On Error Resume Next
        Open nomFichierComplet For Input As intFic
        If Err.Number <> 0 Then
            MsgBox "Erreur lors de l'ouverture du fichier " & nomFichierComplet & vbCrLf & Err.Description
            Err.Clear
            Exit Function
        End If
        On Error GoTo 0
     
        'Lecture fichier
        i = 1
        While Not EOF(intFic)
     
            Line Input #intFic, strligne
            codeCompte = Trim(Mid(strligne, 12, 13))
     
            'Filtre sur les comptes 6 et 7
            If (Left(codeCompte, 1) = "6" Or Left(codeCompte, 1) = "7") Then
                ReDim Preserve tableau(1 To 10, 1 To i)
                tableau(1, i) = CLng(Trim(Mid(strligne, 1, 11)))                                                            'n° de ligne
                tableau(2, i) = codeCompte                                                                                  'code compte
                tableau(3, i) = Trim(Mid(strligne, 25, 44))                                                                 'libellé compte
                tableau(4, i) = CByte(Trim(Mid(strligne, 69, 2)))                                                           'jour
                tableau(5, i) = CByte(Trim(Mid(strligne, 80, 2)))                                                           'mois
                tableau(6, i) = CInt(Trim(Mid(strligne, 89, 4)))                                                            'année
                tableau(7, i) = Trim(Mid(strligne, 93, 35))                                                                 'libellé ecriture
                tableau(8, i) = DateSerial(Trim(Mid(strligne, 134, 4)), Trim(Mid(strligne, 131, 2)), Trim(Mid(strligne, 128, 2)))           'date debut MAL GEREE
                tableau(9, i) = DateSerial(Trim(Mid(strligne, 164, 4)), Trim(Mid(strligne, 161, 2)), Trim(Mid(strligne, 158, 2)))           'date fin MAL GEREE
                signe = -2 * CInt(Trim(Mid(strligne, 198, 1))) + 1                                                          'signe montant
                tableau(10, i) = signe * CDbl(Trim(Mid(strligne, 199, 20)))                                                 'montant
                i = i + 1
            End If
     
        Wend
     
        'Fermeture fichier
        On Error Resume Next
        Close intFic
        If Err.Number <> 0 Then
            MsgBox "Erreur lors de la fermeture du fichier " & nomFichierComplet & vbCrLf & Err.Description
            Err.Clear
            Exit Function
        End If
        On Error GoTo 0
     
        Lecture_fich_revision = True
     
    End Function
     
    Sub Remplit_feuille_data(ByVal nomComplFich As String)
     
        Dim data() As Variant
        Dim n As Long, m As Long
     
        'Si la lecture a échoué on sort
        If (Not Lecture_fich_revision(nomComplFich, data)) Then Exit Sub
     
        'Sinon on alimente la feuille données et on la met en forme
        n = UBound(data, 2)
        m = UBound(data, 1)
        With ThisWorkbook.Worksheets("DONNEES")
            .Range(.Cells(2, 1), .Cells(.Rows.Count, .Columns.Count)).ClearContents
            .Range(.Cells(2, 1), .Cells(.Rows.Count, .Columns.Count)).ClearFormats
            .Range(.Cells(2, m - 2), .Cells(n + 1, m - 1)).NumberFormat = "m/d/yyyy"
            .Range(.Cells(2, m + 1), .Cells(n + 1, m + 1)).NumberFormat = "m/d/yyyy"
            .Range(.Cells(2, 1), .Cells(n + 1, m)).Value = Application.Transpose(data)
            .Range(.Cells(2, m + 1), .Cells(n + 1, m + 1)).FormulaR1C1 = "=DATEVALUE(RC[-7]&""/""&RC[-6]&""/""&RC[-5])"
            .Range(.Cells(2, m + 2), .Cells(n + 1, m + 2)).FormulaR1C1 = "=RC[-3]-RC[-4]+1"
            .Range(.Cells(2, m + 3), .Cells(n + 1, m + 3)).FormulaR1C1 = "=IF(RC[-7]<YEAR(FinPeriode),"""",IF(RC[-2]>FinPeriode,""CAP"",""CCA""))"
            .Range(.Cells(2, m + 4), .Cells(n + 1, m + 4)).FormulaR1C1 = "=MAX(MIN(FinPeriode,RC[-5])+1-RC[-6],0)"
            .Range(.Cells(2, m + 5), .Cells(n + 1, m + 5)).FormulaR1C1 = "=MAX(RC[-6]-MAX(RC[-7],FinPeriode),0)"
            .Range(.Cells(2, m + 6), .Cells(n + 1, m + 6)).FormulaR1C1 = "=ROUND(IF(RC[-3]=""CAP"",RC[-6]/RC[-4]*RC[-2],IF(RC[-3]=""CCA"",-RC[-6]/RC[-4]*RC[-1],0)),2)"
            .Range(.Cells(2, m + 7), .Cells(n + 1, m + 7)).FormulaR1C1 = "=IF(LEFT(RC[-15],1)=""6"",RC[-4],IF(LEFT(RC[-15],1)=""7"",IF(RC[-4]=""CAP"",""PCA"",IF(RC[-4]=""CCA"",""PCA"","""")),""""))"
            .Calculate
            .Columns.AutoFit
        End With
     
    End Sub
    J'ai mis en rouge des certaines cellules problématiques pour l'exemple.

    Merci d'avance à tous. En cette fin de semaine, je fatigue un peu, donc la réponse est surement évidente (sauf que je ne la trouve pas)
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Je ne comprends pas trop le code; il y a une fonction et une macro avec toutes deux des paramètres. Quelle est la macro initiale ? Sinon, on voit que les dates non reconnues ont des jours supérieurs à 12 (c'est à dire qu'Excel attend un numéro de mois (un grand classique de VBA). Le format de cellule est d'ailleurs "mm/jj/aaaa".

  3. #3
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Merci Daniel C,

    C'est bien une histoire de format.
    Les deux endroits où je gère les dates:
    La lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tableau(8, i) = DateSerial(Trim(Mid(strligne, 134, 4)), Trim(Mid(strligne, 131, 2)), Trim(Mid(strligne, 128, 2)))           'date debut MAL GEREE
                tableau(9, i) = DateSerial(Trim(Mid(strligne, 164, 4)), Trim(Mid(strligne, 161, 2)), Trim(Mid(strligne, 158, 2)))
    Le format:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(.Cells(2, m - 2), .Cells(n + 1, m - 1)).NumberFormat = "m/d/yyyy"
            .Range(.Cells(2, m + 1), .Cells(n + 1, m + 1)).NumberFormat = "m/d/yyyy"
    Pour avoir le format jj/mm/annee c'est bien "m/d/yyyy" non?

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Pour avoir le format jj/mm/annee c'est bien "m/d/yyyy" non?
    Oui, en théorie, si le format de la date en lecture est "jj/mm/aaaa". Mais est-ce que c'est le cas ? Le mieux serait de mettre en PJ un bout du fichier csv.

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Oups. Pour le format "j/m/aaaa" dans Excel, mets :

    ActiveCell.NumberFormat = "d/m/yyyy"

  6. #6
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    J'ai essayé plusieurs formats mais impossible de faire interpréter la date correctement à Excel.

    Si je lui mets par exemple le format "dd/mm/yyyy", les cellules de la colonne sont au bon format (Date: jj/mm/aaaa) mais tous les dates dont le n° de jour est > 12 ne sont pas interprétées. Comme si Excel cherchait une date au format anglo saxon.
    Par contre si je rentre dans la cellule et que je double clique, le format s'applique.

    Je ne vois pas trop ce qui pèche (j'ai même vérifié les paramètres régionaux de date)

  7. #7
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Daniel,

    En pièce joint la feuille avec le code simplifié (j'ai enlevé tous les formats les formules et j'ai utilisé le CDate).

    J'ai toujours le même problème => VB interprète les dates à l'anglo-saxonne et si on rajoute le format, on est obligé de rentrer dans la cellule pour valider le format.
    Pour lancer c'est la procédure "test" avec le fichier "Exemple.txt" posté plus haut dans le même répertoire que le classeur.

    Merci si tu peux tester.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Tu as dû te tromper de fichier, c'est un fichier sans code.

  9. #9
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Désolé Daniel, voici le bon fichier.
    Fichiers attachés Fichiers attachés

  10. #10
    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,

    Le problème vient du fait de mettre une date dans un variant.
    C'aurait été moi, j'aurais laissé le tableau en Strings et j'aurais bouclé sur ce tableau pour remplir la feuille en castant chacune des valeurs dans son bon type.
    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!

  11. #11
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Citation Envoyé par issoram
    Didier, avec la méthode OpenText ça passe.
    Pourquoi ne pas utiliser cette méthode dès le départ, tu peux à partir de l'interface feuille faire déjà plein de manips, ne pas prendre en compte certaines colonnes, créer des séparations supplémentaires ou en éliminer, imposer un format de colonne etc..., il suffit de regarder l'aide dans Excel feuille (très riche) , de faire ta manip à l’enregistreur et de récupérer le code.

    Suivant que ta manip est répétitive sur de fichiers à structure fixe ou non, tu adaptes.
    Ensuite en regardant l'aide VBA tu verras comment VBA utilise des tableaux de tableaux. En analysant, tu te rendras compte que les numéros de colonnes dont ils parlent sont en fait des positions dans un string.
    Bref depuis le temps que tu es dessus,, ça irait peut-être plus vite, et serait plus fiable, de reconstruire ta finalité à partir de là.

    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier

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

Discussions similaires

  1. encore les dates
    Par mikepers dans le forum Général VBA
    Réponses: 5
    Dernier message: 18/11/2014, 20h46
  2. Encore les dates...
    Par Mat26_ dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/02/2013, 19h01
  3. [SQL] encore les dates
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/12/2007, 14h54
  4. [VBA-E]Encore une question sur csv et les dates
    Par vovor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/10/2006, 10h43
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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