Macro pour éliminer des caractères spécifiques - VB/VBA/VBS - Programmation
Marsh Posté le 08-09-2011 à 12:34:04
Hello
Etant donné que les lettres ont des codes ascii allant de 65 à 90 pour les majuscules, de 97 à 122 pour les minuscules et de 48 à 57 pour les chiffres, il faut faire une boucle ou un select pour passer chaque caractere, et s'il n'est pas dans ses fourchettes, le degager.
Après, prends tu les accents ? Les accents sur majuscules ? etc.
Si oui, il faudra faire des exceptions et traiter au cas par cas ou presque.
Exemple de code :
Code :
|
Marsh Posté le 09-09-2011 à 06:19:28
Bonjour, merci beaucoup pour ce code, mais je j'ai recopié tel quel et je l'ai testé, il fonctionne pas
En plus, comme je débute, je ne comprends pas bien la procédure
Marsh Posté le 09-09-2011 à 09:22:12
Donc quand on ne comprend, on ne dit pas que ca ne marche pas, puisqu'il marche tres bien, on dit qu'on arrive pas a l'exploiter
Il repond de plus a ta question A savoir enlever des caracteres dans une chaine donnée. Ce qui est le cas
Par contre si tu expliquais d'où sort ce texte, et comment voudrais tu le traiter, là ca serait plus parlant
Marsh Posté le 09-09-2011 à 20:08:40
Je maintiens ce que j'ai dis : ça marche pas!
C'est pourtant simple, on tape au clavier tout une série de caractères contenant des lettres(a,b,c,d...), des signes(">@^¨${#|\_* etc...), des espaces, des chiffres(0,1,2,3,4,5,6,7,8,9). Ensuite on clique sur le bouton de la macro et il ne reste plus que les chiffres et les lettres tout accolés.
Marsh Posté le 09-09-2011 à 20:48:30
Si tu maintiens, bon courage alors
Quant a moi, je maintiens que le code donné fonctionne. Il ne repond pas a ton besoin non expliqué a la base.
Pour preuve avant le "End Sub"
Ajoute ceci : MsgBox StrFin
Et tu verras qu'il traitera la chaine de la variable StrVal
Marsh Posté le 10-09-2011 à 05:33:28
Bonjour, effectivement je vois quelque chose maintenant. Le programme exécute bien l'action recherché mais sur la chaîne qui a été au préalable définit dans la macro. C'est dans le style "Hello World". Ce que je voudrai, c'est pouvoir l'appliquer à n'importe quel document word et qu'il me donne le résultat correspondant.
Marsh Posté le 10-09-2011 à 12:21:01
Problème mal défini -> réponse imprécise
Voilà un code vite fait sur le gaz inspiré de celui de dje69r qui fonctionne sur un texte composé sur Word, mais qui curieusement ne fonctionne pas tout à fait sur certains caractères (retour charriot, ), ?...) quand les données sont copiées-collées d'une page web (de cette page par exemple). J'ai une erreur '5904'" Impossible d'éditer la plage, d'où le gestionnaire d'erreur.
Code :
|
Marsh Posté le 11-09-2011 à 11:14:58
Merci beaucoup Otobox, cette macro fonctionne en partie comme je voulais. Comme je débute, j'aimerai bien comprendre à quoi sert le "Resume Next" à la fin. A part ça, ce que j'aurai voulu pour que la tâche soit complète, c'est que la macro ne s'applique qu'entre les marqueurs que j'ai ajouté, et qui sont *** dans l'exemple que j'ai cité plus haut.
Marsh Posté le 11-09-2011 à 11:33:33
En remplaçant les *** par des accolades { et }, je sais déja sélectionner le texte :
Code :
|
Marsh Posté le 11-09-2011 à 17:11:11
La ligne en début de procédure
Code :
|
indique que si une erreur se produit, il faut aller lire la partie :
Code :
|
En effet, mettre au début On Error GoTo gest_err ne suffit pas car si une erreur se produit de nouveau, le gestionnaire d'erreur ne saura plus quoi faire si on ne le lui dit pas.
A noter aussi que
Code :
|
annule la gestion des erreurs. C'est utile surtout si les procédures sont imbriquées les unes dans les autres. Dans le cas du code donné plus haut, on pourrait s'en passer.
Sinon, tes balises *** sont des balises que tu rajoutes ou qui sont déjà présentes dans le fichier ? Est-ce qu'il y a plusieurs passages ainsi ? Ne serait-ce pas plus simple de sélectionner ce que tu veux changer ?
Marsh Posté le 12-09-2011 à 06:01:07
Merci beaucoup pour ces explications Otobox. Pour répondre à ta question, c'est moi-même qui crée les balises. Elles ne délimitent qu'un seul passage. Je devrai choisir plutôt deux symboles extrêmement rares, comme ceux-là par exemple : Ħ,Ø,Æ,¥, etc... Ce que je voudrai ensuite, c'est me positionner juste après la première balise et appliquer le traitement jusqu'à ce que le curseur rencontre la dernière balise.
Marsh Posté le 12-09-2011 à 07:22:22
Ça ne serait pas plus simple de faire une sélection du texte à modifier, lancer la macro et pour terminer positionner le curseur en fin de sélection ?
Si tu tiens vraiment à placer des balises, c'est le même principe :
1) Sélection du texte à modifier
2) lancer la macro
3) traiter le texte
4) placer les balises en début et fin de sélection
5) positionner le curseur après la dernière balise
6) fin de la macro.
Je ne suis pas spécialiste de Word et du vba avec Word, je ne connais pas trop les objets de ce logiciel, mais à vu de nez, ça me semblerait plus simple de faire comme ça que de devoir faire d'abord une recherche de balises.
Marsh Posté le 12-09-2011 à 07:33:21
otobox a écrit : Problème mal défini -> réponse imprécise |
Je reviens sur ma formule car elle pourrait être mal interprétée. Je veux dire par là que les solutions proposées par dje69r sont la plupart du temps extrêmement précises en répondant exactement à la demande exprimée. Il possède une rigueur toute numérique !
Si la réponse n'est pas celle qu'on attend, il convient de regarder son code (sa demande) plutôt que d'accuser la machine de faire n'importe quoi !
Marsh Posté le 12-09-2011 à 08:06:11
Je pense que dje69r m'a donné la bonne méthode mais comme je débute y'a un truc que je sais pas faire avec son code : c'est de faire en sorte que StrVal prenne la valeur de ma sélection (Selection.Find.Execute).
Marsh Posté le 12-09-2011 à 09:43:33
Et c'est d'ailleurs la question d'otobox et la mienne, comment definis tu ton texte a modifier...?
Tant que cela ne sera pas clair, on peut te donner des pistes, du code fonctionnel mais ca ne resoudra pas la particularité de ton probleme si tu ne l'exprimes pas.
Marsh Posté le 12-09-2011 à 12:54:33
Mon texte à modifier est une chaine de caractère comprise entre deux balises.
J'avais idée de faire comme ceci en gros :
Code :
|
Marsh Posté le 12-09-2011 à 17:41:13
J'ai fait ca vite fait :
Code :
|
La boucle déconne un peu mais là je n'ai pas trop le temps... Je jouerai avec ca demain
Marsh Posté le 12-09-2011 à 18:36:14
arsene12 a écrit : Je pense que dje69r m'a donné la bonne méthode mais comme je débute y'a un truc que je sais pas faire avec son code : c'est de faire en sorte que StrVal prenne la valeur de ma sélection (Selection.Find.Execute). |
Oui mais tes deux balises : quelle est leur utilité ? Simplement identifier le texte à modifier ou vont-elles servir plus tard ?
Si tu les rajoutes manuellement pour simplement identifier le texte à modifier, c'est plus simple de sélectionner puis lancer la macro.
Si les balises doivent servir pour plus tard, c'est plus simple de sélectionner le texte à modifier puis lancer la macro qui terminera en rajoutant une balise de ton choix.
Marsh Posté le 12-09-2011 à 19:43:45
Voilà une solution :
Code :
|
Fonctionnement :
1) sélection du texte à modifier
2) Lancer la macro test1
2.1) La macro supprime tous les caractères indésirables
2.2) La macro rajoute en début et en fin de la sélection la balise que tu as choisi (ligne 12 du listing ci-dessus)
3) Fin.
Si ça correspond à ce que tu veux, il faut que tu saches que je peux encaisser les chèques (pas en dessous de 100 000 euros)
Marsh Posté le 12-09-2011 à 21:56:52
ReplyMarsh Posté le 13-09-2011 à 06:48:38
Merci beaucoup, je crois que je vais progresser grâce à vous et atteindre mon objectif. Pour finir, je vous explique le but de la manœuvre. Vous l'avez peut-être compris, le but c'est de me servir d'une chaîne de caractères pour en faire l'intitulé d'un signet (qui n'accepte qu'une certaine catégorie de caractères). Il faudrait donc que la modification ne se fasse que virtuellement car ce qui m’intéresse, c'est juste d'avoir le résultat en mémoire. Connaitriez vous la technique pour cela?
Marsh Posté le 13-09-2011 à 08:03:14
SuppotDeSaTante a écrit : Et on partage |
Pas de problème
arsene12 a écrit : Merci beaucoup, je crois que je vais progresser grâce à vous et atteindre mon objectif. Pour finir, je vous explique le but de la manœuvre. Vous l'avez peut-être compris, le but c'est de me servir d'une chaîne de caractères pour en faire l'intitulé d'un signet (qui n'accepte qu'une certaine catégorie de caractères). Il faudrait donc que la modification ne se fasse que virtuellement car ce qui m’intéresse, c'est juste d'avoir le résultat en mémoire. Connaitriez vous la technique pour cela? |
Rien compris.
Marsh Posté le 13-09-2011 à 08:10:25
C'est pourtant simple. Je pourrai dupliquer en haut la ligne avec les balises, faire la macro puis utiliser Selection.copy pour nommer le signet et ensuite supprimer la ligne. Mais je pense qu'il doit y avoir une autre façon de faire.
Marsh Posté le 13-09-2011 à 09:20:01
arsene12 a écrit : Merci beaucoup, je crois que je vais progresser grâce à vous et atteindre mon objectif. Pour finir, je vous explique le but de la manœuvre. Vous l'avez peut-être compris, le but c'est de me servir d'une chaîne de caractères pour en faire l'intitulé d'un signet (qui n'accepte qu'une certaine catégorie de caractères). Il faudrait donc que la modification ne se fasse que virtuellement car ce qui m’intéresse, c'est juste d'avoir le résultat en mémoire. Connaitriez vous la technique pour cela? |
Le genre de chose a dire des le depart ca...
Marsh Posté le 13-09-2011 à 12:34:34
C'est pas mon avis Faut pas demander trop de choses à la fois.
Marsh Posté le 13-09-2011 à 12:40:29
Bah tu as tort... C'est soit une règle de courtoisie (quand des gens bossent pour toi) soit une règle de développement (et en tout cas la mienne) mais le cahier des charges, on le fait avant.
Et je pense qu'otobox est d'accord avec moi, mais se taper des morceaux de code (meme si simples), pour au final avoir le cahier des charges et s'etre fait chier pour rien ou presque c'est pas du plus motivant dans le benevolat
Marsh Posté le 13-09-2011 à 13:09:55
Oui, surtout que je n'ai toujours pas trop compris ce qu'il veut faire... Balise, signet.
C'est pour nommer un signet et le placer à un endroit précis dans le texte ? Dans ce cas, quel intérêt de la balise ?
Marsh Posté le 13-09-2011 à 13:40:52
Je vois plutot un texte contenant des caracteres interdit dans un signet/lien hypertext, et donc de garder le texte Word original contenant les dits caracteres mais les substituer pour le nom du signet.
Marsh Posté le 13-09-2011 à 19:36:19
SuppotDeSaTante a écrit : Je vois plutot un texte contenant des caracteres interdit dans un signet/lien hypertext, et donc de garder le texte Word original contenant les dits caracteres mais les substituer pour le nom du signet. |
Oui, je comprends ça aussi, la création en automatique de signets, avec un nom explicite pour retrouver le passage par la suite. Mais je ne comprends pas l'utilité de mettre une balise *** ?
Marsh Posté le 13-09-2011 à 21:38:42
Bonsoir,
Je vais vous expliquer le cahier des charges :
J'ai plusieurs fichiers comprenant chacun une page avec un tableau dedans au-dessus duquel y'a un titre.
Je voudrai coller les fichiers et ensuite mettre les titres en tête du document pour en faire un sommaire.
Je voudrai que chaque titre possède un hyperlien qui renvoie vers son tableau respectif.
Le sujet ici est consacré à la macro qui génère le signet et l'hyperlien.
Je vous remercie beaucoup car grâce à vous j'ai réalisé la première partie, la création du signet. Voici le code :
Code :
|
Je suis en train d'achever la macro. J'ai plus que l'hyperlien à créer. J'ai quelques bugs qui se produisent, c'est pas encore au point.
Code :
|
Marsh Posté le 14-09-2011 à 00:12:30
OK.
Ca n'aurait pas été plus simple de passer par un sommaire automatique (c'est à dire jouer avec les styles de titres ?)
Marsh Posté le 08-09-2011 à 06:58:43
Bonjour,
J'ai un texte comme ceci : ***(u 4sd6s4fs4fs-+lk 41s szzf_z43sf=/<<ùlx*** J'aimerai en utilisant VBA Word créér un programme qui me permette de conserver que les lettres alphabétiques et les chiffres et éliminer tout le reste, y compris les espaces. Est-ce que quelqu'un saurait comment faire cette macro? Merci d'avance.