Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1519 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  suppression d'une chaîne de caractères entre []

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

suppression d'une chaîne de caractères entre []

n°1382982
acorsa
Posté le 07-06-2006 à 16:25:46  profilanswer
 


Promis dernière question de la journée!!!!
Alors voilà: j'ai une fonction qui, en vb m'ajoute des identifiants dans mon texte (devant des termes). L'identifiant est composé d'un code, du nom du document et d'un numéro unique([code_monfichier.doc_n°unique]). Lorsque je clique sur un bouton je veux que tout ces identifiants disparaissent.Pour cela je fais:
Selection .Find.....text= [...].Ca marchait super bien tant qu'il n'y avait pas le "code"
Le problème c’est que le code est égal au jour+ (mois* heure) et donc pour supprimer le tout ça craint car le code change au fil des heures. Aussi il faudrait que je puisse supprimer tout ce qui est entre crochet [] sans préciser ce qu'il y a à l'intérieur.
Si vous pouvez m'aider ce serait super!
Merci beaucoup!

mood
Publicité
Posté le 07-06-2006 à 16:25:46  profilanswer
 

n°1383150
otobox
Maison fondée en 2005
Posté le 07-06-2006 à 20:08:57  profilanswer
 

Code :
  1. 'Enlève la chaine de caractères contenue entre crochets
  2. 'ex: DelCrochets("O[tObO]x" ) -> "Ox"
  3. Function DelCrochets(strChaine As String)
  4.   Dim bytD As Byte, bytF As Byte, bytL As Byte
  5.   Dim strC As String, strL As String
  6.   bytD = InStr(strChaine, "[" ) - 1
  7.   bytF = InStr(strChaine, "]" ) + 1
  8.   bytL = Len(strChaine)
  9.   If bytD <> 0 Or bytF <> 0 Then
  10.     DelCrochets = Mid$(strChaine, 1, bytD) & Mid$(strChaine, bytF, bytL)
  11.   End If
  12. End Function


 
 ;)  
 
JM


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
n°1383433
acorsa
Posté le 08-06-2006 à 09:29:36  profilanswer
 

Je te remercie ms en fait, (j'ai dû mal m'exprimer) je ne suis pas censée connaître le contenu de la chaîne entre crochets car comme je disais, le code change. Il faudrait dc parcourir le document et virer tout ce qui est entre crochets. Si tu as une idée, elle sera la bienvenue.
Merci.
 

n°1383455
tegu
Posté le 08-06-2006 à 10:02:18  profilanswer
 

1/ Tu n'as pas précisé dans quel contexte tu travailles (VBA/Excel, VBA/Word, VB6, ...). Même si ton « Selection .Find. » peut aiguiller, ça n'est pas à nous de deviner.
2/ OtObOx a répondu à ta question. C'est peut-être toi qui n'a pas compris sa réponse.
Sa fonction DelCrochets() supprime les crochets et ce qu'il y a entre eux (quel que soit le contenu) pour le paramètre strChaine. Tu dois pouvoir t'en servir. Si ça n'est pas le cas, explique nous ce qui te gêne dans cette fonction.
 

n°1383460
acorsa
Posté le 08-06-2006 à 10:10:05  profilanswer
 

ok je suis désolée d'avoir oublié de préciser dans quel contexte je bosse...je travaille sous Word.
Concernant la réponse de OtObOx, le problème vient du fait que j'ai du mal à manipuler mon document word et bien sûr lorsque je mets entre crochets Selection.text il y a un problème de taille!!!!
J'ai pensé à découpé mon texte en phrase et traiter chaque phrase ms il va toujours y avoir un problème de taille!
J'espère que tu as mieux compris mon problème...Merci

n°1383472
tegu
Posté le 08-06-2006 à 10:18:57  profilanswer
 

Non je comprends de moins en moins en fait.
En quoi ton Selection.text pose un problème de taille. Dis nous quelle erreur se produit éventuellement (n° et libellé).
Malheureusement comme beaucoup de forumeurs (débutants ou non) tu es bien trop vague sur les symptômes de ton problème.
Mon impression est que ta question initiale n'a rien à voir avec ton problème réel. Je dois être fatigué.
En gros mon incompréhension se situe ici : « lorsque je mets entre crochets ». Ton problème est de mettre les crochets ou de les enlever (avec leur contenu) ?

n°1383488
acorsa
Posté le 08-06-2006 à 10:36:04  profilanswer
 

