Ach son 'S' sollte man immer in petto haben, falls hinten mal ein eines fehlt
Beiträge von Ice-Tee
-
-
-
Thx für deine schnelle antwort...
Ich hatte da mal was zusammen gebastelt Ich glaube das war der letzte Code, ansonsten aufm FirmenServer
Spoiler anzeigen
#include <Array.au3>Local $sRangeMin = "10.0.0.1"
Local $sRangeMax = "10.255.255.254"
Local $sIPAdress, $aIPRueckgabe[1]
Local $iOkt1 = 0, $iOkt2 = 0, $iOkt3 = 0, $iOkt4 = 0
Local $ms[1], $error = @error, $var
Local $aProzess = ProcessList()
Local $sGroesse = UBound($aProzess)
$aRangeMin = StringSplit($sRangeMin, ".")
$aRangeMax = StringSplit($sRangeMax, ".")_OktettDurchlauf($aRangeMin, $aRangeMax)
;~ ; Otett Durcklauf mit gültiger IP ins Array - Rückgabe
Func _OktettDurchlauf($aRangeMin, $aRangeMax)
For $iOkt1 = $aRangeMin[1] To $aRangeMax[1]
If $aRangeMin[1] < $aRangeMax[1] Then
$aRangeMax[2] = 255
EndIf
For $iOkt2 = $aRangeMin[2] To $aRangeMax[2]
If $aRangeMin[2] < $aRangeMax[2] Then
$aRangeMax[3] = 255
EndIf
For $iOkt3 = $aRangeMin[3] To $aRangeMax[3]
If $aRangeMin[3] < $aRangeMax[3] Then
$aRangeMax[4] = 255
EndIf
For $iOkt4 = $aRangeMin[4] To $aRangeMax[4]
$sIPAdress = $iOkt1 & "." & $iOkt2 & "." & $iOkt3 & "." & $iOkt4
_Ping($sIPAdress)
#cs
Select $var
Case = 0
ToolTip(@error)
Case = 1
_ArrayAdd($aIPRueckgabe, $sIPAdress)
Case > 1
_ArrayAdd($aIPRueckgabe, $sIPAdress)EndSelect
#ce
Next
Next
Next
Next
EndFunc ;==>_OktettDurchlauf_ArrayDisplay($aIPRueckgabe, "Info")
_ArrayDisplay($ms, "MilliSekunden")Func _Ping($sIPAdress)
$var = Ping($sIPAdress, 1)
;_DatenSammeln($var)
Return $var
;MsgBox(0, "Hinweis", $var & "....." & $error)
EndFunc ;==>_Ping -
MoinMoin,
so ich wollte mal ein privates Projekt starten. Nun hab ich mir mal eine kleine Gedächnisstütze geschrieben.
Meine Frage an euch ist: kann man das mit AutoIt umsetzen und/oder hab ich was vergessen?Spoiler anzeigen
- Suche nach allen IP’s (IP Scan…10.0.0.1 – 10.255.255.254)
- Wurde eine IP gefunden erstelle ein neues Objekt (Kann AutoIt Objekte? Wenn nicht alternative?)
Etabliere ClientSoftware (User:DomAdmin);ClientSoftware sollte können…
- Frage ‚alle‘ Daten ab (MAC, Modell, Last User…)
;Wieder an Server
- Vergleiche gewonnene Daten mit evt. vorhandenen Daten auf Basis der MAC-Adresse
- Ist die MAC nicht mehr im SubNetz – kill den alten Eintrag.Sonst aktualisiere Daten
- Frage Router/Switch nach dem Port auf dem die MAC antwortet. Füge es den zu speichernden Daten hinzu.
- Speichere die Daten in ??? (Daten verschlüsseln)(*.csv, *.txt, *.db, *.xml, *.ini)
- Hat User Email Account?Nein ..auf Exchange einen erstellen
Und ..sonst
Richte Outlook ein
Und ..sonst
Sende Daten an Email-Adresse- Nimm Daten und erstelle eine Grafik (von AD/DC über Switch über Router zum Client)
- Wenn auf Grafik = {Klick} interagiere mit Client;Weiteres nicht ausgeschlossen.
----- ACHTUNG: SpeicherMeduim -> Handy,Tab u.s.w. dürfen die ausgelesen werden, wenn nicht Firma?
Ist eine Interaktion mit Cisco-ASA möglich?
-
Thx für die Antwort autoBert.
Das wird 'n Tag dauern bis ich da durch bin
Sieht aber schon mal sehr cool aus
-
MoinMoin,
gibt es eine Möglichkeit, eine Grafik am Mauszeiger anzuhängen?
Hintergrund: Ich möchte gerne ein ico, png oder so? Anklicken {Links}festhalten und diese frei durch die GUI ziehen. Loslassen {Links}klick. Pos-Daten stehen zur Abfrage bereit. Ich würde gern ein Objekt in der GUI erzeugen, welches ich ansprechen und verändern kann. GDIPlus scheint eine Lösung zu sein. Nur die Grafiken bekomme ich auch nicht bewegt.
gruss Ice-Tee
-
Moin Alina,
mit der Unterschrift hast recht.
Zu meiner Zeit musste ich auch alles per Hand schreiben. Ich weiss das, ich musste 3 Monate beim Chef im Büro nachschreiben. Nebs Fachzeichnung und oder Fachbericht
mfg Ice-Tee
-
thx ..
hängt hinten dran.
-
Ach Meno... Ich bekomme die ExcelTabelle nicht hochgeladen. DatenFormat?
-
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 freuenAutoIt
Alles anzeigen#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
-
MoinMoin,
Ja also 3D Array war 'n bisschen viel, wobei mir das gut zu passe kommen würde. 1D finde ich arg wenig. Könnte ich dann ja auch alles in eine *.txt schaufeln. Also 2D Array[n][y]. Nun muss ich mir noch Gedanken über die Range machen .. zu scannen ist 10.10.21.xy - 192.168.2.255 * gefühlte 100 Prozesse (Das nenn ich mal ne Hausnummer) Ich werde wohl alle Nullen killen, auch wenn sie in der AD vorhanden sind. Wollte das nur möglichst neutral halten, damit andere den Skript auch benutzen können ohne grosse Änderungen. Könnte sonst auch 10.10.79.0 -192.168.1.255 ausklammern
Thx alpines für den Chat gestern abend.
Gruss
Ice-Tee
-
Hi AutoIt . Gruppe,
ich hab folgendes Problem. Ich möchte gerne wissen, welchen Status die Clients einer Range haben .
---snipp--- Ping---
Wenn die Funktion scheitert(also 0 zurückgibt), enthält @error weitere Informationen:
1 = Der Computer ist offline
2 = Der Computer ist nicht erreichbar
3 = Falsche Adresse
4 = Andere Fehler
---snippEnd ---Ping---sollte in etwa so aus sehn
Array[1][1][1] ;[1] einfach nur ne Zahl
10.10.21.130 1 = Der Client ist offline nur so
10.10.21.131 3 = Falsche Adresse hast nix
10.10.21.132 Client online ein Beispiel
.
.
.Den Ping bekomm ich so hin s.Spoiler
Hat jemand einen Gedankenansatz. Ich bekomm die 2 / 3 Dimension nicht hin.
Spoiler anzeigen
#include <Array.au3>Local $sRangeMin = "10.10.21.130"
Local $sRangeMax = "10.10.21.200"
Local $sIPAdress, $aIPRueckgabe[1][1]
Local $iOkt1 = 0, $iOkt2 = 0, $iOkt3 = 0, $iOkt4 = 0$aRangeMin = StringSplit($sRangeMin, ".")
$aRangeMax = StringSplit($sRangeMax, ".")_OktettDurchlauf($aRangeMin, $aRangeMax)
Func _OktettDurchlauf($aRangeMin, $aRangeMax)
For $iOkt1 = $aRangeMin[1] To $aRangeMax[1]
If $aRangeMin[1] < $aRangeMax[1] Then
$aRangeMax[2] = 255
EndIf
For $iOkt2 = $aRangeMin[2] To $aRangeMax[2]
If $aRangeMin[2] < $aRangeMax[2] Then
$aRangeMax[3] = 255
EndIf
For $iOkt3 = $aRangeMin[3] To $aRangeMax[3]
If $aRangeMin[3] < $aRangeMax[3] Then
$aRangeMax[4] = 255
EndIf
For $iOkt4 = $aRangeMin[4] To $aRangeMax[4]
$sIPAdress = $iOkt1 & "." & $iOkt2 & "." & $iOkt3 & "." & $iOkt4
_Ping($sIPAdress)
_ArrayAdd($aIPRueckgabe, $sIPAdress)
MsgBox(0, "Hinweis", @error)
Next
Next
Next
Next
EndFunc ;==>_OktettDurchlauf_ArrayDisplay($aIPRueckgabe, "Info")
Func _Ping($sIPAdress)
Ping($sIPAdress, 250)
EndFunc ;==>_Ping -
Wie Lange umgehend so dauert
-
Hi water,
thx für dein Tipp. Hab es nun dadurch gelöst, dass ich das Blockende um eins gekürzt habe:
$iZeilenende = $iZeilenanfang + $s - 1
lustig ... und ich hab immer noch nicht verstanden warum. Aber es geht.
Thx
Ice-Tee -
Hi water,
thx für dein Tipp. Hab es nun dadurch gelöst, dass ich das Blockende um eins gekürzt habe:
$iZeilenende = $iZeilenanfang + $s - 1
lustig ... und ich hab immer noch nicht verstanden warum. Aber es geht.
Thx
Ice-Tee -
Hi BugFix,
coole Sache. Schaut richtig gut aus..
Gruß
Ice-Tee -
MoinMoin...
ich hab ein Problem mit _Excel_RangeDelete(). Naja das eigentliche Problem liegt daran, dass beim Einfügen durch ein Array immer als letzter Eintrag #NV geschrieben wird.
Nun versuche ich diesen Eintrag wieder zu löschen mittels _Excel_RangeDelete($sExcelDatei, _Excel_RangeFind($sExcelDatei, "#NV")). Leider ohne Ergebnis.
Ich bekomme immer '0' zurück geliefert.Kennt ihr ne Möglichkeit #NV schnell zu löschen?
Das Programm hab ich mal in einen Spoiler angehängt. (Soll mal ne Arbeitserleichterung für unsere Azubis werden)
Danke und Gruß
Ice-Tee
Spoiler anzeigen
AutoIt
Alles anzeigen; Script Start #include <Excel.au3> #include <ExcelConstants.au3> #include <Array.au3> #include <MsgBoxConstants.au3> #include <file.au3> Global $Array[10] Global $sExcelblock, $s, $Excelfind, $ExcelDelete 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 Local $sFilePath = @ScriptDir & "\test.txt" Local $sExcelDatei = @ScriptDir & "\Ausbildungsnachweis.xlsx" Local $Excel = _Excel_BookOpen($oExcel, $sExcelDatei) Local $iZeilenanfang, $iZeilenende For $iTage = 1 To 5 ;Anzahl der Arbeitstage ; For $i = 0 To $s ;Jeder Eintrag das Array un der Vorherigenschleife wird gelöscht _ArrayDelete($aPruefen, $i + 1) Next $sWert = "" $s = 0 $q = "" $iRandom = "" _FileReadToArray($sFilePath, $aDatei) ;Datei in Array einlesen $sWert = UBound($aDatei) ;Bestimmen wie gross das Array ist $s = Random(4, 6, 1) ;$Pruefen soll zwischen 4 und 6 Eintr�ge 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 ; Excel-Part von B6 bis B35 befüllen und dann speichern. Bestehendes Dokument als Vorlage nehemen ; und ; Datum und Zeit generieren $DateTime = @MDAY & @MON & @YEAR & "-" & @HOUR & @MIN & @SEC _NaechtenExcelBlockBerechen($s, $iTage) _Excel_RangeWrite($Excel, $Excel.Activesheet, $aPruefen, $sExcelblock) ;$sExcelblock) ; der Eintrag von $aPruefen wird in die Exceltabelle geschrieben _Excel_RangeDelete($sExcelDatei, _Excel_RangeFind($sExcelDatei, "#NV")) ; If @error Then MsgBox(0, "Error _Excel_BookSaveAs", "@error= " & @error & @CRLF & "@extended= " & @extended) Next _ExcelSaveAsEX($oExcel, "xlsx", @ScriptDir & "\" & $DateTime) _Excel_BookClose($Excel) Sleep(2000) MsgBox(0, "Beenden", "Programm wird jetzt beendet") _Excel_Close($oExcel, Default, True) Func _NaechtenExcelBlockBerechen($s, $iTage) Select Case $iTage < 1 $iZeilenanfang = 0 $iZeilenende = 0 Case $iTage > 6 $iZeilenanfang = 0 $iZeilenende = 0 EndSelect $iZeilenanfang = $iTage * 6 $iZeilenende = $iZeilenanfang + $s $sExcelblock = "B" & $iZeilenanfang & ":B" & $iZeilenende Return $sExcelblock EndFunc ;==>_NaechtenExcelBlockBerechen ; 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
-
MoinMoin,
danke erstmal für den Tipp. Habe das Problem wie folgt gelöst Geht bestimmt eleganter funzt aber:
#include <file.au3>
#include <array.au3>
Local $aDatei,$i , $sWert, $sFilePath = @ScriptDir & "\test.txt", $sTestWert, $q
Local $aPruefen[0]
_FileReadToArray($sFilePath, $aDatei) ;Datei in Array einlesen$sWert = UBound($aDatei) ;Bestimmen wie groß das Array ist
;Zufällig 5 Einträge in ein neues Array einfügen
For $i = 1 To 5
$sTestWert = Random(0, $sWert, 1)
_ArrayAdd($aPruefen, $sTestWert)
NextGruss Ice-Tee
PS: alpines hast Recht blöder Titel.
-
Moin Ihr Alle,
Da fang ich langsam mit Array's und Random an und ... voll reingegriffen..
Was Soll dieses Skript machen. Es soll die Datei \Test.txt in ein Array laden
Dann sollen 5 zufällige Zeilen des Array in ein anderes geschrieben werden.
(später folgt noch, dass doppelte Einträge aus dem zweiten Array gelöscht werden sollen und am Ende sollten 5 zufällig zusammengestellte Einträge im Array sein)Schon der erste 'Test' hat mit einen Fehler ausgegeben den ich nicht verstehe:
"C:\Users\andi2\Documents\File_lesen.au3" (12) : ==> Subscript used on non-accessible variable.:
$aPruefen[$i] = $TestWert
$aPruefen^ ERRORIch hab die Variable doch bekannt gegeben?
#include <file.au3>
#include <array.au3>Local $aDatei, $aPruefen, $sWert, $sFilePath = @ScriptDir & "\test.txt", $sTestWert
Local $i_FileReadToArray($sFilePath, $aDatei) ;Datei in Array einlesen
$sWert = UBound($aDatei) ;Bestimmen wie groß das Array ist
For $i = 1 To 5
$sTestWert = Random(0, $sWert, 1)
$aPruefen[$i] = $sTestWert
NextWenn ihr einen Tipp hättet ...Danke
Ice-Tee
-
OK ... Danke alpines.
vielleicht sollte das TUT angepasst werden.
regsvr32 wollte nicht wirklich ... ich liefer sie mit ....