Extraction de caractères cellule

Bonjour, je souhaiterais extraire (pour calcul a postériori) le temps passé dans chaque zone d'intensité (i...) où (') représente les minutes et (") les secondes dans une chaîne de caractères de ce type :

5'i1 + 5'i2 + 3'i3 + 1'i4 + 30"i5 + 2 x (10 x (30" i5 + 30" i2)) + 10'i2

Au final j'aimerais obtenir le temps passé à i1, i2, i3, etc tout en tenant compte de facteurs multiplicateurs si cela est possible

J'ai déjà essayé avec les fonction STXT et CHERCHE mais je n'y parviens pas...

Merci

Maxime

Bonjour et bienvenue sur le forum

Tu devrais joindre un fichier en montrant, sur quelques exemples, ce que tu souhaites obtenir.

Bye !

Bonjour,

une solution via une fonction personnalisée, à mettre dans un nouveau module, la fonction fait l'hypothèse que l'équation ne contient que des variables nommées i1 à i5

Function totali(r, ix)
    eq = Replace(r.Value, """", "")
    eq = Replace(eq, " x ", "*")
    eq = Replace(eq, "'", "*60")
    For i = 1 To 5
        tr = "i" & i
        If tr <> ix Then eq = Replace(eq, tr, "*0") Else eq = Replace(eq, tr, "*1")
    Next i
    s = Application.Evaluate("=" & eq)
    m = s \ 60
    s = s - m * 60
    totali = m & "'" & IIf(s > 0, s & """", "") & ix
End Function

dans la feuille excel, utiliser la fonction totali comme ceci

=totali(r,ix) ou r est la référence de la cellule contenant l'équation et ix est la variable pour laquelle il faut faire la somme.

exemple

=totali(A1,"i2")

7maxime.xlsm (14.14 Ko)

Bonjour,

Je livre aussi une fonction personnalisée (pas eu le temps encore de regarder celle fournie par h2so4, mais je vais m'y pencher)

Function REDUIREEXPRESSION(fm As String) As String
    Dim exac, exm, m, v, po%, pf%, i%, j%
    Application.Volatile
    exac = fm
    For i = 1 To Len(exac)
        Select Case Mid(exac, i, 1)
            Case "+": If po <> pf Then Mid(exac, i, 1) = "@"
            Case "(": po = po + 1
            Case ")": pf = pf + 1
        End Select
    Next i
    exac = Split(exac, "+")
    For i = 0 To UBound(exac)
        exac(i) = Replace(exac(i), " ", "")
        If InStr(exac(i), "x") Then
            exm = Split(exac(i), "x")
            For j = 0 To UBound(exm)
                exm(j) = Replace(Replace(exm(j), "(", ""), ")", "")
                If IsNumeric(exm(j)) Then
                    m = IIf(m <> "", CInt(exm(j)) * m, CInt(exm(j)))
                    exm(j) = ""
                End If
            Next j
            exm = Trim(Join(exm))
            If InStr(exm, "@") Then
                exm = Split(exm, "@")
                For j = 0 To UBound(exm)
                    v = InStr(exm(j), Chr(39)) - 1
                    If v < 0 Then v = InStr(exm(j), Chr(34)) - 1
                    If v > 0 Then exm(j) = CInt(Left(exm(j), v)) * m & Right(exm(j), _
                     Len(exm(j)) - v)
                Next j
                exm = Join(exm, "+")
            Else
                v = InStr(exm, Chr(39)) - 1
                If v < 0 Then v = InStr(exm, Chr(34)) - 1
                If v > 0 Then exm = CInt(Left(exm, v)) * m & Right(exm, Len(exm) - v)
            End If
            exac(i) = exm: m = ""
        End If
        v = InStr(exac(i), Chr(39))
        If v > 0 Then exac(i) = CInt(Left(exac(i), v - 1)) * 60 & Chr(34) & Right(exac(i), _
         Len(exac(i)) - v)
    Next i
    exac = Split(Join(exac, "+"), "+")
    For i = 0 To UBound(exac) - 1
        If exac(i) <> "" Then
            exm = Split(exac(i), Chr(34))(1): v = Val(exac(i))
            For j = i + 1 To UBound(exac)
                If exac(j) <> "" Then
                    If InStr(exac(j), exm) Then
                        v = v + Val(exac(j))
                        exac(j) = ""
                    End If
                End If
            Next j
            exac(i) = v & Chr(34) & exm
        End If
    Next i
    exac = Join(exac, "+")
    Do While InStr(exac, "++")
        exac = Replace(exac, "++", "+")
    Loop
    If exac Like "*+" Then exac = Left(exac, Len(exac) - 1)
    exac = Split(exac, "+")
    For i = 0 To UBound(exac)
        exm = Split(exac(i), Chr(34))(1): v = Val(exac(i))
        If v Mod 60 = 0 Then exac(i) = v \ 60 & Chr(39) & exm
    Next i
    REDUIREEXPRESSION = Join(exac, " + ")
End Function

En ce qui concerne la fonction ci-dessus, elle ne répondra sans doute pas à tous les cas de figure... J'ai présupposé que les parenthèses n'étaient mises qu'à bon escient, que l'on utilisait soit ' soit " mais pas les deux en même temps que les opérations n'étaient que des + et x, et que l'on n'utilisait que des nombres entiers.

Moyennant quoi, cette fonction renvoie sur l'exemple indiqué le résultat suivant :

5'i1 + 25'i2 + 3'i3 + 1'i4 + 630"i5

Cordialement.

Merci beaucoup pour votre aide.

En effet j'ai oublié de préciser le cas de figure où serait renseignées pour une même intensité secondes et minutes (ex : 2'30"i5)

Je regarde ce que vous m'avez envoyé et je reviens vers vous

Merci encore

Merci à vous deux pour ces solutions apportées,

Serait-il possible d'obtenir comme résultat le temps passé en format horaire (sans l'indication i1, i2, etc) ainsi que la possibilité de renseigner une durée d'intensité composée de seconde (") et minutes (') et enfin d'obtenir cette durée dans une cellule pour chaque intensité de i1 à i7 ?

Merci d'avance

Maxime

proposition initiale adaptée

Function totali(r, ix)
    eq = Replace(r.Value, """", "")
    eq = Replace(eq, " x ", "*")
    eq = Replace(eq, "'", "*60")
    For i = 1 To 7
        tr = "i" & i
        If tr <> ix Then eq = Replace(eq, tr, "*0") Else eq = Replace(eq, tr, "*1")
    Next i
    s = Application.Evaluate(eq)
    m = s \ 60
    s = s - m * 60
    totali = m & "'" & IIf(s > 0, s & """", "")
End Function
3maxime.xlsm (14.30 Ko)

Merci une nouvelle fois pour cette proposition,

Pouvez-vous seulement m'indiquer la marche à suivre afin d'afficher les résultats sous le format horaire (hh:mm:ss) car ces données sont amenées à subir des opérations

Merci bcp

Edit: je m'excuse d'avoir mal formulé mon précédant message, dsl

bonsoir,

proposition adaptée

Function totali(r, ix)
    eq = Replace(r.Value, """", "")
    eq = Replace(eq, " x ", "*")
    eq = Replace(eq, "'", "*60")
    For i = 1 To 7
        tr = "i" & i
        If tr <> ix Then eq = Replace(eq, tr, "*0") Else eq = Replace(eq, tr, "*1")
    Next i
    s = Application.Evaluate(eq)
    totali = s / 24 / 3600
End Function
4maxime.xlsm (14.35 Ko)

Parfait, merci beaucoup pour votre précieuse aide

Maxime

Bonjour, je viens de me rendre compte que la formule ne fonctionne pas lorsque la syntaxe de la durée d'une intensité et écrite avec minutes (') et secondes (") (ex : 3'30"i2) mais je ne parviens pas à solutionner ce "problème"

Merci

bonjour

pourquoi ne pas simplement remplacer 3'30" par 210" ou 3,5' ?

Bonjour, merci pour votre réponse

Le problème est que ce fichier va être lu par d'autres personnes avant de réaliser leur entraînement et il serait plus simple pour eux d'avoir directement le temps affiché en mm'ss" plutôt que de devoir faire la conversion

alex25 a écrit :

Bonjour, merci pour votre réponse

Le problème est que ce fichier va être lu par d'autres personnes avant de réaliser leur entraînement et il serait plus simple pour eux d'avoir directement le temps affiché en mm'ss" plutôt que de devoir faire la conversion

bonjour,

voici un code adapté

Function totali(r, ix)
    eq = r.Value
    i = 1
    Do
        c = Mid(eq, i, 1)
        If c Like "#" Then
            If m = "" Then mpi = p: p = i
            m = m & c
        ElseIf c = "'" Then
            mi = m * 60
            m = ""
        ElseIf c = """" Then
            m = mi + m
            If mpi <> 0 Then p = mpi
            If p > 1 Then neq = Left(eq, p - 1) Else neq = ""
            eq = neq & m & "$" & Mid(eq, i + 1)
            i = InStr(p, eq, "$")
        Else
            m = ""
            p = 0
            mi = 0
            mpi = 0
        End If
        i = i + 1
    Loop Until i > Len(eq)
    eq = Replace(eq, "$", "")
    eq = Replace(eq, """", "")
    eq = Replace(eq, " x ", "*")
    eq = Replace(eq, "'", "*60")
    For i = 1 To 7
        tr = "i" & i
        If tr <> ix Then eq = Replace(eq, tr, "*0") Else eq = Replace(eq, tr, "*1")
    Next i
    s = Application.Evaluate(eq)
    totali = s / 24 / 3600
End Function

Merci beaucoup c'est parfait !!

Rechercher des sujets similaires à "extraction caracteres"