Bon j'avoue,tu n'as pas tort je suis crevée, je viens de relire mon explication en m'imaginant ne rien connaître de mon projet et ma conclusion est que l'explication est..bidon! De plus, je suis une débutante ds le vaste monde des ??... forumeurs (c'est ça?), donc je vais essayer de m'appliquer dans mes futures explications...
Voilà donc un exemple de texte que je dois traiter:
[86_a93a012kfr_al_c_mon_pr.rtf_1]mon premier terme [86_a93a012kfr_al_c_mon_pr.rtf_2]mon second terme ([86_a93a012kfr_al_c_mon_pr.rtf_3]mon troisième terme) .....[86_a93a012kfr_al_c_mon_pr.rtf_4]etc....
Sachant que 86 est le code que j'ai expliqué plus haut, suivi du nom du fichier, etc... Il faut dc que j'ai comme résultat le texte suivant:
mon premier terme mon second terme (mon troisième terme) .....etc....
Si j'utilise la fonction DelCrochets() il faut que je passe en paramètre un string et je ne sais pas comment faire (découper mon gros fichier en plusieurs phrases??)
Voilà, j'espère avoir été plus claire....(??)

n°1383523
tegu
Posté le 08-06-2006 à 11:09:39  profilanswer
 

Cela dépend de la taille de ton fichier.
Si tu as eu un message d'erreur sur la taille de la chaine affectée à une variable de type String, cela veut dire que ton texte à traiter est > à 64ko (taille max. qu'un String peut recevoir sauf erreur de ma part).
Il faut donc découper ton fichier en blocs de cette taille (voire même inférieure, ça va pas changer grand chose aux performances).
J'aimerais quand même savoir quelle erreur se produit.
Sinon ton explication n'était pas incompréhensible, mais je n'aurais pas pensé que tu travaillais avec autant de données à traiter. Et ton problème est plus là qu'ailleurs maintenant.

n°1383567
acorsa
Posté le 08-06-2006 à 11:28:46  profilanswer
 

Oui en effet le problème est la taille des fichiers...L'erreur renvoyée est "Dépassement de capacité (erreur d'exécution 6) "
Tu connais la fonction permettant de découper le fichier? J'ai essayé avec Dim monTab() As String
monTab = Split (Selection.Text,"." )  ms je n'arrive pas à exploiter le résultat (à afficher les valeurs de monTab)
Alors, j'ai essayé :
   monTab = Split(Selection.Text, "." )
   For i = 0 To 10
    DeleteID (monTab(i))
   Next i
Ms il y a là aussi la même erreur "Dépassement de capacité" et ce même si je ne mets que des phrases de quelques mots.
Je ne comprends plus rien...Vive l'informatique!!

n°1383693
tegu
Posté le 08-06-2006 à 13:18:07  profilanswer
 

Soyons précis. Ce n'est pas le fichier que tu veux découper mais le texte contenu dans Selection.text
Pour avoir une première idée il faut que tu affiches le résultat de Len(Selection.Text) pour connaître la taille de ta sélection.
Le Split() permet un découpage selon un séparateur mais, d'une part je crains qu'il n'accepte qu'un paramètre de type String (donc limité à 64ko) et d'autre part si un seul élément du tableau fait plus de 64ko alors ça plante tout le traitement puisque tu l'as aussi déclaré de type String.
 
Je n'ai pas de référence sur ce genre de traitement car généralement je pars d'un vrai fichier sur disque dur que je lis par blocs largement inférieurs à 64ko. Là tu as une variable qui contient un gros bloc et toutes les fonctions de découpage (mid$(), left$(),right$(),split(), ...) risquent de ne pas accepter Selection.Text comme paramètre.
 
Je vais essayer de me fabriquer un exemple car là ça devient difficile de te conseiller en aveugle.
 
edit: après un test rapide, la limite des 64ko ne semble pas être la bonne. Dis moi quelle taille a Selection.Text avec la fonction Len()
Je n'ai aucun problème à traiter un texte de plus de 120 000 caractères avec Split(), Mid$() ...


Message édité par tegu le 08-06-2006 à 13:23:28
mood
Publicité
Posté le 08-06-2006 à 13:18:07  profilanswer
 

n°1383698
tegu
Posté le 08-06-2006 à 13:27:17  profilanswer
 

Au temps pour moi, les chaines de type String à longueur variable acceptent environ 2 milliards de caractères. Seules les String à longueur fixe sont limitées à 64ko.
Il faut plus d'info sur ton Selection.Text

