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 :

Convertir temps formaté spécialement


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 21
    Points
    21
    Par défaut Convertir temps formaté spécialement
    Bonjour,

    j'ai des valeurs de temps dans une colonne. Soit :
    - des minutes sous la forme "xx min" comme "10 min" ou "5 min"
    - des heures sous la forme "xxh" comme "1h"
    - des heures et minutes sous la forme "xxhxx" comme "1h40" ou "2h20"

    Comment puis-je faire pour que cela me donne (en reprenant l'ordre des exemples) "10", "5", "60", "100" et "140" ?

    Merci beaucoup d'avance !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    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 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
        Dim C As Range
        For Each C In Range([A1], Cells(Rows.Count, 1).End(xlUp))
            If Len(Application.Substitute(C.Value, " min", "")) <> Len(C.Value) Then
                C.Offset(, 1) = CInt(Application.Substitute(C.Value, " min", ""))
            Else
                tabl = Split(C.Value, "h")
                C.Offset(, 1) = CInt(tabl(0)) * 60 + CInt(tabl(1))
            End If
        Next C
    End Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup pour la réponse !
    Cela marche très bien, excepté pour les valeurs du second cas, de type "xh" comme "1h", où il renvoie une "erreur d'exécution 13" (incompatibilité de type). Mais si je change la valeur d'origine en "1h00", cela fonctionne bien, et je pourrais m'en accommoder.

    Par contre, je suis vraiment débutant et je ne sais pas comment faire si je veux que cela s'applique à une sélection, par exemple de I6 à I11 et de I14 à I15. J'ai essayé de chercher du côté des "références relatives mais je n'arrive pas à trouver.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    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 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Voici la macro modifiée pour les formats "xh". Il te suffit de sélectionner la ou les plages à traiter et de lancer la macro :

    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
    Sub test()
        Dim C As Range
        For Each C In Selection
            If Len(Application.Substitute(C.Value, " min", "")) <> Len(C.Value) Then
                C.Offset(, 1) = CInt(Application.Substitute(C.Value, " min", ""))
            Else
                tabl = Split(C.Value, "h")
                If tabl(1) = "" Then
                    C.Offset(, 1) = CInt(tabl(0)) * 60
                Else
                    C.Offset(, 1) = CInt(tabl(0)) * 60 + CInt(tabl(1))
                End If
            End If
        Next C
    End Sub

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Une petite fonction personnalisée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function TimeConvert(ByVal Str As String) As Long
     
    Str = Replace(Str, " ", "")
    Str = Replace(Str, "min", "")
    Str = Replace(Str, "h", "h0")
    Str = Replace(Str, "h", "*60+")
    TimeConvert = Evaluate(Str)
    End Function
    TimeConvert("1h40") donne 100

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    @Daniel.C -> Yeah, merci infiniment ! Ca marche super, me reste plus qu'à jouer avec les offsets pour faire atterrir les résultats là où je veux

    @mercatog -> Merci beaucoup pour la proposition, ça à l'air intéressant mais quel est l'avantage d'une fonction ? Est-ce plus performant et/ou plus simple à utiliser ?

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu peux utiliser la fonction à l'intérieur d'une Sub qui scrute toutes tes cellules (pour la lisibilité) ou bien tu peux carrément l'utiliser directement sur ta feuille (à la condition que la fonction soit écrite dans un module standard.

    Exemple d'appel de la fonction à l'intérieur d'une Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Traitement()
    Dim c As Range
     
    For Each c In Worksheets("Feuil4").Range("A1:A50")
        c.Offset(0, 5) = TimeConvert(c.Value)
    Next c
    End Sub
     
    Function TimeConvert(ByVal Str As String) As Long
     
    On Error Resume Next
    TimeConvert = Evaluate(Replace(Replace(Replace(Replace(LCase(Str), " ", ""), "min", ""), "h", "h0"), "h", "*60+"))
    End Function

Discussions similaires

  1. convertir un temps format unix en HH:MM:SS:MS
    Par selmani300 dans le forum Linux
    Réponses: 5
    Dernier message: 25/05/2009, 14h50
  2. Convertir des formats musicaux en langage C
    Par la_praline dans le forum C
    Réponses: 14
    Dernier message: 21/05/2007, 10h00
  3. convertir en format excel
    Par mapmip dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 22/03/2007, 14h10
  4. Réponses: 5
    Dernier message: 21/07/2006, 18h00
  5. [interim] Emplois a mi temps + formation
    Par Agité dans le forum Etudes
    Réponses: 23
    Dernier message: 28/11/2005, 13h35

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