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 :

Problème de conversion de type de données


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut Problème de conversion de type de données
    Bonjour.

    Je dois traiter vià Excel une exportation de données issues d'une application non-Microsoft. L'énorme majorité de mon taf se déroule sans encombre mais j'achoppe sur le point suivant :

    A partir d'une plage de cellules, je fais de la conversion de chaîne en VBA (de "14 January 2007", je remplace le " January " par "/01/", puis je fais mavaleur=cdate(mavaleur) ), mais impossible de rendre la conversion effective. C'est d'ailleurs un problème que j'avais déjà rencontré avec des extractions Access.

    Malgré le CDate, ma valeur n'est pas reconnue comme date et lorsque j'effectue une opération (du type maVar = now - madate) je n'obtiens qu'une erreur '13' : incompatibilité de type.
    Le seul moyen que j'aie trouvé est d'entrer dans la cellule (par double-clic ou en pressant F2), puis de faire Entrée, et là seulement ma valeur (ici "14/01/2007) est bien reconnue comme date.

    Avez-vous déjà rencontré ce problème ? Et surtout, comment l'avez-vous contourné ?? D'avance, merci !

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    chez moi ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    debug.Print cdate(replace("14 january 2007"," january ","/01/"))-date()

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut


    Chez moi ça marche aussi quand je note tout directement dans la cellule, mais à la suite de mon extraction ça plante quand même sur certaines cellules, je ne sais pas pourquoi...

    Tiens, voici un petit extrait de mon fichier source; essaie avec les données de la colonne I et j'attends ton avis !

    Et mon code de traitement, des fois que mon erreur vienne de ma gestion de conversion...
    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
     
    ' Définir la plage à bosser, ici la colonne I par exemple
    ' Formatage des dates
    For Each cell In maplage.Cells
            cell.NumberFormat = "dd/mm/yyyy;@"                              ' Reformatage
        If Not IsEmpty(cell.Value) Then                                     ' Si la cellule n'est pas vide
            madate = cell.Value
            madate = Trim(madate)                                           ' Nettoyage d'éventuels espaces excédentaires
            madate = Replace(madate, " Jan ", "/01/")                       ' Table de correspondance entre les
            madate = Replace(madate, " Feb ", "/02/")                       '   mois abrégés US -> numéro de mois
            madate = Replace(madate, " Mar ", "/03/")
            madate = Replace(madate, " Apr ", "/04/")
            madate = Replace(madate, " May ", "/05/")
            madate = Replace(madate, " Jun ", "/06/")
            madate = Replace(madate, " Jul ", "/07/")
            madate = Replace(madate, " Aug ", "/08/")
            madate = Replace(madate, " Sep ", "/09/")
            madate = Replace(madate, " Oct ", "/10/")
            madate = Replace(madate, " Nov ", "/11/")
            madate = Replace(madate, " Dec ", "/12/")
            madate = Replace(madate, "January ", "01/01/")                  ' Table de correspondance entre les
            madate = Replace(madate, "February ", "01/02/")                 '   mois complets US -> numéro de mois
            madate = Replace(madate, "March ", "01/03/")
            madate = Replace(madate, "April ", "01/04/")
            madate = Replace(madate, "May ", "01/05/")
            madate = Replace(madate, "June ", "01/06/")
            madate = Replace(madate, "July ", "01/07/")
            madate = Replace(madate, "August ", "01/08/")
            madate = Replace(madate, "September ", "01/09/")
            madate = Replace(madate, "October ", "01/10/")
            madate = Replace(madate, "November ", "01/11/")
            madate = Replace(madate, "December ", "01/12/")
            madate = CDate(madate)         ' conversion du résultat au format Date préféré
            If IsDate(madate) = True Then madate = Format(madate, "dd/mm/yyyy;@", vbMonday)
            cell.Formula = madate
        Else
            ' on ignore le contenu
        End If
    Next cell
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    il manque certains esapces entre " et nomdemois

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Autant pour moi : j'ai 2 types de dates à convertir, l'un du type "14 jan 2007" et l'autre "November 2007", donc c'est parfaitement normal.

    Mais si tu as eu l'opportunité de jeter un oeil à la PJ, tu remarqueras que certaines dates sont alignées à droite des cellules (celles qui sont OK) et que d'autres sont alignées à gauche des cellules, et ce sont celles-ci qui me posent problème.

    Et d'ailleurs, c'est d'utant plus visible par une maip simple : un sélectionnes un paquet de cellles contenant les2 types, et tu fais Format de Cellule > onglet Nombre > Format:Standard, et ça passe les cellules d'un format jj/mm/aaaa vers un format numérique. Mais celles qui me posent problème ne changent pas...

  6. #6
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Le format de la cellule est de type texte. Ce qui fait que tu as une Chaîne (String) qui ne sera pas reconnu comme étant une date (qui est un type numérique). Tu devras la faire transiter par un variant pour être reconnue comme une date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ChangerEnDate()
        Dim v As Variant
        v = Feuil1.Range("A1").Value
        Feuil1.Range("A1").Value = v
        Feuil1.Range("A1").NumberFormat = "yyyy/m/d"
    End Sub

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Merci Zaza !!
    Ca m'a tout l'air d'être la solution, le temps de dormir un peu et je teste ça avec plaisir !!

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    C'est bon !!

    Voici le résultat final (ou pas loin) :
    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
    Dim madate As Variant
    Dim vdate As Variant
     
    ' Plages de dates à formater
    monarray = Array(ActiveWorkbook.Sheets("Demands").Range("I2:L" & dernLigneD), _
            ActiveWorkbook.Sheets("Demands").Range("Z2:AH" & dernLigneD), _
            ActiveWorkbook.Sheets("Projects").Range("L2:M" & dernLigneP), _
            ActiveWorkbook.Sheets("Projects").Range("O2:X" & dernLigneP), _
            ActiveWorkbook.Sheets("Projects").Range("AC2:AK" & dernLigneP))
     
    For i = 0 To UBound(monarray)                                           ' Pour chaque élément de l'array
     
    Set maplage = monarray(i)                                               ' Déclaration de la valeur
     
    ' Formatage des dates
    For Each cell In maplage.Cells
        If Len(cell.Value) > 0 Then                                   ' Si la cellule n'est pas vide
            vdate = cell.Value
    '        If IsDate(vdate) = False Then
                vdate = Trim(vdate)                                           ' Nettoyage d'éventuels espaces excédentaires
                vdate = Replace(vdate, " Jan ", "/01/")                       ' Table de correspondance entre les
                vdate = Replace(vdate, " Feb ", "/02/")                       '   mois abrégés US -> numéro de mois
                vdate = Replace(vdate, " Mar ", "/03/")
                vdate = Replace(vdate, " Apr ", "/04/")
                vdate = Replace(vdate, " May ", "/05/")
                vdate = Replace(vdate, " Jun ", "/06/")
                vdate = Replace(vdate, " Jul ", "/07/")
                vdate = Replace(vdate, " Aug ", "/08/")
                vdate = Replace(vdate, " Sep ", "/09/")
                vdate = Replace(vdate, " Oct ", "/10/")
                vdate = Replace(vdate, " Nov ", "/11/")
                vdate = Replace(vdate, " Dec ", "/12/")
                vdate = Replace(vdate, "January ", "01/01/")                  ' Table de correspondance entre les
                vdate = Replace(vdate, "February ", "01/02/")                 '   mois complets US -> numéro de mois
                vdate = Replace(vdate, "March ", "01/03/")
                vdate = Replace(vdate, "April ", "01/04/")
                vdate = Replace(vdate, "May ", "01/05/")
                vdate = Replace(vdate, "June ", "01/06/")
                vdate = Replace(vdate, "July ", "01/07/")
                vdate = Replace(vdate, "August ", "01/08/")
                vdate = Replace(vdate, "September ", "01/09/")
                vdate = Replace(vdate, "October ", "01/10/")
                vdate = Replace(vdate, "November ", "01/11/")
                vdate = Replace(vdate, "December ", "01/12/")
                madate = CDate(vdate)         ' conversion du résultat au format Date préféré
     
                cell.Value = madate
    '        End If
            madate = Format(madate, "dd/mm/yyyy;@", vbMonday)
    '        cell.Value = madate
        Else
            ' on ignore le contenu
        End If
    Next cell
     
    Next i
    D'ailleurs y'a encore du remaniement dans l'air, mes 2 variables étant des Variant. Il doit bien y avoir d'autres types de données plus légers à employer...

    Mais, big up Zazaraignée !

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

Discussions similaires

  1. [C# 2.0] Problème de conversion de type
    Par freerider1 dans le forum Windows Forms
    Réponses: 18
    Dernier message: 11/08/2017, 13h50
  2. Conversion de type de données d'un champ dans un recordset DAO.
    Par heavenvibes dans le forum VBA Access
    Réponses: 9
    Dernier message: 01/03/2007, 12h21
  3. [WD10] Problème de conversion de type
    Par rphenix dans le forum WinDev
    Réponses: 2
    Dernier message: 15/01/2007, 14h22
  4. Pb de conversion de type de données
    Par keiserjo dans le forum Excel
    Réponses: 4
    Dernier message: 25/07/2006, 14h39
  5. [Excel] Problème de conversion de type de données
    Par keiserjo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/07/2006, 12h26

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