OVH Cloud OVH Cloud

Access 97

22 réponses
Avatar
Marc
Bonjour,

J'ai une série de champs contenant comme données les chaines de caractères
suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3 nouveaux
champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc

10 réponses

1 2 3
Avatar
Anor
Salut,

3stone wrote:
|
| Une existait ici : http://memoaccess.free.fr/strings.htm#fInStrRev
|
| Et "moilneu" avait donné la sienne...
|

ce qu'il y a de bien c'est que même quand je ne suis pas là,
j'ai quelques serviteurs qui font ma pub gratos ;-)))

remarque, c'est aussi facile de se souvenir des fonctions
qu'il y a sur memoaccess que de se souvenir de nos 21 doigts ;-)

Bonne nuit les gars, avec de beaux rêves indélébiles mais pas tachés ;-))))

--
Arnaud
--------------------------------------------------
Conseils d'utilisation : http://users.skynet.be/mpfa/
Site Perso : http://memoaccess.free.fr
/Réponses souhaitées sur ce forum, merci/
--------------------------------------------------
Avatar
Raymond [mvp]
Bonjour Jessy.
il y a une faille dans la fonction.
si on recherche AA dans un texte contenant AAA sur la droite, la position
trouvée est erronée.
il faut remplacer InStr(lngFind + Len(Rechercher)... par InStr(lngFind +
1......
ce qui a pour conséquence un allongement des temps d'exécution mais une
suppression du risque d'erreur.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum
Avatar
Jessy Sempere [MVP]
Ah... ;-)))
Tu sais bien que je n'ai pas internet petit coquin, j'attends la collecte
de Raymond qui va me payer ça...

Par contre c'est marrant Arnaud et moi on a appelé nos fonction
de la même façon... ;-))) (ok on est pas allé le chercher loin... ;-)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"3stone" a écrit dans le message news:

Salut Jessy,

"Jessy Sempere [MVP]"
Tiens je veux bien que tu m'envois ça pour voir... ;-))
vu que je suis fidèle à Access 97



Une existait ici : http://memoaccess.free.fr/strings.htm#fInStrRev

Et "moilneu" avait donné la sienne...



Public Function gfn_RechApresCar(sVal As String, sRech As String) As
String

'//----o----o----o---Procedure header
sample---o----o----o----o----o----o--

'// Procedure gfn_RechApresCar
'// Par : moilneu
'// Date : 21/07/2001 19:31:50
'//
'// Objet : Retourne la valeur contenu dans une chaine située
'// après un caractère déterminer.
'// Pour sVal = 'AA-BB-CC', Retourne 'CC' si sRech = '-'
'//
'// ENTRE <-
'// sVal : Chaine ou la recherche doit être faite.
'// sRech : Caractère à rechercher.
'//
'// SORT ->
'// Le resultat, ou une chaine vide si le caratère rechercher
'// n'as pas été trouver dans la chaine.
'//

'//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--



Dim iPos As Integer '// Position en cours de la recherche.
Dim iMem As Integer '// Mémorisation de la position en cours.
Dim iLongVal As Integer '// Compteur pour la boucle.
Dim sRet As String '// Valeur renvoyer.

iPos = 1
For iLongVal = 1 To Len(sVal)
iPos = InStr(iPos, sVal, sRech)
If iPos = 0 Then
If (iMem <> 0) Then '// Extraire la chaine située après sRech.
sRet = Right(sVal, Len(sVal) - iMem)
End If
Exit For
Else
iMem = iPos '// Mémorise la position en cours.
iPos = iPos + 1
End If
Next iLongVal

gfn_RechApresCar = sRet '// Retourne le resultat.

End Function





Si après cela y a pas le choix ;-)))


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------







Avatar
Jessy Sempere [MVP]
Salut Raymond

Bien vu....
Par contre faudrait refaire les test, il y a des chances du coup que la
tienne
soit plus rapide, je vais voir si tu n'as pas le temps...

Je me demande comment Arnaud a procéder pour sa fonction ??

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Raymond [mvp]" a écrit dans le message news:

Bonjour Jessy.
il y a une faille dans la fonction.
si on recherche AA dans un texte contenant AAA sur la droite, la position
trouvée est erronée.
il faut remplacer InStr(lngFind + Len(Rechercher)... par InStr(lngFind +
1......
ce qui a pour conséquence un allongement des temps d'exécution mais une
suppression du risque d'erreur.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum




Avatar
Raymond [mvp]
Bonjour jessy.
Ce n'est pas la peine de tester , ça n'a pas d'impact même avec un
processeur lent. à réfléchir, le 1 étant plus rapide que le len(...), sur
quelques tours il n'y a a aucune différence. C'est très bien comme ça.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message de
news:carftg$sra$
Salut Raymond

Bien vu....
Par contre faudrait refaire les test, il y a des chances du coup que la
tienne
soit plus rapide, je vais voir si tu n'as pas le temps...

Je me demande comment Arnaud a procéder pour sa fonction ??


Avatar
Jessy Sempere [MVP]
Trop tard... ;-)))

