Ouverture de Excel par Batch

hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 - 13 mai 2009 à 11:06
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 - 22 mai 2009 à 12:12
Bonjour à tous,

  voici maintenant 5 jours que je bloque sur un problème d'ouverture de fichiers Excel par un batch. Voici le sujet général du système que l'on me demande de mettre sur place :
<li> Extraction de donnée d'un système SAP pour injection dans un logiciel de conception de carte électronique
</li><li>Création d'une tache planifiée s'exécutant la nuit permettant l'injection des données SAP dans la Database du software</li>Donc ça c'était le cahier des charges super développé que m'a fournit mon client. Je l,ai donc résolu de cette façon :
<li>Création d'une transaction SAP permettant l'extraction des données (format prédéfini par mes soins et de format txt)</li><li>Création d'un tache planifié sur le serveur hébergeant la base de donnée</li><li>Création d'un batch permettant l'ouverture d'un fichier Excel</li><li>Création de macros transformant les données dans le bon format et injection des données dans la base de donnée</li>Les étapes sont clair, ont fonctionnées en phase de test et c'etait normalement le bonheur
Mais voilà, bien sûr lorsque nous l'avons mis en prod, l'ouverture de la macro ne s'est effectuée correctement ... et là ça bloque.
Le code du batch est le suivant :

@ECHO OFF

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

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

