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

OpenOffice & LibreOffice Discussion :

Isoler une partie d'une chaine de caractères [OpenOffice][Tableur]


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut Isoler une partie d'une chaine de caractères
    Bonjour

    Logiciel libre: Open Office Calc

    J' ai une cellule contenant la chaine de caractère "Valeur estimée : 279,99 €"
    Et je veux isoler uniquement la partie "279,99" en transformant la virgule "," en point"."

    J'ai essayé avec la fonction STXT mais celle ci n'est pas adaptée dans la mesure ou le nombre de caractère dans le prix peut changer
    ex: 19,99 € ou 2,99 € ou 4279,99 € ....

    Pouvez vous m'aider?

    Cordialement

  2. #2
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    Salut,

    En prenant comme hypothèse que la donnée est en A1 et que le point est le séparateur par défaut.
    Il suffit de saisir =STXT(A1;CHERCHE(":";A1)+1;NBCAR(A1)-CHERCHE(":";A1)-2)*1.

    Cdlt.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  3. #3
    Membre habitué
    Homme Profil pro
    sans emploi
    Inscrit en
    Février 2014
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 365
    Points : 131
    Points
    131
    Par défaut
    Merci beaucoup Zoom61

    J'ai encore besoin de tes lumières s il te plait

    Ok ça marche sans le «*1»:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =STXT(a1;CHERCHE(":";a1)+1;NBCAR(a1)-CHERCHE(":";a1)-2)
    Mais comment faire pour remplacer la virgule «,» par un point «.» et faire en sorte que le format soit un nombre
    J'ai essayé avec CNUM mais j'ai une message Err :502 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CNUM(STXT(a1;CHERCHE(":";a1)+1;NBCAR(a1)-CHERCHE(":";a1)-2))

  4. #4
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 612
    Points
    58 612
    Billets dans le blog
    11
    Par défaut
    La formule va ressembler à quelque chose comme cela :
    =REMPLACER(STXT(A1;CHERCHE(":";A1)+1;NBCAR(A1)-CHERCHE(":";A1)-2);CHERCHE(",";STXT(A1;CHERCHE(":";A1)+1;NBCAR(A1)-CHERCHE(":";A1)-2));1;".").

    Cdlt.
    N'oubliez pas le Tag afin de faciliter la recherche, et en votant cela permet de mieux la cibler.

    Je ne réponds pas aux messages privés s'ils sont liés à une question technique

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    avec la macro fonction basic FREGEXPMIDSTR d'onidarbe qui se trouve ici on arrive à simplifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CNUM(SUBSTITUE(FREGEXPMIDSTR(A1;".+: ";"€");",";"."))
    En gros :
    1 - on utilise la fonction macro basic FREGEXPMIDSTR pour extraire la chaine qui se trouve entre deux expressions régulières.
    2 - on utilise la fonction SUBSTITUE pour remplacer dans la chaîne extraite la virgule par le point ( bizarre chez moi c'est l'inverse que je dois faire la virgule étant le séparateur et pas le . dans mon calc).
    3 - on utilise CNUM pour convertir en nombre.

    Ami calmant J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    une autre possibilité :
    utiliser une macro en langage python et l'appeler en passant par un pont macro basic. Cela ouvre de grandes possibilités.
    1 - Définir un module basic où il y a les fonctions qui permettent de relier le basic au python :
    Module PythonBridge
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    REM  *****  BASIC  MODULE PYTHON BRIDGE *****
    REM Keep a global reference to the ScriptProvider, since this stuff may be called many times: 
    Global g_MasterScriptProvider as Object
    REM Specify location of Python script, providing cell functions: 
    Const URL_Main as String = "vnd.sun.star.script:" 
    Const URL_Args as String = "?language=Python&location=user" 
     
     
    ' Converts python multidimensional arrays to basic arrays.
    function convPy2Basic(pyvalue)
        if isarray(pyvalue) then
            dim lastRow as integer 
            lastRow = ubound(pyvalue)
            if lastRow = -1 then
                ' empty array
                convPy2Basic = ""
            else
                if isarray(pyvalue(0)) then
                    ' Multi-dimensional array
                    dim maxCols as integer, lastCol as integer
                    maxCols = ubound(pyvalue(0))
     
                    dim res(lastRow, maxCols)
                    for rowIndex = 0 to lastRow
                        lastCol = ubound(pyvalue(rowIndex))
     
                        ' Expand array if needed.
                        if lastCol > maxCols then
                            maxCols = lastCol
                            redim preserve res(lastRow, maxCols)
                        end if
     
                        for colIndex = 0 to lastCol
                            res(rowIndex, colIndex) = pyvalue(rowIndex)(colIndex)
                        next colIndex
                    next rowIndex
     
                    convPy2Basic = res
                else
                    ' Single-dimensional array - this is supported by libreoffice
                    convPy2Basic = pyvalue
                end if
            end if
        else
            convPy2Basic = pyvalue
        end if
    end function
     
    Function invokeScriptFunc(file AS String, lang, ext, func As String, args As Array, outIdxs As Array, outArgs As Array)
       sURL = URL_Main & file & "." & ext & "$" & func & "?language=" & lang & "&location=user" 
       oMSP = getMasterScriptProvider()
       oScript = oMSP.getScript(sURL)
       invokeScriptFunc = oScript.invoke(args, outIdxs, outArgs)
    end Function
     
    Function invokePyFunc(file AS String, func As String, args As Array, outIdxs As Array, outArgs As Array)
       res = invokeScriptFunc(file, "Python", "py", func, args, outIdxs, outArgs)
       invokePyFunc = convPy2Basic(res)
    end Function
     
    Function getMasterScriptProvider() 
       if isNull(g_MasterScriptProvider) then 
          oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory") 
          g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("") 
       endif 
       getMasterScriptProvider = g_MasterScriptProvider
    End Function
     
    REM Nom du fichier (.py) où se trouvent les fonctions en python
    const filename = "pythonFunctions"
     
    Function pyFunc(func as String, args as Array)
        pyFunc = invokePyFunc(filename, func, args, Array(), Array())
    End Function
     
    REM Les fonctions utilisables dans les formules Calc 
    Function ExtractEuro(cellule)
        ExtractEuro =  pyFunc("extracteuro",Array(cellule))
    End Function
    le fichier pythonFunctions.py qui doit se trouver au bon endroit (par exemple sous windows :
    en C:\Users\<nom du user>\AppData\Roaming\LibreOffice\4\user\Scripts\python\pythonFunctions.py) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
    def extracteuro(cellule):
        match = re.search(r'.+:(.+) €', cellule)
        if not match: 
            return -1
        str = match.group(1)
        str = str.replace(",",".")
        return float(str)
    et pour alors l'utiliser en formule dans calc :
    Vous allez me dire c'est un peu l'usine à gaz mais cela permet de réaliser des fonctions complexes plus lisibles qu'avec que des fonctions formules.

    Ami calmant J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2013, 15h57
  2. [RegEx] Retourner une array sur une partie de la chaine
    Par absurdsystem dans le forum Langage
    Réponses: 2
    Dernier message: 25/04/2010, 16h03
  3. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  4. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39
  5. Réponses: 3
    Dernier message: 21/06/2005, 16h18

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