Formule Access : renvoi une partie d'une chaîne depuis un caract

illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je souhaite savoir s'il existe une fonction dans Access pour récupérer un bout de texte à partir d'une chaîne de caratère.

Je m'explique par un exemple :
Je possède dans une colonne des données sous formes hiérarchiques séparés par des " > "

V1852 > D5547 > F8847 > DFFK > DELO8
V18582 > D5547 > F8I47 > DFFK > DELO8 > KKIDF

et ainsi de suite.

Je souhaite savoir si il y a une formule générique pour dire quelque chose comme :
"Donne-moi dans cette liste de caractère uniquement ce qu'il y a avant le 2 >"
Ou bien "Donne-moi dans cette liste de caractère uniquement ce qu'il y a après le nième >"
Je vous remercie par avance expert Access ?
PI : je boss via des requête
A voir également:

10 réponses

blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Salut,

pour cela, il faut soit jouer avec les fonctions de chaines classiques, mais ça peut être long, soit passer via des expressions régulières (ou rationnelles), voir ici.
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour le lien c'est vraiment très interresant, cependant je ne suis vraiment pas fortiche en VBA mm si j'essaye de mon mieux.

Existe t'il une formule (ou alors plusieurs fonctions de chaines classiques) pour réussir ma mission ??

Merci d'avance
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Pas de recette toute faite, tu vas devoir créer tes formules au besoin avec les fonctions 'standard' : mid, left, right, instr...
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci...
Alors j'ai une autre petite question et j'espere que pour cela il y a une formule :)

Si j'ai une deuxième colonne dans mon tableau avec des valeurs me permettant de dire sur quel signe ">" il faut supprimer la fin de l'enregistrement, y a t'il une formule ?

Exemple :

Colonne 1 Colonne 2
V1852 > D5547 > F8847 > DFFK > DELO8 I R8
V18582 > D5547 > F8I47 > DFFK > DELO8 > KKIDF I R4
V1852 > D5547 > F8847 > DFFK I R7

Donc dans mon exemple je souhaite dire :
Si colonne 2 = R8 alors supprime tout après le 3eme ">"
Si colonne 2 = R4 alors supprime tout après le 1er ">"
Si colonne 2 = R7 alors supprime tout apres le 2eme ">"
et ainsi de suite...

Je suis désolé 'd'insister' mais je suis vraiment en galère.

En tout cas un grand merci a BLUX qui a deja pris le temps de répondre 2 fois..
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci...

Cependant, j'ai une petite question qui peux peut être résoudre ma première interrogation.
Si je possède une seconde colonne avec des infos me permettant de dire avec exactitude quel est le signe à partir duquel je souhaite que ma chaine de caractère soit tronquer, existe-il une formule?

Exmple explicatif :

Colonne 1 Colonne 2

V1852 > D5547 > F8847 > DFFK > DELO8 V8
V18582 > D5547 > F8I47 > DFFK > DELO8 > KKIDF V4
V18582 > D5547 > F8I47 V2

L'expression a transformer en formule est donc :
Si colonne 2 = V8 alors supprime tous les caractères après le 1er signe ">"
Si colonne 2 = V4 alors supprime tous les caractères après le 3ème signe ">"
Si colonne 2 = V2 alors supprime tous les caractères après le 2ème signe ">"

J'espère avoir été suffisamment clair pour qu'une formule soit disponible pour résoudre mon problème...

En tout cas merci à tous et en particularité a BLUX qui a déjà répondu 2 fois..
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Si c'est un signe unique, facilement, si c'est le n-ième signe, pas facile de manière simple...
Il faudra peut-être écrire une fonction pour cela...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Fonction = code = je suis incapable et je le regrette fortement.

Par contre via des formules 'standard' cela semble possible.

Vous est il possible de m'indiquer quelle formule (et quel ordre) utiliser pour cela ? (bien entendu si cela ne vous dérange pas, sinon je reste comme ca :( )

Merci
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Fonction = code = je suis incapable et je le regrette fortement.
C'est pas forcément un problème.

Ce site est (aussi) fait pour ça, tu verras que la création d'une fonction codée en VBA (et utilisable dans une requête) n'est finalement pas si difficile.

Expose ton problème de manière précise et je te dirai comment on peut envisager les choses... Ton histoire à deux colonnes me semble appropriée.
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci énormement (je souhaite vraiment que cela ne soit pas un problème)

Il est difficle d'expliquer cela sans inserer de table mais je vais essayer d'etre le plus clair possible.

J'ai une table access avec 2 colonnes et je souhaite créer une 3ème colonne à partir des infos de la première et selon des conditions de la 2eme.

Les conditions de la colonne 2 permettre de savoir à partir de quelle position du signe ">" les infos doivent être supprimer (ou conserver en fonction du sens de la formule).

