Dans le cadre d'un de mes scripts qui fait une compilation de fichiers Excel vers un fichier unique, puis fait une série de modifications dans les fichiers Excel source, je rencontre un problème (en fait, deux).
En effet, j'ai du mal à ouvrir mon fichier unique (ça ne fonctionne que si Excel est déjà ouvert), et je n'ai plus les messages d'erreur qui s'affichent sur tous mes fichiers lorsque je les ouvre (pas de demande de sauvegarde lors d'une fermeture de Excel par exemple).
Je pense que ces problèmes sont liés à la manière dont j'ouvre et je ferme les fichiers Excel dans mon programme, mais je n'arrive pas à mettre le doigt dessus.
Ci dessous, mon code complet. Je sais que c'est le boxon et qu'il faut vraiment que je me discipline pour le nommage des variables
► Afficher le texte
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\WN.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Excel.au3>
#include <array.au3>
#include <File.au3>
$sheetpw = "123456"
$chem_img = @ScriptDir & "\images\"
$chem_imp = @ScriptDir & "\import\"
$trigger = 1
Local $filimp, $i
Local $oAppl = _Excel_Open(False)
Dim $sResult[1][106]
Dim $temp_ligne_value[20]
Dim $recap_nveaux_cl[5]
FileDelete($chem_imp & "*.tmp")
FileDelete($chem_imp & "*.txt")
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("TecReg 1.0", 600, 170, 492, 387)
GUISetBkColor(0xFFFFFF)
$Label1 = GUICtrlCreateLabel("Intégration des nouveaux fichiers régionaux au fichier global", 56, 56, 397, 23)
GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
GUICtrlSetColor(-1, 0x000000)
$Label2 = GUICtrlCreateLabel("Recherche de nouveaux fichiers régionaux", 56, 16, 278, 23)
GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
GUICtrlSetColor(-1, 0x000000)
$Label3 = GUICtrlCreateLabel("Compilation des fichiers régionaux", 56, 96, 205, 23)
GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
GUICtrlSetColor(-1, 0x000000)
$Label4 = GUICtrlCreateLabel("Recherche et intégration des nouveaux clients", 56, 136, 300, 23)
GUICtrlSetFont(-1, 12, 400, 0, "Calibri")
GUICtrlSetColor(-1, 0x000000)
$Pic1 = GUICtrlCreatePic($chem_img & "blanc.jpg", 8, 8, 32, 32)
$Pic2 = GUICtrlCreatePic($chem_img & "blanc.jpg", 8, 48, 32, 32)
$Pic3 = GUICtrlCreatePic($chem_img & "blanc.jpg", 8, 88, 32, 32)
$Pic4 = GUICtrlCreatePic($chem_img & "blanc.jpg", 8, 128, 32, 32)
$Val = GUICtrlCreateButton("Lancer", 480, 8, 113, 121)
$Histo = GUICtrlCreateButton("Historique", 480, 136, 113, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Histo
$log = _CSV2Array(@ScriptDir & "\log\tecreg.log", ";")
_ArraySort($log, 0)
_ArrayDisplay($log)
Case $Val
GUICtrlSetImage($Pic1, $chem_img & "blanc.jpg")
GUICtrlSetImage($Pic2, $chem_img & "blanc.jpg")
GUICtrlSetImage($Pic3, $chem_img & "blanc.jpg")
GUICtrlSetImage($Pic4, $chem_img & "blanc.jpg")
;~ on commence par vérifier s'il y a des fichiers en attente d'intégration
GUICtrlSetImage($Pic1, $chem_img & "encours.jpg")
If FileFindFirstFile($chem_imp & "*.*") = -1 Then
GUICtrlSetImage($Pic1, $chem_img & "nok.jpg")
MsgBox(0, "", "Aucun fichier à intégrer : fin du traitement.")
Exit
EndIf
;~ si c'est le cas, on déplace tous les fichiers du repertoire /Actif/ dans /Import/, à l'exception du ou des fichiers regionaux à importer. Ce qui reste va dans le dossier /Archives/ .
$Files_Import = _FileListToArray(@ScriptDir & "\Import")
$Files_Actif = _FileListToArray(@ScriptDir & "\Actif")
For $i = 1 To UBound($Files_Import) - 1
$temp_import = StringSplit($Files_Import[$i], "_")
$Files_Import_reg = $temp_import[3]
For $j = 1 To UBound($Files_Actif) - 1
$temp_actif = StringSplit($Files_Actif[$j], "_")
$Files_actif_reg = $temp_actif[3]
If $Files_Import_reg = $Files_actif_reg Then
FileMove(@ScriptDir & "\Actif\" & $Files_Actif[$j], @ScriptDir & "\Archives\", 1)
EndIf
Next
Next
FileMove(@ScriptDir & "\Actif\*.*", @ScriptDir & "\Import")
;~ si c'est le cas, on backup le fichier de compilation, on l'efface et on recopie le vierge
FileCopy(@ScriptDir & "\DUPLI LOGICIEL.xls", @ScriptDir & "\BackUp\DUPLI LOGICIEL_" & @MDAY & @MON & @YEAR & ".xls")
FileCopy(@ScriptDir & "\DUPLI LOGICIEL - Original.xls", @ScriptDir & "\DUPLI LOGICIEL.xls", 0)
GUICtrlSetImage($Pic1, $chem_img & "ok.jpg")
GUICtrlSetImage($Pic2, $chem_img & "encours.jpg")
$filimp = _FileListToArray($chem_imp)
$ori_exc = _Excel_BookOpen($oAppl, @ScriptDir & "\DUPLI LOGICIEL.xls", False, True)
;~ Effacement complet du récap
_Excel_RangeWrite($ori_exc, 1, "", "A2:CZ566")
For $i = 1 To $filimp[0]
$temp_excel = _Excel_BookOpen($oAppl, $chem_imp & $filimp[$i], False, True)
;~ Question : avant de décider si l'on efface avant de copier, existe-t-il un onglet avec le même nom dans le fichier de dest ?
For $k = 2 To $ori_exc.Sheets.Count
If $ori_exc.Worksheets($k).Name = $temp_excel.Worksheets(2).Name Then
_Excel_SheetDelete($ori_exc, $k)
EndIf
Next
_Excel_SheetCopyMove($temp_excel, 2, $ori_exc, $i + 1)
;~ On rajoute un timestamp dans le premier onglet
With $temp_excel.Sheets.Item(1)
.Unprotect($sheetpw)
_Excel_RangeWrite($temp_excel, 1, @MDAY & @MON & @YEAR, "C35")
.Protect($sheetpw)
EndWith
_Excel_BookClose($temp_excel)
_Excel_Close($temp_excel)
Next
GUICtrlSetImage($Pic2, $chem_img & "ok.jpg")
;~ on compile les informations de chaque onglet dans le premier onglet
GUICtrlSetImage($Pic3, $chem_img & "encours.jpg")
For $i = 2 To $ori_exc.Sheets.Count
Local $sArray = _Excel_RangeRead($ori_exc, $i, "A2:CZ65")
ReDim $sResult[UBound($sResult) + UBound($sArray)][104]
_ArrayAdd($sResult, $sArray)
Next
$liste_fichiers = _FileListToArray($chem_imp, "*.xls", Default, True)
For $i = 1 To $liste_fichiers[0]
$test = $liste_fichiers[$i]
;~ Attention : si l'argument "invisible" est à True, il est impossible d'afficher les fichiers dans Excel après execution du script /!\
Local $oWorkbook = _Excel_BookOpen($oAppl, $test, False, True)
If _Excel_RangeRead($oWorkbook, 4, "I1") <> "nouveau client" Then
$temp_files = FileOpen(@ScriptDir & "\Import\temp.txt", 9)
FileWrite($temp_files, _Excel_RangeRead($oWorkbook, 4, "I1") & ";" & $test & ";")
FileClose($temp_files)
EndIf
_Excel_BookClose($oWorkbook)
_Excel_Close($oWorkbook)
Next
GUICtrlSetImage($Pic3, $chem_img & "ok.jpg")
_ArrayDeleteEmptyRows($sResult)
_Excel_RangeWrite($ori_exc, 1, $sResult, "A2")
;~ On copie la liste de client du premier onglet
Local $cat_temp = _Excel_RangeRead($ori_exc, 2, "I1:CZ1")
_Excel_RangeWrite($ori_exc, 1, $cat_temp, "I1")
$oAppl.Worksheets(1).Activate
_Excel_BookClose($oAppl)
_Excel_Close($oAppl)
GUICtrlSetImage($Pic4, $chem_img & "encours.jpg")
If FileExists(@ScriptDir & "\Import\temp.txt") = 1 Then
;~ 1 - on met les nouveaux clients dans une array, puis on fait un _arrayunique()
$temp_ligne = FileOpen(@ScriptDir & "\Import\temp.txt")
$temp_ligne_value = StringSplit(FileReadLine($temp_ligne, 1), ";")
For $i = 1 To UBound($temp_ligne_value)
If 2 * Round($i / 2) <> $i Then
$recap_nveaux_cl[Round($i / 2) - 1] = $temp_ligne_value[$i]
EndIf
Next
FileClose($temp_files)
$recap_nveaux_cl = _ArrayUnique($recap_nveaux_cl)
ReDim $recap_nveaux_cl[UBound($recap_nveaux_cl) - 1]
;~ 2 - on ajoute dans chaque fichier les nouveaux clients dans l'onglet 2 (penser à déprotéger l'onglet concerné, puis à le reprotéger)
For $j = 1 To UBound($recap_nveaux_cl) - 1
For $i = 1 To $filimp[0]
$oAppl = _Excel_Open(False)
$temp_excel = _Excel_BookOpen($oAppl, $chem_imp & $filimp[$i], False, True)
With $temp_excel.Sheets.Item(2)
.Unprotect($sheetpw)
$free_cell = _Excel_RangeRead($temp_excel, 2, "A1:CY1")
For $z = 0 To UBound($free_cell, 2)
If $free_cell[0][$z] = "" Then ExitLoop
Next
_Excel_RangeWrite($temp_excel, 2, $recap_nveaux_cl[$j], _Excel_ColumnToLetter($z + 1) & "1")
.Protect($sheetpw)
EndWith
;~ 3 - si le fichier concerné est le même qu'un de ceux présent dans le fichier txt, à la création du client indiqué dans l'onglet 4, on recopie toute la colonne dans l'onglet 2
If $temp_ligne_value[$j * 2] = $chem_imp & $filimp[$i] Then
_Excel_RangeWrite($temp_excel, 2, _Excel_RangeRead($temp_excel, 4, "I2:I179"), _Excel_ColumnToLetter($z + 1) & "2")
;~ 4 - une fois l'opération terminée, on efface le contenu de l'onglet 4 de chaque fichier évoqué dans le fichier txt
_Excel_RangeReplace($temp_excel, 4, "I2:I179", "oui", "")
_Excel_RangeWrite($temp_excel, 4, "Nouveau client", "I1")
MsgBox(0, "", "Merci de relancer le traitement pour regénérer le fichier global.")
$trigger = 0
EndIf
$temp_excel.Worksheets(1).Activate
_Excel_BookSave($temp_excel)
_Excel_BookClose($temp_excel)
_Excel_Close($temp_excel)
Next
Next
EndIf
FileDelete($chem_imp & "*.tmp")
FileDelete($chem_imp & "*.txt")
Dim $sResult[1][106]
;~ 5 - on déplace les fichiers traités dans le répertoire ..\Archives
If $trigger <> 0 Then FileMove(@ScriptDir & "\Import\*.xls", @ScriptDir & "\Actif\", 1)
$trigger = 1
;~ 6 - A VOIR : envoyer automatiquement un mail aux responsables de région correspondants aux fichiers
;~ 7 - On protège le fichier national en écriture
;~ 8 - Prévoir d'intégrer le moteur de création de liste de diffusion dans ce programme, et de faire un mail aux responsables de région à chaque nouvelle diffusion.
GUICtrlSetImage($Pic4, $chem_img & "ok.jpg")
EndSwitch
WEnd
Func _ArrayDeleteEmptyRows(ByRef $_array)
Local $dims = UBound($_array, 0), $fired = 0
If Not IsArray($_array) Or $dims > 2 Then Return
Switch $dims
Case 1 ; array 1D
Local $temp[UBound($_array)]
For $i = 0 To UBound($_array) - 1
If $_array[$i] = "" Then ; si ligne vide (ou autre condition)
$fired += 1
ContinueLoop ; passe à la ligne suivante
EndIf
$temp[$i - $fired] = $_array[$i]
Next
ReDim $temp[UBound($_array) - $fired]
Case 2 ; array 2D
Local $cols = UBound($_array, 2), $row = ""
Local $temp[UBound($_array)][$cols]
For $i = 0 To UBound($_array) - 1
For $j = 0 To $cols - 1
$row &= $_array[$i][$j] ; concatène la ligne
Next
If $row = "" Then ; si ligne vide (ou autre condition)
$fired += 1
ContinueLoop ; passe à la ligne suivante
EndIf
For $j = 0 To $cols - 1
$temp[$i - $fired][$j] = $_array[$i][$j]
Next
$row = ""
Next
ReDim $temp[UBound($_array) - $fired][$cols]
EndSwitch
$_array = $temp
$temp = ""
EndFunc ;==>_ArrayDeleteEmptyRows
Func _CSV2Array($fichier_suivi, $separateur)
$fichier_suivi = StringStripWS(FileRead($fichier_suivi), 7)
$rows = StringSplit($fichier_suivi, @CRLF)
Dim $array[$rows[0] + 1][22]
$array[0][0] = $rows[0]
For $u = 1 To $rows[0]
$temp = StringSplit($rows[$u], $separateur, 2)
For $v = 0 To UBound($temp) - 1
$array[$u][$v] = $temp[$v]
Next
Next
Return $array
EndFunc ;==>_CSV2Array