REM Définition du titre de la fenêtre...
TITLE [Tentive de lancement d'une macro InjecteurOrcad]

ECHO [%Date% - %Time%] - SUCCES - Démarrage de Batch_InjecteurOrcad.bat. >> Log.txt

TaskList | findstr /c:excel.exe > nul
If ErrorLevel 0 Taskkill /F /IM excel.exe

REM Tente de lancer le service...
Timeout /T 5 /NOBREAK
START Excel.exe /e/automate "InjecteurOrcad.xlsm"

REM (En cas de réussite...)
REM Enregistrement dans le fichier Log...
ECHO [%Date% - %Time%] - SUCCES - Démarrage de la macro Excel. >> Log.txt
GOTO End

REM Fin du travail du Batch...
:End

Bon et dans le fichier excel j'ai mis le code suivant dans Workbook :

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
  
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
 (ByVal lpBuffer As String, nSize As Long) As Long

Private S_user As String

' On regarde si cela fut 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

   Application.DisplayAlerts = False

   CmdLine = GetCmd 'Lire la ligne de Commande
   If CmdLine = "" Then
       Exit Sub
   End If
  
   ' on recupere le nom de l'utilisateur en cours
   S_user = OSUserName
  
   ' on log l'ouverture de la macro
   Call LogUser("Open")
  
   ' on regade si il s'agit du traitement automatique
   If InStr(1, CmdLine, "/e/automate") <> 0 Then
     Call P_Main
     Call P_AnalyseLog

     ' ThisWorkbook.Close
     Call Workbook_BeforeClose(False)
     Application.Quit
   End If

End Sub

' on effectue la sauvegarde automatique du WB
Public Sub Workbook_BeforeClose(Cancel As Boolean)
  Call LogUser("Close")
  ThisWorkbook.Save
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

Function OSUserName() As String'extrait d'un code de Paul, Dave Peterson Exelabo
 Dim Buffer As String * 256
 Dim BuffLen As Long
   BuffLen = 256
   If GetUserName(Buffer, BuffLen) Then _
     OSUserName = Left(Buffer, BuffLen - 1)
End Function

' inserer le nom de l'utilisateur lors de l'ouverture et la fermeture de la macro
' [11/05/2009 -  5:33:25,20] - SUCCES - Démarrage de la macro Excel.
Public Sub LogUser(mode As String)
Dim S_Date As String
Dim S_Ligne As String
Dim fso As FileSystemObject
Dim TextStream

  ' recuperation de la Date
  S_Date = Now
  S_Ligne = "[" & Left(S_Date, 10) & " - " & Right(S_Date, 8) & ",00] - "
  ' Ouverture ?
  If mode = "Open" Then
    S_Ligne = S_Ligne & "OPEN - user name : " & S_user
  ' Fermeture
  Else
    S_Ligne = S_Ligne & "CLOSE - user name : " & S_user
  End If
 
  ' ouverture du fichier log.txt
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(ThisWorkbook.Path & "\Log.txt") Then
    Set TextStream = fso.OpenTextFile(ThisWorkbook.Path & "\Log.txt", 8)  ' true <=> overwriting
  Else
    Set TextStream = fso.CreateTextFile(ThisWorkbook.Path & "\Log.txt", False) ' true <=> overwriting
  End If
  ' ecriture de la ligne
  TextStream.WriteLine (S_Ligne)
 
  ' fermeture du fichier log.txt
  TextStream.Close
 
  ' on vide les pointeurs
  Set TextStream = Nothing
  Set fso = Nothing
 
End Sub

Maintenant la grande question qui se pose c'est pourquoi lors de l'execution la nuit le fichier Excel ne s'ouvre pas ?
Trace dans log.txt:
[11/05/2009 -  0:20:22,96] - SUCCES - Démarrage de Batch_InjecteurOrcad.bat.
[11/05/2009 -  0:20:27,25] - SUCCES - Démarrage de la macro Excel.

alors que j'aurai du avoir juste en dessous des lignes du genre :
[11/05/2009 - 00:40:34,00] - OPEN - user name : script
[11/05/2009 - 00:40:38,00] - CLOSE - user name : script

Alors les pistes qui me restent sont celles ci :
<ol><li>Aucune session n'est ouverte sur le serveur à cette heure ci et le processus Excel ne peut pas se lancer</li><li>J'ai fait de la M***E au niveau du code et je suis un gros mauvais
</li><li>les dieux de l'informatique sont définitivements contre moi pour avoir maudit SAP pendant 8 mois ...</li></ol>Si des personnes auraient des pistes de reflexions et d'études sur ce problème je suis preneur.

Merci

7 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 11:19
je sais pas grand chose des arguments en ligne de commande.
mais je sais que ton code utilise inutillement les APIs...

S_Date = Now
S_Ligne = "[" & Left(S_Date, 10) & " - " & Right(S_Date, 8)

NON !!!!! on ne fais JAMAIS d'apriori sur les regional settings.
faire, simplement:
S_Ligne = Format$(Now, "dd\/mm\/yyyy - hh:nn:ss\,\0\0")

LogUser s'écrit même:

Public Sub LogUser(mode As String)
Dim iFile As Integer
Dim S_Ligne As String
S_Ligne = Format$(Now, "dd\/mm\/yyyy - hh:nn:ss\,\0\0")
If mode = "Open" Then
S_Ligne = S_Ligne & "OPEN - user name : " & S_user
Else
S_Ligne = S_Ligne & "CLOSE - user name : " & S_user
End If

iFile = FreeFile
Open ThisWorkbook.Path & "\Log.txt" For Append As #iFile
Print #iFile, S_Ligne
Close #iFile
End Sub

pour l'username, idem:
environ$("UserName")

suffit.





Pour ton soucis... je me dit que les macros ne sont tout simplement pas actives
0
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
13 mai 2009 à 11:40
Oui je suis d'accord pour les paramètres regionaux je te l'accord j'ai repris du vieux code de mes debuts pour répondre aux besoins urgentissimes qu'avait mon client ( en gros il fallait que tout soit fait dans la minute alors j'y suis un peu allé comme un porc.

Pour le problème d'activation des macros malheureusement, je suis rentré sur le compte script pour les activer et elles sont bel et bien active ( après est ce que les parametres changent suivant le mode d'utilisation ?)

La question que je me pose est sur le fait de fonctionner avec le compte ouvert et le compte utlisateur fermé pour le moment et mes premiers tests m'annoncent clairement qu'il n'y a normalement pas de différence

je déprime sur ce coup là
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 11:50
dans les settings de Excel, (Outils > Macros > Sécurité)

voir a mettre le réglage à sécurité basse.

ainsi, no soucy
mais prudence...

Excel est obligatoire ici ?
pas possible de jouer en VbScript ? (ou autre)
0
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
13 mai 2009 à 11:52
héhé malheureusement c'était une demande explicite du client .... sinon j'aurai visé sur un exécutable java plutôt ... mais bon on peut pas tout avoir ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 mai 2009 à 13:38
ne peux tu pas te 'contenter' de lancer un VbScript, qui pilotera Excel

comme ça, no macro ^^
0
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
14 mai 2009 à 12:04
Bah dans un sens j'aurai peut être pu mais je dois avouer que deux conditions ont jouer en faveur du VBA. La première était les délais que j'avais pour concevoir cette macro (20j/h) et que le VbScript m'aurait demandé une petite phase d'adaptation, la seconde condition est surtout que mon client n'a des connaissances que sur le VBA (et encore je viens de m'apercevoir que leur connaissance consistait a faire des enregistrements de macro ... ce qui les aidera pas vraiment pour comprendre ce que j'ai fait)

Sinon cette nuit le batch a tourné ... encore une fois en erreur mais j'ai rajouté une serie de traces qui confirmerai le principe de non activation des macros ... cependant une tache planifiée à été programmé ce matin à 9h dans les mêmes conditions ... et miracle ça a fonctionné ... je commence à me demander si on m'aurait pas menti sur ce qui se passe sur le serveur durant le nuit ... me reste a trouver ce qui empeche Excel de se lancer correctement pendant la nuit
0
hebus16 Messages postés 80 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 2 octobre 2009 1
22 mai 2009 à 12:12
Voilà ... complètement bloqué sur ce sujet là ...

  après 7 jours de tests, je reste complètement dégouté du comportement du processus. Apparemment ce serait dû à un problème d'ouverture de session ... et encore je n'en suis même pas sûr.
 
Pour vous expliquez :

  je suis parti du principe que le problème venait de l'heure d'exécution de la macro et j'ai donc décidé de répéter la macro toutes les 30 minutes ... et à ma grande surprise, la macro ne s'est jamais exécuté jusqu'à 9h30 ... et encore en regardant dans les traces Windows je me suis aperçu que l'événement déclencheur était la connexion d'un autre compte ...

 le lendemain j'ai donc programmé deux taches planifiées sur deux comptes différents ... et magie la macro s'est exécuté dès la première tentative du second compte à 00h50 (10 minutes après la première tentative) et là je désespère . . .

J'ai inversé ensuite l'ordre d'exécution des comptes ( au cas où que ça vienne des comptes) et pas de chance le comportement fut le même

Pour finir j'ai exécuté le tout 20 minutes plus tôt pour vraiment m'assurer que ça ne vienne pas de l'heure et rebelotte tout à marcher suivant le premier comportement ...

là maintenant je vois plus trop sur quoi interagir  pour permettre une exécution propre du processus

si il existe une personne ayant eu ce cas completement tordu ... je veux bien avoir un peu d'aide ...

PS : pour la petite blague .. J'ai mis en place le processus sur un poste classique de l'entreprise (Windows XP) ayant un acces distant sur le serveur ... et là tout a fonctionné proprement Y'a de quoi devenir chèvre ...
0
Rejoignez-nous