Exemple :

Colonne 1 (avec 3 lignes)
------------------------------------------------------------------------------------------------------------
V1852 > D5547 > F8847 > DFFK > DELO8
V18582 > D5547 > F8I47 > DFFK > DELO8 > KKIDF
V18582 > D5547 > F8I47

Colonne 2 (avec 3 lignes également)
------------------------------------------------------------------------------------------------------------
V8
V3
V2

Colonne 3 (avec 3 lignes : c'est le résultat attendu de ma formule)
------------------------------------------------------------------------------------------------------------
V1852 > D5547 > F8847
V18582 > D5547 > F8I47 > DFFK
V18582

------------------------------------------------------------------------------------------------------------
La formule que je souhaite avoir doit traduire les conditions en colonne 2 comme:
* Si en colonne 2 j'ai la valeur V8 alors supprime dans la colonne 1 (de la meme ligne bien entendu) ce qui se trouve après le 3ème signe ">"

* Si en colonne 2 j'ai la valeur V3 alors supprime dans la colonne 1 (de la meme ligne bien entendu) ce qui se trouve après le 3ème signe ">"

* Si en colonne 2 j'ai la valeur V2 alors supprime dans la colonne 1 (de la meme ligne bien entendu) ce qui se trouve après le 1er signe ">"

et ainsi de suite.

Merci d'avance (en esperant que mes explications sont compréhensible)
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Les explications sont claires, sauf que le "ainsi de suite" n'est pas compréhensible par un ordinateur.

Il faut donc que tu donnes toutes les valeurs possibles de ta deuxième colonne avec le traitement que doit subir la première colonne.

Parce que là, V8 et V3 ont le même comportement, donc il est important d'être exhaustif.

Mais je te rassure, rien d'impossible.
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

J'espere que vous allez bien.

La colonne 1 n'est pas fixe elle peux etre longue ou courte mais toujours écrite de la même maniere : sous ensemble 1 > sous ensemble 2 > sous ensemble 3 > ....
et la colonne 2 peux avoir des valeurs V1 à Vn.

Mon exemple permet d'obtenir une fonction. Ensuite j'essayerai de reprendre cette focntion et de la mettre en forme pour mes différents cas.

Je vous remercie.
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Quel comportement adopter en fonction de la valeur de n, puisqu'on a vu que 8 et 3 allaient vers la même chose...
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Je comprends votre question et je me rend compte que mon exemple porte à confusion.

En réalité j'ai pas n Version différentes mais uniquement les versions suivantes :
V4
V3
V2
V1
V-1
V-2
V-3
V-4
V-5

et je souhaite les résultats suivants :

1) si colonne 2 = V4 alors garde uniquement les valeurs présentes avant le 1er signe « > »
2) si colonne 2 = V3 alors garde uniquement les valeurs présentes avant le 2eme signe « > »
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 2ème signe « >)
3) si colonne 2 = V2 alors garde uniquement les valeurs présentes avant le 3eme signe « > »
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 3ème signe « >)
4) si colonne 2 = V1 alors garde uniquement les valeurs présentes avant le 4eme signe « > »
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 4ème signe « >)
5) si colonne 2 = V-1 alors garde uniquement les valeurs présentes avant le 5eme signe « > »
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 5ème signe « >)
6) si colonne 2 = V-2 alors garde uniquement les valeurs présentes avant le 6eme signe « > »
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 6ème signe « >)
7) si colonne 2 = V-4 alors garde uniquement les valeurs présentes avant le 2eme signe « > »7
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 7ème signe « >)
8) si colonne 2 = V-5 alors garde uniquement les valeurs présentes avant le 2eme signe « > »8
(La condition précédente reviens au même que de dire « supprimer tout ce qui se trouve après le 8ème signe « >)
Merci d'avance
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
On va commencer simple, tu vas créer une fonction que tu pourras appeler n'importe où dans ta base et que l'on enrichira au fur et à mesure.

Dans ta base, tu vas créer un nouvel objet de type 'module'.
Dans ce module, tu vas insérer les lignes de code suivantes :

Function COUPE(Val1 As String, Val2 As String) As String
COUPE = Left(Val1, 5)
End Function

