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

suppression d'une chaîne de caractères entre [] - VB/VBA/VBS - Programmation

Marsh Posté le 07-06-2006 à 16:25:46    


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!

Reply

Marsh Posté le 07-06-2006 à 16:25:46   

Reply

Marsh Posté le 07-06-2006 à 20:08:57    

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
Reply

Marsh Posté le 08-06-2006 à 09:29:36    

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.
 

Reply

Marsh Posté le 08-06-2006 à 10:02:18    

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.
 

Reply

Marsh Posté le 08-06-2006 à 10:10:05    

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

Reply

Marsh Posté le 08-06-2006 à 10:18:57    

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) ?

Reply

Marsh Posté le 08-06-2006 à 10:36:04    

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....(??)

Reply

Marsh Posté le 08-06-2006 à 11:09:39    

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.

Reply

Marsh Posté le 08-06-2006 à 11:28:46    

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!!

Reply

Marsh Posté le 08-06-2006 à 13:18:07    

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
Reply

Marsh Posté le 08-06-2006 à 13:18:07   

Reply

Marsh Posté le 08-06-2006 à 13:27:17    

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

Reply

Marsh Posté le 08-06-2006 à 13:54:12    

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!)

Reply

Marsh Posté le 08-06-2006 à 13:56:33    

On avance :)

Reply

Marsh Posté le 08-06-2006 à 14:01:54    

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

Reply

Marsh Posté le 08-06-2006 à 14:07:58    

il semble que « ActiveDocument.Select » fonctionne

Reply

Marsh Posté le 08-06-2006 à 14:13:20    

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...

Reply

Marsh Posté le 08-06-2006 à 15:25:11    

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
Reply

Marsh Posté le 08-06-2006 à 23:20:46    

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
Reply

Marsh Posté le 09-06-2006 à 08:51:48    

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.

Reply

Marsh Posté le 09-06-2006 à 09:36:59    

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...

Reply

Marsh Posté le 09-06-2006 à 10:55:18    

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
Reply

Marsh Posté le 09-06-2006 à 11:17:34    

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!  

Reply

Marsh Posté le 09-06-2006 à 11:33:58    

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 ?

Reply

Marsh Posté le 09-06-2006 à 11:37:14    

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
Reply

Marsh Posté le 09-06-2006 à 11:47:03    

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

Reply

Marsh Posté le 09-06-2006 à 11:50:37    

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?

Reply

Marsh Posté le 09-06-2006 à 12:22:08    

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...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed