hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention 2 octobre 2009
-
13 mai 2009 à 11:06
hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDerniè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
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.
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
hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention 2 octobre 20091 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
hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention 2 octobre 20091 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 ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention 2 octobre 20091 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
hebus16
Messages postés80Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention 2 octobre 20091 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 ...