Tu sauves ensuite ton module.
Ces lignes de code vont servir à récupérer des données en entrée de la procédure et elle vont (pour l'instant) se borner à afficher les 5 premiers caractères de la valeur que l'on va passer en premier argument.

Tu vas aussi créer une requête, dans laquelle tu vas appeler cette fonction en lui donnant deux paramètres (le deuxième ne sert pas pour l'instant).

Ca donnera un truc comme ça :

SELECT Tab1.Col1, Tab1.Col2, COUPE(Col1,Col2) AS Expr1
FROM Tab1;

Bien entendu, tu remplaces Tab1, Col1 et Col2 par les noms des objets de ta base.

A l'exécution, si tout se passe bien, tu devrais avoir d'affiché :

- le contenu de Col1
- le contenu de Col2
- les 5 premiers caractères de Col1

Et voilà, la fonction est créée, il va maintenant falloir lui mettre le code qui correspond à ce que l'on souhaite faire au final.

- lire le deuxième paramètre (appelé plus académiquement 'argument')
- en fonction de ce deuxième paramètre, trifouiller le contenu du premier argument

Je vois que plusieurs valeurs de la deuxième colonne arrivent au même résultat, cela va simplifier le code.
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour les infos.

Si j'ai bien compris en réalité la première fonction permet uniquement de dire à l'outil de supprimer ce qui se trouve après les 5 premiers caractères.
Maintenant, puisque les 2,3, ... couple de caractère suivants (entre les >) sont différents comment exprimer le fait de supprimer ce qui se trouve avant, ou après, le signe > ??

en attente de vous lire.

Merci
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
La fonction est volontairement simplifiée, elle ne supprime pas les données mais se contente d'afficher les 5 premiers caractères.
C'est pour introduire le concept de fonction. Pour l'instant, essaye de la faire fonctionner, nous aviserons plus tard pour la suite.
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
Sinon, en vrai, ça peut donner cela (selon tes indications, mais je vois qu'elles sont confuses : pas de V-3, par exemple) :

Function COUPE(Val1 As String, Val2 As String) As String 
Dim Pos1 As Integer 
Dim Pos2 As Integer 
Dim Pos3 As Integer 
Dim Pos4 As Integer 
Dim Pos5 As Integer 
Dim Pos6 As Integer 
COUPE = "" 
Select Case Val2 
    Case "V4" 
        ' On ne garde que la gauche du premier > 
        ' Recherche du premier > 
        Pos1 = InStr(1, Val1, ">") 
        ' Récup des caractères juste avant 
        If Pos1 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos1 - 1) 
        End If 
    Case "V3" 
        ' On ne garde que la gauche du deuxième > 
        ' Recherche du premier > 
        Pos1 = InStr(1, Val1, ">") 
        ' Recherche du deuxième > 
        Pos2 = InStr(Pos1 + 1, Val1, ">") 
        If Pos2 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos2 - 1) 
        End If 
    Case "V2" 
        ' On ne garde que la gauche du troisième > 
        Pos1 = InStr(1, Val1, ">") 
        Pos2 = InStr(Pos1 + 1, Val1, ">") 
        Pos3 = InStr(Pos2 + 1, Val1, ">") 
        If Pos3 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos3 - 1) 
        End If 
    Case "V1" 
        ' On ne garde que la gauche du quatrième > 
        Pos1 = InStr(1, Val1, ">") 
        Pos2 = InStr(Pos1 + 1, Val1, ">") 
        Pos3 = InStr(Pos2 + 1, Val1, ">") 
        Pos4 = InStr(Pos3 + 1, Val1, ">") 
        If Pos4 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos4 - 1) 
        End If 
    Case "V-4" 
        ' On ne garde que la gauche du cinquième > 
        Pos1 = InStr(1, Val1, ">") 
        Pos2 = InStr(Pos1 + 1, Val1, ">") 
        Pos3 = InStr(Pos2 + 1, Val1, ">") 
        Pos4 = InStr(Pos3 + 1, Val1, ">") 
        Pos5 = InStr(Pos4 + 1, Val1, ">") 
        If Pos5 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos5 - 1) 
        End If 
    Case "V-2" 
        ' On ne garde que la gauche du sixième > 
        Pos1 = InStr(1, Val1, ">") 
        Pos2 = InStr(Pos1 + 1, Val1, ">") 
        Pos3 = InStr(Pos2 + 1, Val1, ">") 
        Pos4 = InStr(Pos3 + 1, Val1, ">") 
        Pos5 = InStr(Pos4 + 1, Val1, ">") 
        Pos6 = InStr(Pos5 + 1, Val1, ">") 
        If Pos6 = 0 Then 
            COUPE = Val1 
        Else 
            COUPE = Left(Val1, Pos6 - 1) 
        End If 
    Case Else 
        COUPE = Val1 
End Select 
'COUPE = Left(Val1, 5) 
End Function 

Ca n'est certes, pas joli, mais ça fonctionne.
Si l'on voulait être efficace, on aurait développé une autre fonction que l'on appellerait pour trouver la position du n-ième >, mais ce n'est pas le propos...
0
illanou Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Vraiment mille merci vous etes excellent ! je vous dois bcp pour le coup... tks sire
0
blux Messages postés 27147 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 
La question est :
as-tu testé ? Avec succès ?

Sinon, c'est à modifier en fonction des vraies contraintes...
0