Moin Moin,
um mich in AutoIt einzuarbeiten hab ich für unsere Auszubildende einen Ausbildungsnachweis Bot erstellt. Also ich muss dazu sagen ich bin kein Programmierer, ich bin FiSi und wollt AutoIt u.a. zur Unterstützung meines Deployment nehmen.
Naja, um mich mit der Sprache auseinander zusetzen und nicht den ganzen Tag 'Hallo Welt' schreiben zu müssen, kann ich halt auf die Idee.
Geht sicher schlanker und eleganter, aber der Skript läuft
Der Skript erstellt zwei zusätzliche Dateien eine INI in der die persönlichen Daten gespeichert werden und eine TXT Datei. Die beinhaltet die Arbeiten. Ich stell mal alles hier rein. Würde mich über eure Meinung freuen
AutoIt
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Comment=Datei zum automatischen erstellen von Ausbildungsnachweisen
#AutoIt3Wrapper_Res_Fileversion=0.1
#AutoIt3Wrapper_Res_LegalCopyright=Andreas Urbschat
#AutoIt3Wrapper_Res_Language=1031
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Excel.au3>
#include <ExcelConstants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <file.au3>
#include <ButtonConstants.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <GUIDateTimePicker.au3>
Global $Array[10]
Global $sExcelblock, $s, $Excelfind, $ExcelDelete, $Excel
Local $oExcel = _Excel_Open()
If @error Then Exit MsgBox(0, "Fehler", "Excel Objekt kann nicht erstellt werden")
Local $aDatei, $i, $sWert, $iRandom, $q, $aPruefen[0], $iTage, $DateTime, $aDatumHeute
Local $iAbNr
Local $bUnterschrift = @ScriptDir & "\Unterschrift.jpg"
Local $sFilePath = @ScriptDir & "\Taetigkeiten.txt"
Local $sExcelDatei = @ScriptDir & "\Ausbildungsnachweis.xlsx"
Local $sINIDatei = @ScriptDir & "\Ausbildungsnachweis.ini"
Local $iZeilenanfang, $iZeilenende
; Erstellt mit Koda, ging schneller und war schneller was Optik angeht
$Ausbuldungsnachweis = GUICreate("Ausbuldungsnachweis Bot", 1035, 470, 194, 126)
$Date1 = GUICtrlCreateMonthCal("", 256, 192, 257, 164, 0);GUICtrlCreateDate
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Label1 = GUICtrlCreateLabel("ab Datum:", 16, 256, 237, 17)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Name = GUICtrlCreateInput("", 256, 40, 257, 24)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Label2 = GUICtrlCreateLabel("Name:", 16, 40, 235, 17)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Firma = GUICtrlCreateInput("", 256, 76, 257, 24)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Label3 = GUICtrlCreateLabel("Praktikum bei der Firma:", 16, 80, 235, 17)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Menge = GUICtrlCreateInput("", 256, 112, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Label4 = GUICtrlCreateLabel("wie viele Ausbildungsnachweise", 16, 120, 235, 17)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Taetigkeiten = GUICtrlCreateEdit(FileRead($sFilePath), 520, 40, 489, 385)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Label5 = GUICtrlCreateLabel("anschliessend Drucken", 16, 368, 144, 20)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$AusbNr = GUICtrlCreateInput("", 256, 152, 49, 24, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Label6 = GUICtrlCreateLabel("ab Ausbildungsnachweisnummer", 16, 160, 235, 17)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$Drucken = GUICtrlCreateCheckbox("Drucken", 256, 368, 17, 33)
GUICtrlSetFont(-1, 11, 400, 0, "MS Sans Serif")
$OK = GUICtrlCreateButton("OK", 8, 408, 177, 41)
$Ende = GUICtrlCreateButton("Beenden", 256, 408, 177, 41)
GUISetState(@SW_SHOW)
_Voreinstellung()
_GUIAuslesen()
_ExcelAnzahl()
MsgBox(0, "Beenden", "Programm wird jetzt beendet")
_Excel_Close($oExcel, Default, True)
#cs
Diese Funktion nimmt aus der GUI die Anzahl der zu erstellenden
Ausbildungsnachweise und erstellt die entsprechende Menge
#ce
Func _ExcelAnzahl()
For $i = 1 To GUICtrlRead($Menge)
_neuesExcelSheet()
_AktivitaetenWoche()
_ExcelBefuellen()
If (GUICtrlRead($Drucken)) = $GUI_CHECKED Then _Drucken($oExcel, $Excel)
$DateTime = @MDAY & @MON & @YEAR & "-" & @HOUR & @MIN & @SEC
_ExcelSaveAsEX($oExcel, "xlsx", @ScriptDir & "\" & $DateTime)
$NewDate = _DateAdd('d', 7, GUICtrlRead($Date1))
GUICtrlSetData($Date1, $NewDate)
GUICtrlSetData($AusbNr, GUICtrlRead($AusbNr) + 1)
GUISetState(@SW_SHOW)
Next
EndFunc ;==>_ExcelAnzahl
#cs
Erstellt einen neuen ExcelSheet
#ce
Func _neuesExcelSheet()
Global $Excel = _Excel_BookOpen($oExcel, $sExcelDatei)
Return
EndFunc ;==>_neuesExcelSheet
#cs
Jedes Feld der GUI wird ausgelesen. Wenn ein ein Feld nicht ausgefüllt wurde kommt
eine entsprechende Meldung
#ce
Func _GUIAuslesen()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $OK
If GUICtrlRead($Name) = "" Then
MsgBox(0, "Name?", "Deine Name fehlt!")
EndIf
If GUICtrlRead($Firma) = "" Then
MsgBox(0, "Firma?", "Deine Firma fehlt!")
EndIf
If GUICtrlRead($Menge) = "" Then
MsgBox(0, "Menge?", "Bitte angeben wieviele Ausbilgungsnachweise erstellt werden sollen!")
EndIf
If GUICtrlRead($Taetigkeiten) = "" Then
MsgBox(0, "Taetigkeiten?", "Es sind keine Taetigkeiten vorhanden!")
EndIf
If (GUICtrlRead($Drucken)) <> $GUI_CHECKED Then
MsgBox(0, "Drucken?", "Die Ausbildungsnachweise werden nur gespeichert nicht gedruckt!")
EndIf
_GUIDatenSpeichern()
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
_GUIDatenSpeichern()
_Ende()
Case $msg = $Ende
MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
_GUIDatenSpeichern()
_Ende()
EndSelect
WEnd
EndFunc ;==>_GUIAuslesen
#cs
Stellt zufällig 4-6 Tätigkeiten aus dem GUIEdit zusammen.
entfernt doppelte Einträge aus dem Arbeitstag und stellt sie als ExcelBlock zur Verfügung.
Hintergrund: Die Arbeitswoche beträgt bei uns 5 Arbeitstage, nun soll ja nicht jeder Tag gleich aussehen.
Die Ausbildungsnachweisvorlage der IHK sieht max. 6 Einträge je Arbeitstag vor.
Die Tätigkeiten sollten min. 20 verschiedene beinhalten, da die Zusammenstellung sonst zulange dauern würde.
Tätigkeiten < = 4 führen zwangsweise zu einer Endlosschleife
#ce
Func _AktivitaetenWoche()
For $iTage = 1 To 5 ;Anzahl der Arbeitstage
;
For $i = 0 To $s ;Jeder Eintrag das Array in der Vorherigenschleife wird gelöscht
_ArrayDelete($aPruefen, 0)
Next
$sWert = ""
$s = 0
$q = ""
$iRandom = ""
_FileReadToArray($sFilePath, $aDatei) ;Datei in Array einlesen
_ArrayDelete($aDatei, 0)
$sWert = UBound($aDatei) ;Bestimmen wie gross das Array ist
$s = Random(4, 6, 1) ;$Pruefen soll zwischen 4 und 6 Eintraege haben
;Zufaellig Eintraege in ein neues Array einfuegen
Do
$iRandom = Random(0, $sWert, 1) - 1
If $iRandom = -1 Then $iRandom = 0
$q = $aDatei[$iRandom]
_ArrayDelete($aPruefen, _ArraySearch($aPruefen, $q, 0, 0)) ;Loescht doppelten Eintrag
_ArrayAdd($aPruefen, $q) ;fuegt den neuen Eintrag hinzu
Until UBound($aPruefen) = $s
_NaechtenExcelBlockBerechen($s, $iTage)
_ExcelBefuellen()
Next
EndFunc ;==>_AktivitaetenWoche
#cs
Berechnet den nächsten ExcelBlock.
Es wird davon ausgegangen, dass es unterschiedliche 6 Arbeiten am Tag gibt.
#ce
Func _NaechtenExcelBlockBerechen($s, $iTage)
Select ;sollte aus irgend einem Grund $iTage(Arbeitswoche) <1 oder >6 sein wird alles auf 0 gesetzt
Case $iTage < 1
$iZeilenanfang = 0
$iZeilenende = 0
Case $iTage > 6
$iZeilenanfang = 0
$iZeilenende = 0
EndSelect
$iZeilenanfang = $iTage * 6
$iZeilenende = $iZeilenanfang + $s - 1
$sExcelblock = "B" & $iZeilenanfang & ":B" & $iZeilenende
Return $sExcelblock
EndFunc ;==>_NaechtenExcelBlockBerechen
Func _ExcelBefuellen()
Local $sStyle = "yyyy"
_Excel_RangeWrite($Excel, $Excel.Activesheet, GUICtrlRead($Name), "E1:E1")
_Excel_RangeWrite($Excel, $Excel.Activesheet, GUICtrlRead($Firma), "C2:C2")
_Excel_RangeWrite($Excel, $Excel.Activesheet, GUICtrlRead($Date1), "C3:C3")
_Excel_RangeWrite($Excel, $Excel.Activesheet, GUICtrlRead($AusbNr), "C1:C1")
;_Excel_RangeWrite($Excel, $Excel.Activesheet, $bUnterschrift, "Q32:Q32")
_Excel_RangeWrite($Excel, $Excel.Activesheet, $aPruefen, $sExcelblock) ;$sExcelblock) ; der Eintrag von $aPruefen wird in die Exceltabelle geschrieben
EndFunc ;==>_ExcelBefuellen
Func _Voreinstellung()
If FileExists($sINIDatei) Then
GUICtrlSetData($Name, IniRead($sINIDatei, "Name", "Name", ""))
GUICtrlSetData($Firma, IniRead($sINIDatei, "Firma", "Firma", ""))
GUICtrlSetData($Menge, IniRead($sINIDatei, "Menge", "Menge", "1"))
GUICtrlSetData($AusbNr, IniRead($sINIDatei, "AusbNr", "AusbNr", ""))
GUICtrlSetData($Drucken, IniRead($sINIDatei, "Drucken", "Drucken", $GUI_CHECKED))
GUICtrlSetData($Date1, IniRead($sINIDatei, "Datum", "Datum", ""))
GUISetState(@SW_SHOW)
Else
_GUIDatenSpeichern()
EndIf
EndFunc ;==>_Voreinstellung
Func _GUIDatenSpeichern()
IniWrite($sINIDatei, "Name", "Name", GUICtrlRead($Name))
IniWrite($sINIDatei, "Firma", "Firma", GUICtrlRead($Firma))
IniWrite($sINIDatei, "Menge", "Menge", GUICtrlRead($Menge))
IniWrite($sINIDatei, "AusbNr", "AusbNr", GUICtrlRead($AusbNr) + 1)
IniWrite($sINIDatei, "Drucken", "Drucken", GUICtrlRead($Drucken))
IniWrite($sINIDatei, "Datum", "Datum", GUICtrlRead($Date1))
FileDelete($sFilePath) ; Soll verhindern, dass eventuell doppelte Daten gespeichert werden
FileWrite($sFilePath, GUICtrlRead($Taetigkeiten))
EndFunc ;==>_GUIDatenSpeichern
;Drucken des aktuellen ExcelSheets
Func _Drucken($oExcel, $Excel)
_Excel_Print($oExcel, $Excel, 1)
EndFunc ;==>_Drucken
#cs
Diese Funktion hab ich mir geklaut :)
Es gab Probleme mit dem speichern der ExcelDateien
An dieser Stelle DANKE TheLuBu
#ce
; Function Name: _ExcelSaveAsEX($oExcel, $Fileformat, $NewFilepath, $Close = True)
; Description: Speichert eine Exceldatei in einem bestimmten Format ab
; Parameter(s): $oExcel Ein Excelobject, wie es von _ExcelbookOpen oder _ExcelbookNew zurückgegeben wird
; $Fileformat Der Dateityp, in dem gespeichert werden soll (xlsx, xlsb, xlsm, xls, csv, txt, prn)
; $NewFilepath Speicherort und Dateiname der neuen Datei
; $Close = True Soll nach dem Speichern das Objekt geschlossen werden? (Standard = True)
; Return Value(s): Erfolg Gibt 1 zurück
; Fehler @error 1 - $oExcel ist kein Objekt
; 2 - $Fileformat ist keine bekannte Dateiendung oder Formatnummer
; Author(s): TheLuBu (LuBu@veytal.com)
; Copyright: TheLuBu (LuBu@veytal.com)
;===============================================================================
Func _ExcelSaveAsEX($oExcel, $Fileformat, $NewFilepath, $Close = False)
If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
Switch $Fileformat
Case 51, "xlsx", ".xlsx"
$Fileformat = 51
Case 50, "xlsb", ".xlsb"
$Fileformat = 50
Case 52, "xlsm", ".xlsm"
$Fileformat = 52
Case 6, "csv", ".csv"
$Fileformat = 6
Case -4158, "txt", ".txt"
$Fileformat = -4158
Case 36, "prn", ".prn"
$Fileformat = 36
Case 56, "xls", ".xls"
$Fileformat = 56
Case Else
Return SetError(2, 0, 0)
EndSwitch
With $oExcel
.Application.DisplayAlerts = False ; Schaltet Fehlermeldungen bei Excel aus
.ActiveWorkBook.SaveAs($NewFilepath, $Fileformat)
If $Close Then
.ActiveWorkbook.Close ; Schließt die Tabelle
.Quit ; Schließt das Workbook
EndIf
EndWith
Return 1
EndFunc ;==>_ExcelSaveAsEX
Func _Ende()
While 1
Exit
WEnd
EndFunc ;==>_Ende
Alles anzeigen