Batch / Macro Vba

Résolu
Signaler
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
-
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
-
Bonjour à toute la communauté,

  j'aurai une question concernant le couple Batch / Macro Vba.
Le contexte est assez simple ... quoi que tordu mais bon on ne discute pas les choix d'un client ... enfin on peut toujours en discuter mais vu qu'il a toujours raison même quand il a tort (-.-')

Voilà mon soucis, j'ai du développer une macro Vba, permettant à partir d'extraction de donnée d'un SI, mettre à jour une BD Access pour un autre SI (du bonheur). Cette macro est un fichier Excel permettant au client de saisir les règles de transformation des données et suivre les tables de correspondance entre les 2 systemes.
Jusqu'ici rien de bien bien compliqué, un classique de l'utilisation Vba sur des méthodo de SI.

Non là où ça se gate c'est que cette macro doit pouvoir être lancé manuellement de temps en temps ou sur demande spécifique mais aussi de façon périodique (tous les jours à 2 h du mat)
Dans cette macro, je possède un  module Main et plusieurs procédures.
Je me suis donc orienté sur un batch qui sera lancé par tache planifié sur le serveur.

Mon soucis est de lancer la procédure que je souhaite à partir de ce batch .... j'arrive à lancer Excel sans soucis mais j'aimerai bien pouvoir lancer directement la procédure. Voici le code mis en place :

@ECHO OFF

REM ========================================
REM
REM
REM ========================================

REM Rafraîchir l'écran...
CLS
ECHO.

TITLE [Tentive de lancement d'une macro InjecteurOrcad]

REM On cherche et on detruit les applications excel lancer
REM Mais pkoi est il aussi méchant ... parce que parce que !!
TaskList | findstr /c:excel.exe > nul
If ErrorLevel 0 Taskkill /IM excel.exe

REM Tente de lancer le service...
START excel.exe "monfichier.xlsm"

REM Teste le lancement du fichier excel
IF ErrorLevel 1 GOTO ErreurLancement

REM on est bon
ECHO [%Date% - %Time%] - SUCCES - Démarrage de la macro. >> Log.txt
GOTO End

:ErreurLancement
REM Echec du lancement
ECHO [%Date% - %Time%] - ERREUR - Démarrage de la macro. >> Log.txt
GOTO End

:End

Et là bien sur j'ai tenté de faire un petit START excel.exe "monfichier.xlsm!Main.P_Main()" mais bien sur ça ne fonctionne pas . comment peut on faire pour lancer cette macro directement sans passer par les options du openform ou du workbook_open

.... il est possible aussi que ce post ne soit pas dans la bonne section ... mais je voyais pas trop où le placer

Merci pour votre aide.

7 réponses

Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Bonjour,

   Juste une idée en passant, n'ayant pas approfondi la question.
   Ne pourrais-tu pas récupérer un paramètre dans ton WorkBook, celui-ci étant lancé par ta ligne de commande.

En espérant pouvoir t'aider.

Calade
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
1
Ok alors à ma surprise j'ai opté pour la solution de Calade ^^

En effet il est possible de passer des options lors de la demande de lancement de Excel voici le code du batch dans un premier temps

@ECHO OFF

REM ========================================
REM
REM
REM ========================================

REM Rafraîchir l'écran...
CLS
ECHO.

TITLE [Tentive de lancement d'une macro InjecteurOrcad]

REM On cherche et on detruit les applications excel lancer
REM Mais pkoi est il aussi méchant ... parce que parce que !!
TaskList | findstr /c:excel.exe > nul
If ErrorLevel 0 Taskkill /IM excel.exe

REM Tente de lancer le service...
START excel.exe /e/automate "monfichier.xlsm"

REM Teste le lancement du fichier excel
IF ErrorLevel 1 GOTO ErreurLancement

REM on est bon
ECHO [%Date% - %Time%] - SUCCES - Démarrage de la macro. >> Log.txt
GOTO End

:ErreurLancement
REM Echec du lancement
ECHO [%Date% - %Time%] - ERREUR - Démarrage de la macro. >> Log.txt
GOTO End

:End

Ensuite il suffit de faire un test lors de l'ouverture du Woorkbook ... ici c'est la partie qui me frustre ... mais bon faut savoir accepter sa défaite ... Voici donc le code placé du coté du fichier Excel

Private Declare Function GetCommandLine _
   Lib "kernel32" Alias "GetCommandLineA" _
   () As Long

Private Declare Function lstrlen _
   Lib "kernel32" Alias "lstrlenA" _
   (lpString As Any) As Long

Private Declare Function lstrcpy _
   Lib "kernel32" Alias "lstrcpyA" _
   (lpString1 As Any, lpString2 As Any) As Long
  
' On regarde si cela fur ouvert par le batch
Public Sub Workbook_Open()

   Dim CmdLine As String 'Ligne de Commande
   Dim CmdArgs() As String 'Tableau des paramétres de Commande

   CmdLine = GetCmd 'Lire la ligne de Commande
   If CmdLine = "" Then
       Exit Sub
   End If
  
   If InStr(1, CmdLine, "/e/automate") <> 0 Then
     Call P_Main
   End If

End Sub
Private Function GetCmd() As String 'Tony Proctor microsoft.public.vb.winapi
   Dim lpCmd As Long
   lpCmd = GetCommandLine()
   GetCmd = Space$(lstrlen(ByVal lpCmd))
   lstrcpy ByVal GetCmd, ByVal lpCmd
End Function

Voilà ici c'est sur c'est pas optimal mais j'approche des deads lines ... donc on vera si j'ai le temps d'ameliorer ça plus tard

Merci à tous pour vos idées
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
1
Genre une procédure lancé a l'ouverture du WB  faisant un test sur les parametres et si pas de paramètre alors manuel sinon lancement de ma procédure

le problème reste sur le passage de paramètre... j'arrive déjà pas à lancer une macro alors faire passer des paramètres directement à Excel je vois pas trop comment faire
Messages postés
20
Date d'inscription
mercredi 6 juin 2007
Statut
Membre
Dernière intervention
11 juin 2009
1
Je vais peut être dire une bêtise mais en faisant un public sub auto_open() dans ton module cela t'offre la possibilité à l'ouverture de ton doc de faire une série de test
par exemple analyser les données présentes dans un fichier *.log que ton script aura au préalable créé et contenant tes paramétres
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
1
Hey même si la méthode n'est pas vraiment la plus optimale (j'arrive pas à croire qu'on ne soit pas capable de lancer ces macros directement ... )  je risque de devoir gérer la possibilité que mon test de la macro soit lancé avant l'écriture dans le fichier log ... de plus ça me demande une lecture d'un fichier ... rapide quand il est petit mais prendra de plus en plus de temps quand ton log aura 2 ans
Je jette un oeil sur d'autres méthodes mais sinon ca sera pour l'option que tu m'as proposé
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Re bonjour,

   Je crois que j'ai pas été assez explicite, mais c'est exactement ce que je voulais dire. Récupérer le paramètre lancé depuis ton batch lors de la l'ouverture de ton workbook et de là tu lances ou non ta macro.

Calade
Messages postés
80
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
2 octobre 2009
1
Oui Calade je l'avais bien compris comme ça mais le problème que j'avais à la base était de faire comprendre au batch que je voulais faire passer des paramètres mais que j'ai trouvé c'est tout bon ^^