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

VBScript Discussion :

Créer une macro Excel en VBScript


Sujet :

VBScript

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut Créer une macro Excel en VBScript
    Bonjour,

    J'ai un script VBS qui importe des données d'un fichier texte dans une feuille Excel et qui met en forme les données.
    Je souhaite maintenant créer une macro (module) Excel par VBS de façon automatisée. C'est à dire que le script VBS va créer, écrire et lancer une macro écrite en VBA.
    Le début de mon script fonctionne mais j'ai un premier soucis (je pense que ce ne sera pas le seul) qui est le suivant :

    Cette ligne m'embête car elle ouvre un autre classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set fichxl = exl.workbooks.add
     
    'Ajoute un module
    	Set mdle = fichxl.VBProject.VBComponents.Add(1)
    Alors que je voudrais que la macro se crée dans le classeur que je viens d'ouvrir avant. Voici l'ensemble du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'Fichier à ouvrir
    	Fichier_XLS = "C:\ControleDisque.xls"
    	Set exl = WScript.CreateObject("excel.Application")
    	exl.Visible = True 'False
    'Ouverture du fichier
    	exl.workbooks.open Fichier_XLS
     
                 set fichxl = exl.workbooks.add
     
    'Ajoute un module
    	Set mdle = fichxl.VBProject.VBComponents.Add(1)
    Lorsque j'effectue des modifs pour corriger le problème, j'ai beaucoup d'erreurs de manipulation d'Objet. Je ne doit pas être loin de la solution mais pour l'instant je coince.

    En espérant d'avoir des infos pour trouver la solution.

    Merci d'avance

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonsoir, ghostvb

    je suis un peu perplexe devant tes intentions, pourquoi créer une macro VBA puis l'exécuter .. tu peu agir directement sur ton classeur Excel avec ton script vbs !

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    Bonsoir bbil,

    C'est dans une volonté de totale automatisation du script que je pensais faire de la sorte, pour qu'il s'exécute de façon transparente sans aucune intervention extérieure. Comme cela on peut intégrer ce que l'on veut ensuite (graphique,....) pour traiter les infos de la feuille Excel.
    Mon idée est peut-être farfelue ?
    S'il existe un moyen plus facile, je suis preneur.
    Que veux-tu dire par " tu peu agir directement sur ton classeur Excel avec ton script vbs " ?

    Merci

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    On dit souvent que la nuit porte conseil car je viens de trouver ce matin en arrivant au boulot.
    Voici un code pour ouvrir un fichier existant et écrire une macro vba le tout piloté par du VBScript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    	Set exl = WScript.CreateObject("Excel.Application")
    	exl.Visible = True 'False
     
    	Set sh = WScript.CreateObject("WScript.Shell") 
    	on error resume next
    	sh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\accessVBOM",1,"REG_DWORD"
    	on error goto 0
     
    'Ouvre le fichier 
    	set fichxl = exl.workbooks.add("C:\ControleDisque.xls")
     
    'Ajoute un module
    	Set mdle = fichxl.VBProject.VBComponents.Add(1)
     
     
    'Ecrit la macro dans le fichier Excel
    	num=0
    	num=num+1:mdle.CodeModule.InsertLines num, "Sub MacroMiseEnFormeImportTxt()"
    	num=num+1:mdle.CodeModule.InsertLines num, "'"
    	num=num+1:mdle.CodeModule.InsertLines num, "' MacroMiseEnFormeImportTxt Macro"
    	num=num+1:mdle.CodeModule.InsertLines num, "' Macro enregistrée le 22/08/2008 par pl"
    	num=num+1:mdle.CodeModule.InsertLines num, "'"
    	num=num+1:mdle.CodeModule.InsertLines num, "'"
    	num=num+1:mdle.CodeModule.InsertLines num, "End Sub"
    Après à chacun d'y inclure ce qu'il veut dans sa macro

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par ghostvb Voir le message
    ...
    Mon idée est peut-être farfelue ?
    ...
    en tout cas je n'en comprends pas le but .. la macro écrite par ton script va être lancée comment ? et quand (par rapport à son écriture) ?

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    Après son écriture, elle se lancera tout de suite et ensuite le fichier xls sera envoyé par mail à d'autres utilisateurs pour consultation ou analyse. C'est pour une analyse de charge de serveur de fichier qui sera exécuté en fond tous les jours. Je ne veux pas d'intervention par un utilisateur du début à la fin.

    Si il y a d'autres solutions à explorer et plus simples, je suis preneur sans problème !!!

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    pkoi créer une macro ?
    Tu pourrais plutot dans ton script créer une fonction qui fait ce que fait la macro, mais donc lancé par le script.

    Je comprendrais l'intérêt de la macro si celle-ci se lançait automatique à l'ouverture du classeur reçu par l'utilisateur.
    Par contre si tu exécutes la macro sur le classeur, avant de l'envoyer à l'utiliateur, elle n'a pas plus d'intérêt qu'une fonction VBS de ton script qui ferait les même opérations.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Par défaut
    Si je comprends bien :

    *script qui importe des données et crée le fichier Excel
    Lance le script vbs "macro" qui effectue les traitements dans le fichier xls

    *script "macro" du type :
    fonction "ce que fait la macro"
    (en vba ou en vbs ?)
    ...
    ...
    end fonction

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par ghostvb Voir le message
    Si je comprends bien :

    *script qui importe des données et crée le fichier Excel
    Lance le script vbs "macro" qui effectue les traitements dans le fichier xls

    *script "macro" du type :
    fonction "ce que fait la macro"
    (en vba ou en vbs ?)
    ...
    ...
    end fonction
    Pas besoin de lancer un script, il a juste à faire appelle à une fonction qu'il possède.
    Je rappelle qu'un script ce n'est pas juste une suite de ligne de code, il peut être stucturé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    'Appelle le sub principale
    main
     
    'Sub principale
    Sub main()
    'Appelle f1
        f1
     
    'Appelle f2
        f2
     
    'Appelle f3
        f3
    End Sub
     
    'Fonction f1
    Function f1()
    End Function
     
    'Fonction f2
    Function f2()
    End Function
     
    'Fonction f3
    Function f3()
    End Function

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Par défaut
    Désolé de déterrer le sujet mais je voulais remercier ghostvb pour ça solution
    Ceci correspond exactement à ce dont j'avais besoin
    Pour répondre au question "mais à quoi cela peut-il bien servir ?", ben la réponse est déjà dans la proposition de bbil
    la macro écrite par ton script va être lancée comment ? et quand (par rapport à son écriture) ?
    La macro que j'ai besoin d'écrire sera exécutée dans le futur à une date dont je ne connais pas la valeur.
    Exemple sur mon cas :
    Je fais un script qui interroge une base de données changeante (en fait je reçois des copies de la bases de données, c'est pour ça que je ne peux pas y inclure du VBA et que j'ai réalisé mon script en VBS).
    Ce script génère des excels et par exemple des tcd.
    Mais bon le gros problème des tcd, pour moi, c'est que le choix des options est caché, du coup c'est une source d'erreur. (genre mince j'avais oublié que j'avais préselectionné ceci au début, j'ai plus qu'à tout refaire )
    Donc je veux réaliser (je l'ai pas encore fait mais j'y travaille), une macro VBA, ce coup-ci qui lors d'une modification de selection dans les champs du tcd, elle mets à jours un autre tableau qui indique la valeur des différents choix .
    L'exécution de cette macro et de mon script sont indépendant dans le temps ("presque indépendant", en fait. Il faut quand même que mon script est était lancé avant la macro, en tout rigueur )

    Rajout d'une petite précision qu'il m'a fallut chercher.
    Si vous voulez ajouter un code VBA qui réagit à un événement vous devez le faire dans la feuille excel correspondant du coup le code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set mdle = objExcel.Workbooks(1).VBProject.VBComponents(xlsheet2.name)
    num=0
    num=num+1:mdle.CodeModule.InsertLines num, "Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)"	
    num=num+1:mdle.CodeModule.InsertLines num, "'"
    num=num+1:mdle.CodeModule.InsertLines num, "MsgBox ""Le TCD '"" & Target.Name & ""' a été mis à jour."""
    num=num+1:mdle.CodeModule.InsertLines num, "End Sub"
    num=num+1:mdle.CodeModule.InsertLines num, "'"
    par exemple

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

Discussions similaires

  1. [XL-2007] Comment créer une macro en boucle sous excel ?
    Par jib orhan dans le forum Excel
    Réponses: 2
    Dernier message: 15/04/2014, 13h16
  2. [XL-2007] Créer un laptimer dans une macro excel
    Par race94 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/02/2011, 11h43
  3. [XL-2003] Créer une macro pour plusieurs fichiers excel
    Par bocki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 22h53
  4. [XL-2000] Créer une macro automatique à l'ouverture d'Excel
    Par Nicolas Plan dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/04/2009, 11h27
  5. Réponses: 1
    Dernier message: 08/10/2008, 15h30

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