Problèmes d'exécution de script vbs via ETL BODI
Bonjour
Je suis un peu débutant en VBS et je fais face à un soucis dont j'ai du mal à me défaire. Et j'essaye de faire le tour de tous les possibilités.
J'ai un script vbs qui transforme un fichier csv en xlsx. (Je peux joindre le code même si ce n'est pas lui qui doit poser problème).
Ce vbs est déclenché par le lancement d'un .bat qui lui même est déclenché par un etl (BO DataIntegrator).
Tout se fait sur un serveur.
Lorsque je lance ce .bat via cmd (en utilisant un compte adminsvr ou adminservice qui sont tous les 2 administrateurs du serveur) , tout se passe à merveille et mon fichier est généré.
Lorsque je le lance par l'ETL (l'ETL étant configuré pour être lancé par adminsvr ou adminservice, j'ai testé les 2 configurations), le vbs plante avec en erreur :
07/05/2018 10:16:16 Erreur : 1004 Microsoft Excel ne peut accéder au fichier «*C:\test\test_csv.csv*». Plusieurs raisons sont possibles*:
• Le nom du fichier ou le chemin d'accès n’existe pas.
• Ce fichier est actuellement utilisé par un autre programme.
• Le classeur que vous essayez d’enregistrer porte le même nom qu’un classeur actuellement ouvert.
Ci joint le code du vbs :
Code:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| Option Explicit
Const ForReading = 1
Const ForWriting = 2
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
'///// Variable Declare
Dim book, CsvInput ,ExcelOutput ,csvbook, objfile
Dim fs, sArg
Dim objFSO2 : Set objFSO2 = CreateObject("Scripting.FileSystemObject")
Dim ficLog : Set ficLog = objFSO2.OpenTextFile("csv_to_excel.txt", 8, true)
ficLog.WriteLine Now & " Etape 0 : "
'On récupère les arguments
Set sArg = WScript.Arguments
'Il y a 2 arguments, fichier en entrée, fichier de sortie
If sArg.Count <> 2 Then
WScript.Quit
End If
'On récupère les 2 arguments.
CsvInput = sArg(0)
ExcelOutput = sArg(1)
'CsvInput = "\\pdecisds01wv\BODS\FLUXEGEE\out\gegse\C01\Suivi\test_csv.csv"
'ExcelOutput = "\\pdecisds01wv\BODS\FLUXEGEE\out\gegse\C01\Suivi\C01_tableau_histo.xlsx"
CsvInput = "c:\test\test_csv.csv"
ExcelOutput = "c:\test\C01_tableau_histo.xlsx"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
WScript.Sleep 10000
'///// Open objects
Dim objFSO : Set objFSO = CreateObject ("Scripting.FileSystemObject")
' - File system object
Dim XL : Set XL = CreateObject ("Excel.Application")
' - Excel object
'///// Properties Excel object
XL.Visible = False
XL.DisplayAlerts = False
XL.SheetsInNewWorkbook = 1
set book = XL.Workbooks.Add
WScript.Sleep 10000
ficLog.WriteLine Now & " Etape 1 : suppression de xlsx"
'///// Supprime l'ancienne feuile excel
Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(ExcelOutput) Then
FSO.DeleteFile(ExcelOutput)
End If
'///// Ouvre le csv sous Excel
Set objFSO = CreateObject("Scripting.FileSystemObject")
ficLog.WriteLine Now & " Etape 2" & CsvInput
On Error Resume Next
Set objfile = objFSO.GetFile(CsvInput)
If Err.Number <> 0 Then
ficLog.WriteLine Now & " Erreur : " & CStr(Err.Number) & " " & Err.Description
WScript.Quit Err.Number
end if
On Error GoTo 0
ficLog.WriteLine Now & " Etape 3 " & objFSO.GetAbsolutePathName(objFile)
On Error Resume Next
Set csvBook = XL.Workbooks.Open(objFSO.GetAbsolutePathName(objFile))
If Err.Number <> 0 Then
ficLog.WriteLine Now & " Erreur : " & CStr(Err.Number) & " " & Err.Description
WScript.Quit Err.Number
end if
On Error GoTo 0
ficLog.WriteLine Now & " Etape 4"
On Error Resume Next
csvBook.Sheets (1).Copy ,book.Sheets (1)
If Err.Number <> 0 Then
ficLog.WriteLine Now & " Erreur : " & CStr(Err.Number) & " " & Err.Description
WScript.Quit Err.Number
end if
On Error GoTo 0
ficLog.WriteLine Now & " Etape 5"
csvBook.Close
ficLog.WriteLine Now & " Etape 6"
'///// Enregistre le csv sous format excel
book.Sheets (1).Delete
ficLog.WriteLine Now & " Etape 7"
book.SaveAs ExcelOutput
book.Close
XL.SheetsInNewWorkbook = 3
XL.Quit
'// réouvre le workbook pour revalider la colonne des PDS
Dim Xlapp 'Excel
Dim wb, feuille 'le classeur
Set XlApp = CreateObject("Excel.application")
XlApp.Visible = false
Set Wb = XlApp.Workbooks.Open(ExcelOutput)
Wb.Sheets(1).Range("G2:G65536").Value = Wb.Sheets(1).Range("G2:G65536").FormulaR1C1
wb.close true 'ferme avec sauvegarde
XlApp.quit 'quitte excel
Set Wb = Nothing
Set XlApp = Nothing
'//////// Functions ////////
Function DeleteFile(sFile, bForce)
Dim oFso, iRet
On Error Resume Next
Set oFso = CreateObject("Scripting.FileSystemObject")
oFso.DeleteFile sFile, bForce
iRet = err=0
Err.Clear
On Error Goto 0
Set oFso = Nothing
DeleteFile = iRet
End Function |
A garder à l'esprit que ça fonctionne très bien sur un autre serveur avec ETL configuré sur adminservice. Seule différente étant que celui qui ne fonctionne pas est en windows 2012 R2 (avec un excel 2016) et celui qui fonctionne en Windows server 2003 (avec excel 2007).
Après je suis peux être pas sur le bon forum et devrait aller plus du coté administration serveur.
Merci d'avance pour votre aide.