Excel saisie de chaine de caractères
bibiman23
Messages postés
45
Statut
Membre
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 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.
A voir également:
- Excel saisie de chaine de caractères
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Caractères spéciaux - Guide
- Plus de chaine tv - Guide
- Nombre de jours entre deux dates excel - Guide
4 réponses
bonsoir à tous les deux
un début, du moins comme je l'ai compris
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
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
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.
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 :
syntaxe : =extract(A1;3;2)
eric
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.
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!
En effet je pense à deux fonctions split imbriquées, mais ça ne me résussi pas!
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..
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