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 :

Repérer Msgbox dans un classeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2017
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2017
    Messages : 1 043
    Points : 391
    Points
    391
    Par défaut Repérer Msgbox dans un classeur
    Bonjour,

    je dois adapter mon application (une trentaine de classeur) afin qu'elle soit utilisée par des anglophones, en particulier tous les messages via Msgbox

    Je me rends compte que j'aurai du utiliser des variables en "Public" dans chaque classeur au lieu de mettre directement le texte dans les modules.

    On ne refais pas l'histoire.

    Ma question est la suivante : existe-t-il un moyen de détecter toutes les Msgbox dans un classeur (tous modules confondus) ?

    Dans un sens plus largeur pour chercher une chaîne de caractère.

    Je ne vois pas comment mais peut-être une astuce ?
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    juin 2013
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2013
    Messages : 475
    Points : 953
    Points
    953
    Par défaut
    Bonjour,

    S'il ne s'agit que de les détecter manuellement, la boîte de recherche de l'éditeur VBA fera le boulot.
    Mais cela promet d'être fastidieux si vous avez beaucoup de Modules.

    Les modules de code peuvent être exportés au format de fichier *.bas, qui semble pouvoir être édités comme des fichiers texte.
    Mais je ne suis pas sûr qu'il en soit de même pour le code associé aux feuilles de calcul (il s'exporte au format *.cls) ou au classeur lui-même.
    Reste toujours la possibilité de passer manuellement dans chaque module, de faire un Ctrl+A et Ctrl+C puis d'ouvrir un nouveau document texte et d'y coller le code précédemment copié.

    Une fois tout votre code VBA transféré dans des fichiers texte, il convient de traiter le code obtenu ; et c'est là que ça se corse...
    Détecter les instructions 'MsgBox' peut paraître facile, mais il faut s'assurer que le texte en question est bien une instruction et pas une partie d'une chaîne de caractère.
    Il va ensuite falloir lire la fin de chaque ligne contenant une instruction 'MsgBox' pour détecter les caractères de continuation (les underscores en fin de ligne) pour prendre en compte les lignes qui suivent quand cela est nécessaire.
    Pour chaque instruction MsgBox identifiée, il va falloir récupérer le message et le titre de la boîte (soit les 2 premiers arguments de l'instruction). Au sein de chacun de ces 2 arguments, il va falloir distinguer les chaînes de caractères entrées en dur de celles générées sur la base de variables.

    Les parties de chaînes de caractères entrées en dur peuvent alors être compilées dans un fichier texte à part (fichier de traduction). A chacune est associé un nom de variable généré automatiquement et, dans le code de chaque module, les instructions 'MsgBox' peuvent être réécrites en remplaçant les chaînes en dur par les variables correspondantes.
    Il devient enfin possible de faire (manuellement bien sûr) la traduction des chaînes de caractères qui seront incluses dans le fichier de traduction.

    Automatiser une telle procédure n'est utile que si le code que vous devez traiter est très très très long.
    Pour quelques dizaines de MsgBox, mieux vaut les gérer une par une à la main.
    En effet, parser du code de façon automatique et propre n'est pas une mince affaire. Il faut utiliser des expressions régulières, mais il est compliqué de gérer proprement toutes les syntaxes acceptées par l'éditeur VBA.
    En particulier, détecter si un ensemble de caractères sera interprété comme une instruction n'est pas trivial.

    Cdt

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2017
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2017
    Messages : 1 043
    Points : 391
    Points
    391
    Par défaut
    Bonjour et merci

    Je vais m'inspirer de cela pour trouver la meilleure technique.

    En fait je modifierai à la main, cela ne me pose pas de problème même si c'est effectivement long.

    Mon problème de base et surtout de les détecter car j'ai environ 300 modules dans une trentaine de classeur et je crains de ce fait d'en oublier.

    Votre réflexion me fait penser qu'une solution pourrait être de copier par classeur tous les codes des modules et des feuilles dans un Word, en série, et tout simplement de chercher "Msgbox" avec la fonction ctrl + F

    Cela me permettrait de les repérer pour ensuite retourner dans le code avec l'éditeur et les modifier.

    Fastidieux mais sur.
    Il ne savait pas que c'était impossible, donc il l' a fait...

  4. #4
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    juin 2013
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2013
    Messages : 475
    Points : 953
    Points
    953
    Par défaut
    Si vous ne souhaitez pas coder la mise à jour de vos programmes et qu'il est acceptable de faire les modifs "à la main", je vous propose la méthode suivante :
    1. Dans l'éditeur VBA, faites Ctrl+H. Remplacez toutes les occurrences de 'MsgBox' (dans tout le Projet) par une chaîne de caractères qui n'apparaît nul part dans votre code (par exemple '#~$~#').
    2. Vous pouvez alors faire une recherche (Ctrl+F) sur votre chaîne de caractères de remplacement (par exemple '#~$~#'). A chaque fois qu'une occurrence est trouvée, remplacer la manuellement par 'MsgBox' et traduisez les chaînes de caractères associées dans la langue souhaitée. Puis passez à l'occurrence suivante.
    3. Une fois que plus aucune occurrence de votre chaîne de remplacement n'est trouvable dans votre projet, vous êtes sûr d'avoir traiter tout ce qui devait l'être.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2013
    Messages : 55
    Points : 80
    Points
    80
    Par défaut
    Bonjour à vous. je vous propose une deuxième méthode, celle que j'utilise depuis des années : j'ai aussi une base de centaines de modules (classes, formulaires) partagés entre plusieurs classeurs.

    Lorsque je modifie l'un d'entre eux, je le sauvegarde dans un dossier base de référence et je fais attention à ne pas écraser une version plus à jour issue d'une sauvegarde en provenance d'un autre classeur. (j'utilise fc ou winmerge pour être sûr)

    Je compare l'export des éléments d'un classeur avec ma base. J'utilise la "Microsoft Visual Basic for extensibility" , et l'instruction :
    - ActiveWorkbook.VBProject.VBComponents("Module1").Export "C:\dossier base de référence\mon élément de classeur à sauvegarder"
    possibilité de démarrer avec https://github.com/todar/vba-project

    Pour rechercher des chaines afin de faire toutes les modifications nécessaires permettant de garder la compatibilité de mes modules entre eux, j'utiliser la commande DOS findstr.
    Ainsi je n'ai pas à valider l'écran de recherche CTRL+F, j'enregistre éventuellement le résultat de la commande pour traiter au fur et à mesure des modifications si la tâche est longue.

    On trouve aussi des composants qui liste les éléments d'un classeur afin de les réimporter par une instruction Import toujours sur la collection ActiveWorkbook.VBProject.VBComponents.

    Tous mes éléments de classeur Excel (components), gèrent les messages dans 2 langues actuellement.
    J'ai conservé tous les messages d'erreurs bas niveau qui ne devraient pas arriver en anglais seulement.

    Bon courage.
    Cordialement

  6. #6
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    juillet 2017
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juillet 2017
    Messages : 1 043
    Points : 391
    Points
    391
    Par défaut
    Merci à tous

    #4
    en fait il suffit de faire "Ctrl + F" et rechercher "Msgbox" sur tout le projet et on a toutes les Msgbox

    Cela marche pour toutes les macros, y compris le code des feuilles.
    Il ne savait pas que c'était impossible, donc il l' a fait...

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

Discussions similaires

  1. [VBA-E] insertion images existante dans le classeur
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/03/2006, 23h50
  2. [VBA-E] Naviguer dans un classeur
    Par maketossss dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/12/2005, 13h25
  3. Gestion d’Un Msgbox dans la Fermeture d’une application
    Par hoummass dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/11/2005, 16h44
  4. VB6 : création de feuilles dans un classeur Excel
    Par getea85 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/11/2005, 16h37
  5. Changer de feuille dans un classeur Excel
    Par couiss dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 09/05/2005, 10h05

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