Hallo AutoIT-er,
bin neu hier und möchte mich vorweg bei all denen Bedanken die Leuten wie mir mit Rat und Tat zur Seite stehen.
In AutoIT habe ich ein paar Probleme mit dem Transfer von Daten aus vielen Excel-Dateien in eine einzige Datei.
Verwendung werden:
AutoIT Version 3.3.14.0
ScITE Version 3.5.4
Office 2010 Pro
Win7 Pro
Was macht mein Skript...
---------------------------------------------------------
Die Dateistruktur der Sources:
RootDir/SourceDir/SubDir
/SubDir
/SubDir
/SourceDir/SubDir
/SubDir
/SubDir
/SourceDir/SubDir
...
Source-Dateien:
Die Source Dateien enthalten 1 Tabellenblatt und sind im Format .xls vorhanden.
Auf dem Tabellenblatt sind die Daten in den Bereichen G13:G3252 und Z13:Z3252 vorhanden.
Ziel-Datei:
Die Datei wird bei Bedarf von einer bestehenden Vorlage kopiert und umbenannt.
Die Ziel-Datei enthält 3 Tabellenblätter und sollte im Format .xlsx gespeichert werden, was ja nur von der Office Version und der verwendeten Vorlage abhängt. Kann jedoch auch .xls sein.
Jedes SourceDir bekommt eine Ziel-Datei mit den Daten der 3 SubDirs.
Die Daten jeder Datei pro SubDir schreibt das Skript in ein Tabellenblatt.
In jedem Tabellenblatt werden 96 Spalten mit bis zu 3240 Zeilen gefüllt, wobei bei der Hälfte der Zellen der Wert multiziert wird.
Da es zwei Versionen der Source-Dateien gibt müssen teilweise die Leeren Zellen der gelesenen Ranges entfernt werden.
---------------------------------------------------------
...oder auch nicht :^) , die Probleme
Problem1:
AutoIT schafft es nicht auch nur eine Excel-Datei zu speichern, es gibt aber keine Fehlermeldung.
getestet wurden folgende Möglichkeiten:
1, _Excel_BookSave($objTargetWorkbook)
2, $objTargetWorkbook.Save
3, $objTargetWorkbook.Activate
$objTargetWorkbook.Save
4, _Excel_Close($objTargetWorkbook)
Problem2:
AutoIT gibt im Output Fenster bei jeder 9. Datei, 8 Dateien = 16 Spalten erfolgreich transferiert, folgende Meldung aus und bricht ab:
"C:\Program Files (x86)\AutoIt3\Include\Excel.au3" (227) : ==> Variable must be of type "Object".:
$oExcel.Windows($oWorkbook.Name).Visible = $bVisible
$oExcel.Windows($oWorkbook.Name)^ ERROR
Spoiler anzeigen
Hinweis:
auch an die Web Admins
Ein Escape Problem des Spoilers der Website erkennt solche ' \" ' Zeichenfolgen im Code und zerstört die Ansicht.
Es wurde überall ; <== eigefügt wo der Ansichts-Fehler durch ' \"" ' behoben wurde.
Der Code ist so nicht lauffähig, auch weil einfach zu viel Code fehlt.
Hier wird nur der Teil mit dem Durchlauf der gefundenen Dateien abgebildet, es fehlen sicher einige Variablen, alle notwendigen Funktionen sind eingebunden.
; ---- Ausschnitt Body ------------
; Alle dem Filter entsprechenden Source-Dateien abarbeiten
Local $aryDataDirPath, $strDataDirName, $aryDataSubDirs, $strTargetFile
Local $varTargetSheet, $varSourceSheet, $SourceCellsZugkraft, $SourceCellsMZeit ,$TargetCellsZugkraft, $TargetCellsMZeit
For $k = 1 To UBound($arySourceFiles) -1
Local $strFileName, $aryPath, $aryFileName, $aryTmp, $aryStringParts
$aryPath = StringSplit($arySourceFiles[$k], "\"") ; <====
$aryTmp = StringSplit($aryPath[UBound($aryPath) - 1], ".")
$strFileName = StringTrimRight($aryPath[UBound($aryPath) - 1], StringLen($aryTmp[UBound($aryTmp) - 1]) + 1)
; Der Dateiname ist jetzt: zB: "Vorname Nachname A 33-32#1"
$aryFileName = StringSplit($strFileName, " ")
;_ArrayDisplay($aryFileName, "Korrekte Parts")
; Bei Bedarf wird ein temporäres Verzeichnis erstellt, wohin die abgearbeiteten Dateien verschoben werden
If $aryFileName[0] <> 4 Or Not ($aryFileName[1] & " " & $aryFileName[2]) = $strDataDirName Or Not ($aryFileName[3] >= "A" And $aryFileName[3] <= "C") Then
_ChkDir($intErrExit, 2, $strSubDirFalse, "", _
StringFormat("%-45s", "$strDirExportError fehlt"), _
StringFormat("%-45s", "$strDirExportError OK"), _
StringFormat("%-45s", "$strDirExportError nicht erstellt"), _
StringFormat("%-45s", "$strDirExportError erstellt"))
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei ungültig/unbekannt") & " " & $arySourceFiles[$k] & @CRLF)
FileMove($arySourceFiles[$k], $aryDataSubDirs[$j] & "\"" & $strDirExportError & "\"") ; <====
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei verschoben nach") & " " & $aryDataSubDirs[$j] & "\"" & $strDirExportError & @CRLF) ; <====
; Festlegen der Tabelle im Ziel-Workbook
Switch $aryFileName[3]
Case "A"
$varTargetSheet = 1
Case "B"
$varTargetSheet = 2
Case "C"
$varTargetSheet = 3
EndSwitch
; Zerlegen des letzten Teiles des Dateinamens zur Festlegung in welche Ziel-Zellen übertragen werden muss
$aryStringParts = StringSplit($aryFileName[4], "#")
Switch $aryStringParts[1]
Case "32-33", "33-32"
$TargetCellsZugkraft = "A3"
$TargetCellsMZeit = "B3"
; ...hier stehen noch einige Cases
Case Else
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei nicht erforderlich") & " " & $arySourceFiles[$k] & @CRLF)
FileMove($arySourceFiles[$k], $aryDataSubDirs[$j] & "\"" & $strDirExportDone & "\"") ; <====
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei verschoben nach") & " " & $aryDataSubDirs[$j] & "\"" & $strDirExportDone & @CRLF) ; <====
EndSwitch
; Festlegen der Zellen der Source-Dateien
$varSourceSheet = 1
$SourceCellsZugkraft = "G13:G3252"
$SourceCellsMZeit = "Z13:Z3252"
Sleep(300)
_OpenExcelFile($objExcelApp, $objSourceWorkbook, $arySourceFiles[$k], False, True, True)
_ExcelToExcelSummary($objExcelApp, $objSourceWorkbook, $objTargetWorkbook, $varSourceSheet, $SourceCellsZugkraft, $varTargetSheet, $TargetCellsZugkraft, True)
_ExcelToExcelSummary($objExcelApp, $objSourceWorkbook, $objTargetWorkbook, $varSourceSheet, $SourceCellsMZeit, $varTargetSheet, $TargetCellsMZeit, False)
_CloseExcelFile($objExcelApp, $objSourceWorkbook, False, False)
$objTargetWorkbook.Activate
$objTargetWorkbook.Save
;_Excel_BookSave($objTargetWorkbook)
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei erledigt") & " " & $arySourceFiles[$k] & @CRLF)
FileMove($arySourceFiles[$k], $aryDataSubDirs[$j] & "\"" & $strDirExportDone & "\"") ; <====
_FileWriteLog($strLogFile, StringFormat("%-45s", "Datei verschoben nach") & " " & $aryDataSubDirs[$j] & "\"" & $strDirExportDone & @CRLF) ; <====
Next
; ---- Ende Ausschnitt Body ------------
Func _OpenExcelFile(ByRef $objExcel, ByRef $objWorkbook, $strWorkbook, $blnReadOnly = False, $blnVisible = True, $blnInteractive = True)
If Not IsObj($objExcel) Then
$objExcel = _Excel_Open() ;Default, Default, Default, $blnInteractive)
If @error Then
_FileWriteLog($strLogFile, StringFormat("%-45s", "_OpenExcelFile") & " " & "Error bei Erstellung des ExcelApplicationObject" & @CRLF)
;MsgBox($MB_SYSTEMMODAL, "Excel UDF: _OpenExcelFile", "Error bei Erstellung des Excel Application Object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_ErrExit("")
EndIf
EndIf
If Not IsObj($objWorkbook) Then
$objWorkbook = _Excel_BookOpen($objExcel, $strWorkbook, $blnReadOnly, $blnVisible)
If @error Then
_FileWriteLog($strLogFile, StringFormat("%-45s", "_OpenExcelFile") & " " & "Error öffnen workbook: " & $objWorkbook & @CRLF)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _OpenExcelFile", "Error öffnen workbook '" & $objWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
$objExcel.ScreenUpdating = True
$objExcel.Interactive = True
_Excel_Close($objExcel)
_ErrExit("Schwerer Fehler")
EndIf
EndIf
EndFunc ; ==> _OpenExcelFile
Func _CloseExcelFile(ByRef $objExcel, ByRef $objWorkbook, $blnSaveChanges = True, $blnCloseApp = True)
If IsObj($objWorkbook) Then
$objExcel.ScreenUpdating = True
$objExcel.Interactive = True
If $blnSaveChanges = True Then
$objExcel.Windows($objWorkbook.Name).Visible = True
EndIf
_Excel_BookClose($objWorkbook, $blnSaveChanges)
If @error Then
_FileWriteLog($strLogFile, StringFormat("%-45s", "_CloseExcelFile") & " " & "Error beim speichern von workbook " & @CRLF)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _CloseExcelFile", "Error speichern workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_ErrExit("")
EndIf
EndIf
If $blnCloseApp = True Then
$objExcel.SaveChanges = True
$objExcel.Interactive = True
_Excel_Close($objExcel, $blnSaveChanges)
EndIf
EndFunc ; ==> _CloseExcelFile
Func _ExcelToExcelSummary(ByRef $objExcel, ByRef $objWorkbookS, ByRef $objWorkbookT, $SourceSheet, $SourceCells, $TargetSheet, $TargetCells, $blnMultiplicate)
$objExcel.ScreenUpdating = False
; Kopieren von Source-Datei
Local $aryResult = _Excel_RangeRead($objWorkbookS, $SourceSheet, $SourceCells, 1)
If @error Then
_FileWriteLog($strLogFile, StringFormat("%-45s", "Excel UDF: _Excel_RangeRead") & "Fehler beim Lesen von der Source-Datei" & @CRLF)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeRead", "Error reading from workbook." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_ErrExit("")
EndIf
;_ArrayDisplay($aryResult, "Excel UDF: _Excel_RangeRead - Cells " & $SourceCells & " of sheet " & $SourceSheet)
; In Spalte Zugkraft müssen alle Werte multipliziert werden
; Das Runden auf 2 Kommastellen erledigt Excel in der Standardformatierung beim Einfügen
If $blnMultiplicate = True Then
For $i = 0 To UBound($aryResult) -1
$aryResult[$i] = $aryResult[$i] * 100
Next
EndIf
;_ArrayDisplay($aryResult, "Excel UDF: _Excel_RangeRead - Cells *100")
; Jede Zelle muss Wete enthalten, wegen Verkürzung auf 3 Sekunden Messzeit müssen leere Zellen am Ende entfernt werden
If $aryResult[3200] = "" Then
$index = 0
For $j = 0 To UBound($aryResult) - 1
If $aryResult[$j] <> "" Then
$aryResult[$index] = $aryResult[$j]
$Index += 1
EndIf
Next
ReDim $aryResult[$index]
EndIf
; Einfügen in Ziel-Datei
_Excel_RangeWrite($objWorkbookT, $TargetSheet, $aryResult, $TargetCells)
If @error Then
_FileWriteLog($strLogFile, StringFormat("%-45s", "Excel UDF: _Excel_RangeWrite") & " " & "Fehler beim Schreiben in die Ziel-Datei" & @CRLF)
MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeWrite", "Error writing to worksheet." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_ErrExit("")
EndIf
$objExcel.ScreenUpdating = True
EndFunc ; ==> _ExcelToExcelSummary
Func _ErrExit($strErrMsg = "... Skript abgebrochen")
_FileWriteLog($strLogFile, StringFormat("%-45s", "ERROR Exit") & " " & $strErrMsg & @CRLF)
MsgBox(0, "AutoIt - Error", $strErrMsg & @CRLF)
$objExcelApp.SaveChanges = True
$objExcelApp.Interactive = True
$objExcelApp.Quit
Exit
EndFunc ; ==> _ErrExit
Alles anzeigen
Hat jemand eine Idee woran das liegen könnte ?