Poser votre question
0

Créer une fonction de tri basée sur le texte d'une cellule

posée 2019-04-02 13:06:44 +0200

Image Gravatar de XavierB

Bonjour

J'ai actuellement besoin de créer une fonction perso LIBELLE(celluleX) afin de trier des infos textes.

Les cellules sont issues de relevés bancaires, tels :

"COM INTERVENTION…", "CHEQUE 000…", "PRLV SEPA URSAFF…", "FRAIS…"

Après m'être intéressé à une formule dans une cellule, je me rend compte (sauf erreur) que ce n'est pas assez poussé pour parvenir à un tri efficace. Exemple :

=IF(EXACT( REGEX(D3;"(.+)?(ESSO|PEAGE|STATION)(.+)";"dep";1); "dep"); "Deplacements" ; "-" )

Je voudrais donc créer une fonction comme ceci, que j'intègrerais dans la cellule de mon choix : =LIBELLE(D3)

Function libelle(C)
    if C.test (VIR|CHEQUE) retourne "paiement client"
    else if C.test (PEAGE|STATION) retourne "déplacement"
    else if C.test (FRAIS|ARRETE) retourne "frais bancaires"
    else C.test (URSAFF) retourne "impots"
End Function

Seulement, je n'ai pas trouvé le moyen de travailler avec des Regex sur le contenu de la cellule. Je découvre juste le Basic, et suis bien plus à l'aise avec du Javascript. Je n'ai que des "BASIC runtime error. Object variable not set". Exemple :

Function libelle(C)
    R = C.createSearchDescriptor
    R.SearchRegularExpression = True
    R.SearchString = "(VIR|CHEQUE)"
    found = C.FindFirst(R)
    libelleType = found.String
End Function

Bref, votre aide sera la bienvenue. Merci d'avance

Xavier.

éditer requalifier signaler fermer fusionner supprimer

1 Réponse

0

répondue 2019-04-03 01:05:26 +0200

Image Gravatar de XavierB

Finalement j'ai trouvé une solution via deux macros. La première crée une expression régulière et la deuxième renseigne les informations à traiter et à retourner. Ainsi, dans ma cellule, j'applique la formule :

LType(D4)

Ainsi en fonction du libellé, j'obtiens

LType("ARRETE DE CPTE 4 EME TRIMESTRE… ") => "banque"
LType("RESTAURANT LIBRE OFFICE…") => "réception"

Etc.

' Traitement des Regex

Function LTypeFind(Str,Reg,Typ) 
    Dim T As String
    oSearch         = CreateUnoService("com.sun.star.util.TextSearch")
    o               = CreateUnoStruct("com.sun.star.util.SearchOptions")
    o.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
    o.searchString  = Reg
    oSearch.setOptions(o)
    oFound          = oSearch.searchForward( Str, 0, Len(Str) )
    If oFound.subRegExpressions=0 then
        LTypeFind   = 0
        Exit Function

    Else 
        T = Typ
        If Typ="single" then
            nStart  = oFound.startOffset()
            nEnd    = oFound.endOffset()
            T       = Mid(Str, nStart(0) + 1, nEnd(0) - nStart(0) )
        End If
    End If
    LTypeFind = T
End Function

Et la Formule à appeler dans une cellule. Suffisamment explicite pour être modifiée à souhait et pratique, car un changement s'applique dorénavant à toutes les cellules.

Function LType(cell)

    'Fast
    If IsEmpty(cell) then
        LType = "-"
        Exit Function
    End If

    Dim T As String

    'CLIENT
    T = LTypeFind( Cell, "(EVI|REM)", "entrée")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'DEPLACEMENT
    T = LTypeFind( Cell, "(ESSO|GARAGE|PEAGE|SNCF|STATION)", "déplacement")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'RECEPTION
    T = LTypeFind( Cell, "(EPICERIE|MAR(CHE|KET)|RESTAU|SUPERET)", "réception")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'PRESSE
    T = LTypeFind( Cell, "(CULTURA|PHOTO|PRESSE)", "presse")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'BANQUE
    T = LTypeFind( Cell, "(ARRETE|COM INTERVENTION|FRAIS)", "banque")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'MATERIAUX
    T = LTypeFind( Cell, "(BRICO|DEPOT)", "matériel")
    If T<>0 then
        LType = T
        Exit Function
    End If

    'IMPOTS
    T = LTypeFind( Cell, "(DIRECTION GENE|URSSAF)", "impôts")
    If T<>0 then
        LType = T
        Exit Function
    End If


    'AUTRES DEPENSES (single)
    T = LTypeFind( Cell, "(CHEQUE|ENGIE|GROUPAMA|LOCAUX|O2SWITCH|PHIE|RET|VIR)", "single")
    If T<>0 then
        LType = Switch( T="CHEQUE","chèque",T="ENGIE","électricité",T="GROUPAMA","assurance",T="LOCAUX","loyer",T="O2SWITCH","web",T="PHIE","sante",T="RET","retrait",T="VIR","virement" )
        Exit Function
    End If

    'DEFAULT
    LType = "-"
End Function
éditer signaler supprimer permalien plus
S'identifier/S'inscrire pour répondre

Outils de question

1 follower

Stats

Posée: 2019-04-02 13:06:44 +0200

Consultée: 17 fois

Mise à jour: Apr 03