1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. smofax

Beiträge von smofax

  • Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

    • smofax
    • 16. August 2015 um 16:10

    Da ich noch keine echte Fehlerlösung gefunden wurden zwei einfache Workarrounds eingesetzt.

    1, Das speichern der Excel Datei wird jetzt über aktivieren des Excel-Dokuments und den Shortcut erledigt.
    2, Das Script bricht nicht mehr ab wenn in der include-Datei Excel.au3 die Zeile 227 auskommentiert wird.

    Das Script macht jetzt anstandslos was es soll.

    Falls doch jemand den "echten" Fehler findet würde ich mich über ein Echo freuen.

    lG
    Smo

  • Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

    • smofax
    • 13. August 2015 um 16:37

    konnte jemand die Probleme ebenfalls reproduzieren oder tritt das nur bei mir auf, habe die Probleme auf 2 Rechnern.

    Ich hoffe die Beschreibungen des Ablaufs sind ausreichend.
    Versuche inzwischen einen Workaround zu schaffen.

  • Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

    • smofax
    • 11. August 2015 um 22:35

    hat etwas gedauert und der Code inkl. möglichst nachvollziehbarer Kommentare ist nur noch ca. 650 Zeilen lang.

    Die Variablen im Skript sind so festgelegt dass der Ordner "AutoIT" unter "C:\Temp" abgelegt werden sollte, dann braucht man nichts anzupassen.

    lG
    Smo

    Dateien

    AutoIT.7z 1,31 MB – 191 Downloads
  • Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

    • smofax
    • 11. August 2015 um 18:23

    Hallo water,

    ich werde das Skript zusammenfassen und Source-Dateien dazugeben, dauert aber etwas. Danach hänge ich alles als 7zip Datei an.

  • Excel Datei lässt sich nicht speichern; AutoIT Skript bricht beim öffnen der n-ten Excel Source Datei mit Fehler ab

    • smofax
    • 11. August 2015 um 11:22

    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
    AutoIt
    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 ?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™