n°1383728
acorsa
Posté le 08-06-2006 à 13:54:12  profilanswer
 

Au secours!! Je viens de m'apercevoir que la taille de Selection.text était de ...1!! C'est nul comme nouvelle ça!! En gros ça veut dire que je n'arrive pas à sélectionner tout le texte...et c'est peut-être ça le problème!!
(Merci c'est grâce à toi que je me suis aperçu de ça!)

n°1383732
tegu
Posté le 08-06-2006 à 13:56:33  profilanswer
 

On avance :)

n°1383737
acorsa
Posté le 08-06-2006 à 14:01:54  profilanswer
 

lol ouai c'est déjà ça...
Mais tu sais comment faire la sélection du texte en entier?

n°1383743
tegu
Posté le 08-06-2006 à 14:07:58  profilanswer
 

il semble que « ActiveDocument.Select » fonctionne

n°1383750
acorsa
Posté le 08-06-2006 à 14:13:20  profilanswer
 

Len (Selection.text)=9849, sachant que c'est pas le plus des fichiers que j'ai...
ActiveDocument.Select marche nickel...comment n'y ai-je pas pensé!!!
Mais bon la fonction DelCrochets me renvoie toujours la même erreur...

n°1383832
kiki29
Posté le 08-06-2006 à 15:25:11  profilanswer
 

Peut être
A la bourricot j'ai testé avec un doc de 100 pages remplies de tes chaînes de test
à part une fatigue visuelle due à l'attente tout s'est bien déroulé


....
  ActiveDocument.Select
  Str = Selection
  Selection = DelCrochets(Str)
  Application.ScreenRefresh
......
 
Private Function DelCrochets(Chaine As String) As String
Dim PosD As Long, PosF As Long, Taille As Long
Dim strR As String, strL As String, Str As String
    Do
        PosD = InStr(Chaine, "[" )
        PosF = InStr(Chaine, "]" )
        Taille = Len(Chaine)
         
        If PosD > 0 And PosF > 0 Then
            strL = Left(Chaine, PosD - 1)
            strR = Right(Chaine, Taille - PosF)
            Str = strL & strR
            Chaine = Str
        End If
        Application.StatusBar = PosD & " " & PosF & " : " & Taille
    Loop Until PosD = 0 Or PosF = 0
     
    DelCrochets = Chaine
End Function


Message édité par kiki29 le 09-06-2006 à 06:44:15
n°1384172
otobox
Maison fondée en 2005
Posté le 08-06-2006 à 23:20:46  profilanswer
 

oui, ton pb de capacité vient que j'ai déclaré dans la fonction des variables type byte (ha ! ha !), donc de longueur 256 caractères. Il suffit de remplacé comme la fait kiki, byte par long.
 
Astucieux le:

Code :
  1. If PosD > 0 And PosF > 0 Then


:)
 
JM


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
n°1384221
acorsa
Posté le 09-06-2006 à 08:51:48  profilanswer
 

Merci kiki!!
Je vais tester ça toute de suite...J'ai pensé au problème de déclaration de variables de type byte ce matin en prenant mon p'tit déj'!!!
Informatique quand tu nous tiens!!!!!!
Merci à tous.

n°1384250
acorsa
Posté le 09-06-2006 à 09:36:59  profilanswer
 

Bon, au risque de passer pour un boulet, je tente...
La fonction marche très bien puisque quand je fais : MsgBox (DelCrochets(Str)), j'ai bien mon texte sans les crochets dc c'est nickel!
Le problème c'est que lorsque je fais Selection = DelCrochets(Str), là ça marche plus...mon texte disparaît...(musique de film qui fait peur...)trop bizarre!!Mais qd je clique ds le document, on dirait que le texte est toujours là : il y a tjrs le même nb de pages, je peut me positionner dedans comme si il y avait du texte...etc, mais il est pas visible.
J'ai pensé que c'était peut-être dû au refresh mais c'est pareil qu'il y soit ou pas...

n°1384325
kiki29
Posté le 09-06-2006 à 10:55:18  profilanswer
 

Ma version Word 10 (2002) SP3
Le code complet


Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim TailleF As Long
 
