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 :

Fonction Replace et format de date [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 82
    Par défaut Fonction Replace et format de date
    Bonjour,

    J'ai une extraction au format csv d'une application sur laquelle je n'ai pas la main. A l'intérieur j'ai une colonne "date de début" qui contient des informations du style "Ouvert le: 28-01-2014 10:34". Je souhaite supprimer la chaine de caractères "Ouvert le: ", pour ne garde que la date et l'heure.

    tout se passe bien si je fais la manip avec un Control+H.

    Par contre si je ré-execute la macro que me génère excel, ca me transforme ma date en format américain et du coup ca inverse le mois et le jour

    Voici le code que j'execute en macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Columns("D:D").Select
        Selection.Replace What:="Ouvert le: ", Replacement:="", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _
            ReplaceFormat:=False
    j'ai essayé de rajouter ce bout code avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Selection.NumberFormat = "@"
        Application.FindFormat.NumberFormat = "@"
        Application.ReplaceFormat.NumberFormat = "@"
    Mais ca change rien.

    et si je change l'option ReplaceFormat par True, et bien ca remplace rien.

    Merci de votre aide

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 82
    Par défaut
    J'ai solutionné mon problème en faisant ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub texte()
        Dim i As Long, derlign As Long
        derlign = Range("D65000").End(xlUp).Row 'donne la dernière ligne non vide en colonne A
       For i = 1 To derlign
            Cells(i, 4) = Replace(Cells(i, 4).Value, "Ouvert le: ", "")
        Next i
    End Sub
    Par contre en utilisant la commande suivante (qui découpe ma colonne qui contient plusieurs date en faite), ca me retransforme encore les dates:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Columns("D:D").Select
            Selection.TextToColumns Destination:=Range("E1"), DataType:=xlFixedWidth, _
            FieldInfo:=Array(Array(0, 1), Array(16, 1), Array(18, 1), Array(34, 1), Array(36, 1)) _
            , TrailingMinusNumbers:=True

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 564
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Le nom de la procédure est bien choisi car on reste avec du texte dans la colonne D ce qui est peut être ennuyeux pour du traitement ultérieur.
    Si on désire des dates, on peut essayer la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TexteEnDate()
    Range("D1", Range("D1048576").End(xlUp)).Select
    For Each cel In Selection
    On Error Resume Next
    cel.Value = CDate(Replace(cel.Value, "Ouvert le: ", ""))
    Next cel
    End Sub
    Cordialement
    Claude

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 82
    Par défaut
    En fait les enregistrements dans la colonne D sont du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "Ouvert le: 18-04-2013 16:13 
    Ferme le: 22-04-2013 08:47 
    Duree totale: 2 Minute(s)"
    Ce qui m'interesse c'est d'extraite la date de début et la date de fin dans 2 colonnes. La durée étant fausse, elle n'a pas d'importance.

    Donc comment séparer en 2 ma colonne D?

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

    il y plein de façons d'y arriver, question de contexte exact....

    Ce qui se produit en inversion est logique si on se penche sur la façon dont excel et le vba traitent les dates :

    Comprendre et gérer les dates sous Excel et en VBA

    Le moyen sur de ne pas avoir de soucis est donc d'injecter dans ton excel feuille des numéros de série qui sont "inchangeables" et de le faire dans une colonne que tu auras préalablement formatée en date

    sur les divers moyens, je pense qu'un traitement direct (idéal en vitesse) comme tu as tenté est à oublier car on seras soumis aux "pouvoirs d’interprétation croisés VBA / feuille". Il faudra donc boucler sur la feuille (ou passer pas un array si très grande plage).
    Ensuite reste le choix selon le contexte, ça se résume à du traitement de chaînes et à des conversions genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub gogo()
        ActiveCell = CLng(CDate(Left(Replace(Range("D3"), "Ouvert le: ", ""), 10)))
    End Sub
    Pour une feuille comme l'image jointe, on a une date inversible en D3, la colonne F en format natif et la G en Date, on sélectionne F5, on exécute, G5 et on exécute..

    Image : Nom : OrmonthData-1.jpg
Affichages : 1006
Taille : 15,6 Ko

    Si tu veux récupérer les heures, il suffit d'adapter en toute logique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub gogo2()
    ActiveCell = CDec(CDate(Left(Replace(Range("D3"), "Ouvert le: ", ""), 16)))
     
    End Sub
    Sinon tu peux utiliser Split genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub gogo3()
    Dim tbo As Variant
     
    tbo = Split(ActiveCell, "-")
     
    End Sub
    et traiter les résultats obtenus pour reformater la date voulue etc., etc.

    cordialement,

    Didier

  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
    Bonjour maxvador


    Une solution:

    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
    Sub TexteEn2Colonnes()
    Derniere = Range("D" & Rows.Count).End(xlUp).Row
    Set r = Range(Range("D1"), Range("D" & Derniere))
    r.Select
    whatOuvert = "Ouvert le:"
    whatFermer = "Ferme le:"
    whatDuree = "Duree "
    For Each cel In r
     If InStr(cel, whatOuvert) Then
      cel.Offset(0, 1).Value = CDate(Trim(Replace(cel.Value, whatOuvert, "")))
     ElseIf InStr(cel, whatFermer) Then
      cel.Offset(0, 2).Value = CDate(Trim(Replace(cel.Value, whatFermer, "")))
     ElseIf InStr(cel, whatDuree) Then
      Else
      cel.Select
      MsgBox "Contenu inconnu"
     End If
    Next cel
    End Sub

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 82
    Par défaut
    Merci à vous 2 pour vos réponses.

    J'ai résolu mon problème avec ce bout de code:
    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
    Sub texte()
        Dim i As Long, derlign As Long
        Dim str As String
        derlign = Range("D65000").End(xlUp).Row 'donne la dernière ligne non vide en colonne A
        For i = 1 To derlign
            Cells(i, 4) = Replace(Cells(i, 4).Value, "Ouvert le: ", "")
            Cells(i, 4) = Replace(Cells(i, 4).Value, "Ferme le: ", "")
            str = Cells(i, 4)
            If Len(str) > 9 Then
                Cells(i, 5) = CLng(CDate(Left(str, 10)))
                If Len(str) > 20 Then
                    Cells(i, 6) = CLng(CDate(Right(Left(str, 34), 16)))
                End If
            End If
        Next i
    End Sub
    par contre je perds les heures derrière ma date.

    J'ai essayé ton code Docmarti et ca me fait une erreur 13 - Incompatibilité de type. Il ne peut pas convertir la chaine de caratère en Date car les caractères "Ferme le: " sont toujours présent dans la chaine

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

    par contre je perds les heures derrière ma date.
    tu as la réponse dans mon post précédent Clng te renvoie un Long, donc ne peut représenter un nombre à virgule, donc le tronque, hors les numéros de série des dates ont une structure à virgule, d'où utilisation de CDec

    cordialement,

    Didier

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 82
    Par défaut
    En effet tu m'avais déjà donné la solution
    j'ai relu plusieurs fois ton post, mais apparemment je suis aveugle

    Merci pour votre aide, je vais mettre en résolu ce sujet

  10. #10
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Et comme ceci. Ca fonctionne ?

    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
    Sub TexteEn2Colonnes()
    Derniere = Range("D" & Rows.Count).End(xlUp).Row
    Set r = Range(Range("D1"), Range("D" & Derniere))
    r.Select
    whatOuvert = "Ouvert le:"
    whatFermer = "Ferme le:"
    whatDuree = "Duree "
    For Each cel In r
     If InStr(cel, whatOuvert) Then
      valeur = Trim(Replace(cel.Value, whatOuvert, ""))
     
      If Not IsDate(valeur) Then
       cel.Select
       MsgBox "Pas une date valide", , valeur
      Else
       cel.Offset(0, 1).Value = CDate(valeur)
      End If
     
     ElseIf InStr(cel, whatFermer) Then
      valeur = Trim(Replace(cel.Value, whatFermer, ""))
     
      If Not IsDate(valeur) Then
        cel.Select
       MsgBox "Pas une date valide", , valeur
      Else
       cel.Offset(0, 1).Value = CDate(valeur)
      End If
     
     ElseIf InStr(cel, whatDuree) Then
      Else
      cel.Select
      MsgBox "Contenu inconnu"
     End If
     
    Next cel
    End Sub

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/12/2013, 17h01
  2. [WD15] format de date avec la fonction Saisie()
    Par Menadel dans le forum WinDev
    Réponses: 1
    Dernier message: 18/03/2013, 12h07
  3. Fonction pour contrôle de format de date
    Par veve4work dans le forum Développement
    Réponses: 5
    Dernier message: 07/03/2012, 12h04
  4. Réponses: 5
    Dernier message: 10/01/2008, 15h13
  5. Réponses: 3
    Dernier message: 06/05/2002, 18h24

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