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"
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é !!