Private Function DelCrochets(Chaine As String) As String
Dim PosD As Long, PosF As Long, Taille As Long
Dim strR As String, strL As String, Str As String
    Do
        PosD = InStr(Chaine, "[" )
        PosF = InStr(Chaine, "]" )
        Taille = Len(Chaine)
         
        If PosD > 0 And PosF > 0 Then
            strL = Left(Chaine, PosD - 1)
            strR = Right(Chaine, Taille - PosF)
            Str = strL & strR
            Chaine = Str
        End If
        Application.StatusBar = PosD & " " & PosF & " | " & Taille
    Loop Until PosD = 0 Or PosF = 0
     
    TailleF = Len(Chaine)
    DelCrochets = Chaine
End Function
 
 
Private Sub cmdDelCroc_Click()
Dim Str As String
Dim Debut As Long, Fin As Long
Dim TailleD As Long
    Debut = GetTickCount
    ActiveDocument.Select
    Str = Selection
    TailleD = Len(Str)
    Selection = DelCrochets(Str)
    Fin = GetTickCount - Debut
     
    Application.StatusBar = TailleD & "  " & TailleF & " | " & Format(Fin / 1000, "0.0" )
    Application.ScreenRefresh
End Sub


Message édité par kiki29 le 09-06-2006 à 10:57:52
n°1384360
acorsa
Posté le 09-06-2006 à 11:17:34  profilanswer
 

Je vais mourrir je dois avoir fini ça avant ce soir et je ne comprends plus rien...J'ai essayé avec ton code et ça fait pareil...C'est quoi cmdDelCroc_Click()?  
Je n'arrive pas à faire Option Explicit Private Declare Function GetTickCount Lib "kernel32" () As Long, ça me génère des erreurs!!! Donc je l'ai viré j'ai tout inséré ds mon code sauf Debut et Fin qui ne me servent pas...je ne pense pas que ce soit ça le problème...
Soyons logique, comment se fait-il que MsgBox(DelCrochets(Str)) marche et que Selection=DelCrochets(Str) me renvoie le fichier vide??
Autre chose, je ne sais pas si il y a un lien ms le Application.StatusBar = .... ne me retourne rien!  

n°1384371
kiki29
Posté le 09-06-2006 à 11:33:58  profilanswer
 

Je passe par une UsrForm pour lancer la macro
GetTickCount c'est juste pour récupérer le temps de traitement
Par curiosité : pourrais-tu m'envoyer ton Doc à mon adresse email (voir Profil). Je n'ai pas l'ADSL donc une version "light" pour y jeter un oeil ?

n°1384375
tegu
Posté le 09-06-2006 à 11:37:14  profilanswer
 

Bon déjà pour faire un test repars d'un document sans aucune macro et avec le texte Word nécessaire pour un test basique.
Tu copies le code VBA de kiki29 et à la place de « Private Sub cmdDelCroc_Click()  », tu écris « Sub cmdDelCroc()  »
À partir de là tu dois avoir une macro nommée cmdDelCroc que tu peux lancer
Et ça marche (testé chez moi)


Message édité par tegu le 09-06-2006 à 11:37:35
n°1384390
acorsa
Posté le 09-06-2006 à 11:47:03  profilanswer
 

Oui oui en effet avec de petits fichiers ça marche jusque là on est d'accord ms avec mon gros texte ça marche plus!!!

n°1384396
acorsa
Posté le 09-06-2006 à 11:50:37  profilanswer
 

Attends j'ai essayé sur un fichier que j'ai crée ça a marché ms si je teste sur un vrai fichier en enlevant toutes les lignes sauf une ça plante aussi!!!
Mystère..ça devrait pourtant marcher même si c'est un fichier rtf non?

n°1384422
acorsa
Posté le 09-06-2006 à 12:22:08  profilanswer
 

Autre indice...Si je fais MsgBox Selection ça marche aussi!!Je vois le texte sans les crochets ds la boîte de dialogue ms il reste invisible à l'écran...
Peut-être qu'il y a une fonction pour le rendre visible ms je trouve pas...

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  suppression d'une chaîne de caractères entre []

 

Sujets relatifs
Différence entre 2 chaînes de caractères[Résolu] Problème MySQL 1&1 : plus de protection de chaine !
Php : convertir chaine de caractèreCompilation jsp, caractères étrange, prob d'encoding ?
suppression des confirmations[Débutant] Incrémeter une chaine unsigned char
Nom de fichier : caractères interdits[Access] requete SQL, comment connaitre la taille d'une chaine ?
suppression d'une partie de chaine de caractère 
Plus de sujets relatifs à : suppression d'une chaîne de caractères entre []


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR