IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Remplacer le find.execute par un regexp dans ma macro de pilotage Word


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut Remplacer le find.execute par un regexp dans ma macro de pilotage Word
    J'ai un utilitaire de remplacement de portions de texte piloté par Excel, basiquement on fait un find.execute sur une portion de texte (une ancienne clause) et ensuite on remplace par une nouvelle portion de texte

    Cette approche a des limitations, les possibilités offertes par les wildcards ou matchfuzzy est limité mais surtout on est limité à des portions de 255 caractères ce qui m'oblige a tronçonner mon texte dans tous les sens, avec des exceptions liés au chr(10) (pas pris en compte dans find.execute) ou bien tout ce qui est texte enrichi (adresse mail ou liens url)... bon j'ai réussi à bricoler fonctionnel un truc mais c'est une usine à gaz

    j'ai introduit en partie l'usage des regexp pour obtenir un match et faire mon find.execute sur le match...

    l'idéal ça serait de pouvoir venir directement modifier le range du doc en repérant mon match.firstindex

    Le souci c'est que j'obtiens une valeur différente entre match.firstindex et objword.selection.start (à l'issue du find.execute sur le même match)

    j'ai l'impression qu'il y a un écart lié en grande partie au sommaire, aux entêtes pied de page... enfin ce genre de trucs...
    enfin je dis ça c'est très étrange car j'obtiens la même valeur que ce soit avec objdoc.characters.count ou bien len(objdoc.range.text) etc...
    il y a que le objdoc.content.end qui semble être plus grand

    mais ça me chafouine quand même parce que à l'issue du find.execute mon objdoc.selection.start correspond bien dans le range.text à l'emplacement à modifier, c'est juste que mon match.firstindex est pas au bon endroit...

    Voilà si il y a une personne au taquet sur ce sujet je suis preneur de la soluce !! et sinon nan pis...

    Merci !!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    tu aurais des exemples de blocs de texte que tu remplaces ?

    L'usage de modèle Word n'est pas envisageable ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut
    finalement j'ai fait autrement

    initialement je tronçonnais mes blocs à remplacer et de remplacement par portion de 255 caractères
    avec des contraintes liées au texte enrichi (url et mail) au saut de ligne (chr10) ... bref une usine à gaz un peu instable
    je faisais un find.execute sur ces blocs

    je suis passé en regexp dès le départ, avec un prétraitement très efficace de remplacement les caractères dans \W par .{0,3} et ça fait une détection beaucoup plus permissive
    j'extrais le match et ensuite je fais deux find.Execute
    un sur le left(match,255) pour extraire le selection.start et ensuite un sur le right(match,255) pour extraire le selection.end
    et dernière étape je viens taper dans le selection.range(start,end).text pour finaliser le remplacement

    le code est pas parfait et il y a sûrement des failles, par exemple ce n'est pas parce que j'ai qu'une seule occurence du match que je vais avoir une seule occurence du left(match,255) etc...
    par contre une bonne surprise c'est que les contraintes mentionées au début ne semble plus gênantes quand je fais un find.execute du left(match,255) et du right(match,255) je sais pas si c'est un coup de bol ou si c'est lié au fait que je rebalance tout de suite mon match dans un find.execute au cours de la même procédure VBA sans passer par Excel (initialement je viens lire mon bloc à remplacer dans une cellule excel ce qui peut engendrer un écart de formatage par exemple perte du texte enrichi...) enfin je sais pas il faudrait que je fasse une recette maison sur les cas que je veux cibler... pour tester la robustesse du bidule.

    enfin voilà le cas est résolu pour moi, c'est vrai que j'aurais souhaité pouvoir réconcilier la position .firstindex avec la position obtenue par .find.execute mais tant pis !

    Pour répondre à la question de l'usage du modèle Word, je viens manipuler un corpus de centaines de CG existantes qui doit être mis à jour périodiquement. Il s'agit pas de fournir une solution d'éditique complète, il faudrait mettre des balises pour faire un truc propre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/01/2012, 11h16
  2. Comment remplacer un affichage aléatoire par un affichage dans l'ordre
    Par PierreR75 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/04/2010, 17h48
  3. Remplacer un mot entier par un autre dans une chaîne de caractères
    Par clemini dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 19/02/2009, 14h39
  4. Réponses: 3
    Dernier message: 10/05/2008, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo