Convertir un texte en nombre

Bonjour,

J'aimerais convertir le contenu des cellules d'une colonne "temps passé" écrit en texte sous forme numérique

Illustration :

Tel que c'est actuellement :

temps passé

9m.17s.

1h.47m.42s.

50s.

Tel que je voudrais que ça soit présenté :

temps passé

557

6462

50

Bien à vous,

Camille

Bonjour Camille,

2 propositions au choix utilisant VBA (code à coller dans une module standard de l'éditeur VBA, accessible via ALT + F11) :

1. Code à exécuter manuellement (possibilité de l'associer à un bouton) :

Sub ConvertirDurées()

Dim Plage As Range, Tablo() As String, i As Integer, Resultat As Single

Set Plage = Application.InputBox("Sélectionner la plage à convertir.", Type:=8)
For Each Cellule In Plage 'Parcourir les cellules
    Resultat = 0
    Tablo = Split(Cellule, ".") 'Séparer le texte en fonction des points
    For i = LBound(Tablo) To UBound(Tablo) 'Parcourir les éléments séparés
        If Right(Tablo(i), 1) = "h" Then Resultat = Resultat + CSng(Replace(Tablo(i), "h", "")) * 60 * 60 'Multiplier les heures par 3600
        If Right(Tablo(i), 1) = "m" Then Resultat = Resultat + CSng(Replace(Tablo(i), "m", "")) * 60 'Ajoute les minutes, multipliées par 60
        If Right(Tablo(i), 1) = "s" Then Resultat = Resultat + CSng(Replace(Tablo(i), "s", "")) 'Ajoute les secondes
    Next i
    Cellule.Offset(0, 1).Value = Resultat 'Renvoie le résultat en colonne de droite de la plage convertie
Next

End Sub

2. Fonction personnalisée, utilisable directement depuis une cellule Excel une fois le code ajouté :

Public Function ConvertirDurées(Texte As String) As Single

Dim Tablo() As String, i As Integer, Resultat As Single
Tablo = Split(Texte, ".")
For i = LBound(Tablo) To UBound(Tablo)
    If Right(Tablo(i), 1) = "h" Then Resultat = Resultat + CSng(Replace(Tablo(i), "h", "")) * 60 * 60
    If Right(Tablo(i), 1) = "m" Then Resultat = Resultat + CSng(Replace(Tablo(i), "m", "")) * 60
    If Right(Tablo(i), 1) = "s" Then Resultat = Resultat + CSng(Replace(Tablo(i), "s", ""))
Next i
ConvertirDurées = Resultat

End Function

Le fichier est ensuite à enregistrer au format ".xlsm"

14camille91.xlsm (16.21 Ko)

Bonjour Camille, bonjour le forum,

Le code ci-dessous renvoie les valeurs dans la colonne B. À adapter... :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim C As Integer 'déclare la variable C (Calcul)

Set O = Worksheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne A (à adapter) de l'onglet O
TV = O.Range("A1:A" & DL) 'définit la tableau des valeurs TV (colonne à adapter)
For I = 1 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeur TV
    For J = 0 To UBound(Split(TV(I, 1), ".")) 'boucle 2 : sur tous les points (.) contenus dans la valeur de la boucle
        Select Case Right(Split(TV(I, 1), ".")(J), 1) 'agit en fonction de la lettre avant le point
            Case "h" 'cas h
                C = C + CInt(Split(Split(TV(I, 1), ".")(J), "h")(0)) * 3600 'définit le calcul
            Case "m" 'cas m
                C = C + CInt(Split(Split(TV(I, 1), ".")(J), "m")(0)) * 60 'définit le calcul
            Case "s" 'cas S
                C = C + CInt(Split(Split(TV(I, 1), ".")(J), "s")(0)) 'définit le calcul
        End Select 'fin de l'action en fonction de la lettre avant le point
    Next J 'prochain point de la boucle 2
    TV(I, 1) = C 'redéfinit la valeur ligne I colonne 1 du tableau des valeurs TV
    C = 0 'remet à zéro le calcul C
Next I 'prochaine ligne de la boucle 1
O.Range("B1").Resize(UBound(TV, 1), 1).Value = TV 'renvoie dans la colonne B le tableau des valeurs TV (colonne à adapter)
End Sub

[Édition]

Trop rapide ce Pedro (que je salue au passage). Je demande un contrôle anti dopage...

Bonjour,

Dans le même principe :

Function Secondes(Chaine As String) As Long

    Dim T
    Dim Result As Long

    T = Split(Chaine, ".")

    Select Case UBound(T)

        Case 3: Result = Val(T(0)) * 3600 + Val(T(1)) * 60 + Val(T(2))
        Case 2: Result = Val(T(0)) * 60 + Val(T(1))
        Case 1: Result = Val(T(0))

    End Select

    Secondes = Result

 End Function

qu'il est possible d'utiliser de cette façon :

Sub Test()

    Dim Chaine As String

    Chaine = "1h.47m.42s."

    MsgBox Secondes(Chaine)

End Sub

ou encore dans une cellule :=Secondes(A1)

où ici A1 contient 1h.47m.42s.

Et dans le cas des jours :

Function Secondes(Chaine As String) As Long

    Dim T
    Dim Result As Long

    T = Split(Chaine, ".")

    Select Case UBound(T)

        Case 4: Result = Val(T(1)) * 86400 + Val(T(1)) * 3600 + Val(T(2)) * 60 + Val(T(3))
        Case 3: Result = Val(T(0)) * 3600 + Val(T(1)) * 60 + Val(T(2))
        Case 2: Result = Val(T(0)) * 60 + Val(T(1))
        Case 1: Result = Val(T(0))

    End Select

    Secondes = Result

 End Function

avec une chaîne du genre : "2j.1h.47m.42s."

Un grand merci à vous !

Pedro22, j'ai utilisé ta macro, elle fonctionne parfaitement. Merci tu as résolu mon problème... Et quelle réactivité !!

Rechercher des sujets similaires à "convertir texte nombre"