Excel saisie de chaine de caractères
bibiman23
Messages postés
45
Statut
Membre
-
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je souhaite faire une recherche d'une chaîne de caractères entre deux séparateurs.
Exemple
FII+OR+5150060006:RIRI::FIFI+:::18100:25:137:titi+AT
Dans chaque ligne, je vais avoir des parties dites "mères" (ou enregistrements) entre "+" et des parties filles (ou sous enregistrements) entre ":"
Si je cherche la chaîne du second sous enregistrement du troisième enregistrement (2nd fille de la troisième mère pour les sentimentaux) et bah ça sera RIRI.
Parce que :
FII =1er enreg
OR =2nd enreg
5150060006:RIRI::FIFI = 3ème enreg
FIFI= 4 ss enreg du 3ème enreg
Voilà j'espère que j'ai été claire.
Type d'enregistrement: FII
J'ai essayé de créer une fonction extract(type enreg, no enreg, no ss enreg)
avec des loop mais moi pas arriver!
Merci d'avance pour votre aide.
Je souhaite faire une recherche d'une chaîne de caractères entre deux séparateurs.
Exemple
FII+OR+5150060006:RIRI::FIFI+:::18100:25:137:titi+AT
Dans chaque ligne, je vais avoir des parties dites "mères" (ou enregistrements) entre "+" et des parties filles (ou sous enregistrements) entre ":"
Si je cherche la chaîne du second sous enregistrement du troisième enregistrement (2nd fille de la troisième mère pour les sentimentaux) et bah ça sera RIRI.
Parce que :
FII =1er enreg
OR =2nd enreg
5150060006:RIRI::FIFI = 3ème enreg
FIFI= 4 ss enreg du 3ème enreg
Voilà j'espère que j'ai été claire.
Type d'enregistrement: FII
J'ai essayé de créer une fonction extract(type enreg, no enreg, no ss enreg)
avec des loop mais moi pas arriver!
Merci d'avance pour votre aide.
4 réponses
-
bonsoir à tous les deux
un début, du moins comme je l'ai compris
Function rangcar(ch As String, nucar As Long, car As String) Dim rc As Long, c As Long rc = 0 For c = 1 To Len(ch) If Mid(ch, c, 1) = car Then rc = rc + 1 If rc = nucar Then rangcar = c Exit Function End If End If Next c End Function Function extract(ByVal ch As String, no_enreg As Long, no_ss_enreg As Long) As String Dim deb As Long, fin As Long Dim enreg As String ch = "+" & ch & "+" deb = rangcar(ch, no_enreg, "+") fin = rangcar(ch, no_enreg + 1, "+") enreg = Mid(ch, deb + 1, fin - deb - 1) enreg = ":" & enreg & ":" deb = rangcar(enreg, no_ss_enreg, ":") fin = rangcar(enreg, no_ss_enreg + 1, ":") extract = Mid(enreg, deb + 1, fin - deb - 1) End Function
RQ1. la fonction extract renvoie #VALEUR si la requête n'est pas fondée (dons pas de test sur la validité de la requête)
RQ2. j'ai supposé que si on a "+:" ou "::" il y a un sous enregistrement vide entre + et : ou entre : et :
bonne suite-
-
Salut Permalink,
Ton code est super, mais je n'arrive pas à gérer le cas où il ne doit rien envoyer par ce qu'il n'y justement rien à envoyer. Par exemple:
Dans l'exemple que j'ai cité il n'y a pas de 2nd sous enregistrement pour le premier enregistrement donc extract(ma_ligne,1,2) devrait envoyen un blank.
Ou par exemple la ligne est finie elles se terminent toutes par des ' (contrairement à l'exemple que j'ai fournis..)
Merci en tout cas ça m'a vachement avancer.. -
C'est tout bon pour moi il fallait que je rajoute une petite bricole cf; le code suivant pour gérer le dernier cas que je viens d'évoquer:
Function extract(ByVal ch As String, no_enreg As Long, no_ss_enreg As Long) As String
Dim deb As Long, fin As Long
Dim enreg As String
ch = "+" & ch & "+"
deb = rangcar(ch, no_enreg, "+")
fin = rangcar(ch, no_enreg + 1, "+")
enreg = Mid(ch, deb + 1, fin - deb - 1)
enreg = ":" & enreg & ":"
deb = rangcar(enreg, no_ss_enreg, ":")
fin = rangcar(enreg, no_ss_enreg + 1, ":")
If (fin - deb - 1) <= 0 Then
extract = ""
Else
extract = Mid(enreg, deb + 1, fin - deb - 1)
End If
-
-
Re,
Bon, ben je vais faire ma proposition mais je ne sais pas s'il faut tenir compte du type ou si tu le testes avant de demander l'extraction.
J'ai donc mis type_enreg en optional en 4ème paramètre.
S'il est présent on le teste, si ok on extrait.
Si nok on retourne "type_enreg incorrect" (remplacer par "" si on préfère)
Si type_enreg est absent on extrait.
Function extract(enreg As String, no_enreg As Long, no_ss_enreg As Long, Optional type_enreg As String) As String If Not IsEmpty(type_enreg) Then If Split(enreg, "+")(0) <> type_enreg Then extract = "type_enreg incorrect" Exit Function End If End If extract = Split(Split(enreg, "+")(no_enreg - 1), ":")(no_ss_enreg - 1) End Function
syntaxe :
=extract(A1;3;2;"FII")
ou
=extract(A1;3;2)
Si le test de type_enreg est fait avant de demander l'extraction on peut se contenter de :Function extract(enreg As String, no_enreg As Long, no_ss_enreg As Long) As String extract = Split(Split(enreg, "+")(no_enreg - 1), ":")(no_ss_enreg - 1) End Function
syntaxe : =extract(A1;3;2)
eric-
-
-
-
-
Voici une version super light de mon script Eric:
sub extraction
fichier = "C\essai.txt"
Dim alphanum As String
numero = FreeFile
Open fichier For Input As #numero
While Not EOF(numero) And Not i > 256 '(max colonne)
Line Input #numero, alphanum
Worksheets("test").Select
'selection des 4 premiers caractères (statiques) de la ligne lue
Select Case Mid(alphanum, 1, 4)
Case "FII+"
ligne = Mid(alphanum, 1, Len(alphanum))
Cells(10, 1) = extract(ligne, 2, 2)
end select
wend
end sub
J'ai le message d'erreur (qui pointe ta fonction ) suivant:
Erreur d'exécution 9
L'indice n'appartient pas à la sélection.
sinon en terme de nomre de parenthèses ouvertes et fermées il y a un souci.
-
-
Je me tiens à disposition pour plus amples informations.
En effet je pense à deux fonctions split imbriquées, mais ça ne me résussi pas! -
Bonjour,
juste une question :
Tu as mis le type en paramètre dans ta fonction.
Peux confirmer que c'est important, qu'il faut le tester et qu'il apparait toujours (en enregistrement 1) ?
Parce que tu n'en parles pas dans la description du problème....
eric