Excel saisie de chaine de caractères
Fermé
bibiman23
Messages postés
37
Date d'inscription
mercredi 8 juillet 2009
Statut
Membre
Dernière intervention
21 novembre 2011
-
1 sept. 2011 à 16:40
eriiic Messages postés 24512 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 24 mars 2023 - 2 sept. 2011 à 19:49
eriiic Messages postés 24512 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 24 mars 2023 - 2 sept. 2011 à 19:49
A voir également:
- Excel saisie de chaine de caractères
- Liste déroulante excel - Guide
- Formule excel - Guide
- Excel extraire chaine de caractère après un caractère ✓ - Forum Excel
- Caractères ascii - Guide
- Plus de chaine tv - Guide
4 réponses
ccm81
Messages postés
10559
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 mars 2023
2 337
Modifié par ccm81 le 1/09/2011 à 21:56
Modifié par ccm81 le 1/09/2011 à 21:56
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
eriiic
Messages postés
24512
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 mars 2023
7 168
Modifié par eriiic le 1/09/2011 à 22:49
Modifié par eriiic le 1/09/2011 à 22:49
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
bibiman23
Messages postés
37
Date d'inscription
mercredi 8 juillet 2009
Statut
Membre
Dernière intervention
21 novembre 2011
3
2 sept. 2011 à 09:45
2 sept. 2011 à 09:45
bonjour,
en effet je fais un
Select Case Mid(ma_ligne, 1, 4)
Case "FII+"
et après je vais extraire donc pas de prise de tête avec le type d'enregistrement (le premier enregistrement).
Merci Eric
en effet je fais un
Select Case Mid(ma_ligne, 1, 4)
Case "FII+"
et après je vais extraire donc pas de prise de tête avec le type d'enregistrement (le premier enregistrement).
Merci Eric
bibiman23
Messages postés
37
Date d'inscription
mercredi 8 juillet 2009
Statut
Membre
Dernière intervention
21 novembre 2011
3
2 sept. 2011 à 10:35
2 sept. 2011 à 10:35
Salut Eric,
Ta fonction marche pas trop bien (j'ai testé la seconde version).
Ta fonction marche pas trop bien (j'ai testé la seconde version).
eriiic
Messages postés
24512
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 mars 2023
7 168
Modifié par eriiic le 2/09/2011 à 11:30
Modifié par eriiic le 2/09/2011 à 11:30
Re,
Ta fonction marche pas trop bien (j'ai testé la seconde version).
Ah, moi je trouve qu'elle marche plutôt bien, que ce soit la 1ère ou la 2nde version
http://www.cijoint.fr/cjlink.php?file=cj201109/cijvX7nY0v.xls
eric
Ta fonction marche pas trop bien (j'ai testé la seconde version).
Ah, moi je trouve qu'elle marche plutôt bien, que ce soit la 1ère ou la 2nde version
http://www.cijoint.fr/cjlink.php?file=cj201109/cijvX7nY0v.xls
eric
ccm81
Messages postés
10559
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 mars 2023
2 337
2 sept. 2011 à 11:49
2 sept. 2011 à 11:49
bonjour eriiic
effectivement ta fonction marche très bien et pour moins cher que la mienne .... bien vu le split-split
cordialement
effectivement ta fonction marche très bien et pour moins cher que la mienne .... bien vu le split-split
cordialement
bibiman23
Messages postés
37
Date d'inscription
mercredi 8 juillet 2009
Statut
Membre
Dernière intervention
21 novembre 2011
3
2 sept. 2011 à 14:23
2 sept. 2011 à 14:23
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.
bibiman23
Messages postés
37
Date d'inscription
mercredi 8 juillet 2009
Statut
Membre
Dernière intervention
21 novembre 2011
3
1 sept. 2011 à 16:42
1 sept. 2011 à 16:42
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!
eriiic
Messages postés
24512
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 mars 2023
7 168
1 sept. 2011 à 20:16
1 sept. 2011 à 20:16
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
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
1 sept. 2011 à 22:17
2 sept. 2011 à 10:19
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..
2 sept. 2011 à 11:11
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