Test effectué :
Fonction bouclé 50 000 fois
Zone de recherche 20 caractères

résultat en milliseconds
Nombre caractère recherché Raymond Jessy
1 4950
4680
2 4950
4680
3 4980
4770
caractère "" 4990 4685

Donc effectivement, rien de fulgurant... ;-)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Raymond [mvp]" a écrit dans le message news:
#
Bonjour jessy.
Ce n'est pas la peine de tester , ça n'a pas d'impact même avec un
processeur lent. à réfléchir, le 1 étant plus rapide que le len(...), sur
quelques tours il n'y a a aucune différence. C'est très bien comme ça.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message
de

news:carftg$sra$
Salut Raymond

Bien vu....
Par contre faudrait refaire les test, il y a des chances du coup que la
tienne
soit plus rapide, je vais voir si tu n'as pas le temps...

Je me demande comment Arnaud a procéder pour sa fonction ??






Avatar
Raymond [mvp]
Ce genre de résultat me donne toujours une notion de l'infini . 50000
boucles pour quelques millisecondes !

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message de
news:carhr0$tqv$
Trop tard... ;-)))

Test effectué :
Fonction bouclé 50 000 fois
Zone de recherche 20 caractères

résultat en milliseconds
Nombre caractère recherché Raymond Jessy
1 4950
4680
2 4950
4680
3 4980
4770
caractère "" 4990 4685

Donc effectivement, rien de fulgurant... ;-)


Avatar
Jessy Sempere [MVP]
En fait c'était 20000 boucles, je me suis trompé... ;-)

Voilà la fonction utilisé pour le teste :

Appelé de la façon suivante par exemple :
Debug.Print "Jessy", fTime("fInStrRev('bbbabbbbababbabb', 'a')", 20000)
Debug.Print "Raymond", fTime("InStrRevRS('bbbabbbbababbabb', 'a')", 20000)

*******************************************
Function fTime(strFunction As String, Optional lngX As Long = 1) As Long
'** Fonction permettant de tester le temps
'** d'exécution d'une fonction

Dim sngStart As Single
Dim sngEnd As Single
Dim i As Long

sngStart = Timer
For i = 1 To lngX
Eval (strFunction)
Next
sngEnd = Timer
fTime = (sngEnd * 1000) - (sngStart * 1000)
End Function
*******************************************

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Raymond [mvp]" a écrit dans le message news:

Ce genre de résultat me donne toujours une notion de l'infini . 50000
boucles pour quelques millisecondes !

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message
de

news:carhr0$tqv$
Trop tard... ;-)))

Test effectué :
Fonction bouclé 50 000 fois
Zone de recherche 20 caractères

résultat en milliseconds
Nombre caractère recherché Raymond Jessy
1 4950
4680
2 4950
4680
3 4980
4770
caractère "" 4990
4685



Donc effectivement, rien de fulgurant... ;-)






Avatar
Anor
Salut Jessy

Jessy Sempere [MVP] wrote:
| Ah... ;-)))
| Tu sais bien que je n'ai pas internet petit coquin, j'attends la
| collecte de Raymond qui va me payer ça...
|
| Par contre c'est marrant Arnaud et moi on a appelé nos fonction
| de la même façon... ;-))) (ok on est pas allé le chercher loin... ;-)
|
| @+
| Jessy Sempere - Access MVP


Voici la mienne ... efin celle de snack de mémoire, je crois ;-))
Public Function fInStrRev(ByVal sIn As String, _
sFind As String, _
Optional nStart As Long = 1, _
Optional bCompare As Long = vbBinaryCompare) _
As Long

Dim nPos As Long

sIn = fStrReverse(sIn)
sFind = fStrReverse(sFind)
nPos = InStr(nStart, sIn, sFind, bCompare)

If nPos = 0 Then
fInStrRev = 0
Else
fInStrRev = Len(sIn) - nPos - Len(sFind) + 2
End If
End Function
à+-- Arnaud--------------------------------------------------Conseils d'utilisation :
http://users.skynet.be/mpfa/ Site Perso : http://memoaccess.free.fr /Réponses
souhaitées sur ce forum, merci/--------------------------------------------------
Avatar
Raymond [mvp]
bonsoir Arnaud.

d'où vient fStrReverse ?

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Anor" <http://memoaccess.free.fr/anor/email.htm> a écrit dans le message de
news:uoz%
Salut Jessy
Voici la mienne ... efin celle de snack de mémoire, je crois ;-))
Public Function fInStrRev(ByVal sIn As String, _
sFind As String, _
Optional nStart As Long = 1, _
Optional bCompare As Long = vbBinaryCompare) _
As Long

Dim nPos As Long

sIn = fStrReverse(sIn)
sFind = fStrReverse(sFind)
nPos = InStr(nStart, sIn, sFind, bCompare)

If nPos = 0 Then
fInStrRev = 0
Else
fInStrRev = Len(sIn) - nPos - Len(sFind) + 2
End If
End Function


1 2 3