if $time = 5 then
Du mußt die Zeit ja irgendwoher beziehen ![]()
Verwende doch die Macros (@HOUR, @MIN, @SEC).
if $time = 5 then
Du mußt die Zeit ja irgendwoher beziehen ![]()
Verwende doch die Macros (@HOUR, @MIN, @SEC).
1. Wie kann man erfragen welches "Item" grad aktiv ist? (also markiert) Ohne alle abzufragen?
_GUICtrlListView_GetItemSelected()
2. Wie kann ich den Inhalt speichern/wiederherstellen? (GuiCtrlRead/Write auf die ListView?)
Verwende z.B. dieses: _GUICtrlListView_Export()
NB: _GUICtrlListView_GetSelectionMark() gibt den Index des ersten Items von mehreren ausgewählten zurück.
Zitat von AutoIt-HilfeAlles anzeigenShutdown ( code )
code: A combination of shutdown codes. See "remarks".
RemarksThe shutdown code is a combination of the following values:
0 = Logoff
1 = Shutdown
2 = Reboot
4 = Force
8 = Power down
16= Force if hung
32= Standby
64= HibernateAdd the required values together. To shutdown and power down, for example, the code would be 9 (shutdown + power down = 1 + 8 = 9).
Standby or Hibernate are ignored if other codes are set.
Nun möchte ich gezielt alle Attribute (value) mit neuen Werten belegen.
Ja, schön und gut ==> entscheidend ist doch Welchen Wert möchtest du Womit ersetzen?
Du brauchst doch einen Ansatz, z.B.: in <Category3> ersetze value Nr. 2 mit 'XYZ'. Woher kommen die Werte? Ein Array oder Input oder....?
OK, hier mal ein Anfang. Mußt jetzt nur noch deine Logik einbauen und die Schreibbefehle für Excel. Das sollte aber anhand der vorigen Bsp. kein Problem werden.
#include <file.au3>
[/autoit] [autoit][/autoit] [autoit]; die csv-Datei einlesen
Local $Array, $PathCSV = @ScriptDir & '\test_csv.txt'
_FileReadToArray($PathCSV, $Array)
; im Array an Index 0 steht die Anzahl der Zeilen
; an Index 1 steht die Überschrift
; somit beginnen die Daten an Index 2
; das Array durcharbeiten, Variable zum Splitten der Felder erstellen
Global $aSplit ; Global, damit ByRef darauf zugegriffen werden kann
; zum besseren Verständnis erstelle ich hier Variablen für jedes Feld
; nicht zwingend notwendig, man kann auch direkt mit den Arrayvariablen arbeiten
Global $TicketID, $CreateDate, $Submitter, $AssignInd, $AssignGrp, $Descript
For $i = 2 To UBound($Array) -1
$aSplit = StringSplit($Array[$i], ',')
$TicketID = $aSplit[1]
$CreateDate = $aSplit[2]
$Submitter = $aSplit[3]
$AssignInd = $aSplit[4]
$AssignGrp = $aSplit[5]
$Descript = $aSplit[6]
; jetzt die Auswertelogik, hier mal frei erfunden:
Select
Case StringInStr($Submitter, 'agent') And $AssignGrp = 'IT' And $Descript = 'admin'
_AddToGroup('MAC')
Case StringInStr($Submitter, 'agent') And $Descript = 'admin'
_AddToGroup('ADMIN')
; usw.
EndSelect
Next
Func _AddToGroup($Group)
; prüfen ob Sheet mit dem Gruppennamen existiert, wenn nicht erstellen
; Sheet aktivieren
; letzte belegte Zeile ermitteln (meine UDF: _ExcelBookGetWidth() )
; in Folgezeile schreiben Werte entsprechend der Variablen aus der For-Schleife: $TicketID, $CreateDate usw.
EndFunc
Edit: Hab noch was vereinfacht.
Zum Zeitpunkt des Speicherns habe ich ja nur eine GUI geöffnet und mit Daten gefüllt.
Das ist völlig unerheblich, die GUI existiert und du greifst auf diese und deren Controls auch zu, wenn sie nicht sichtbar ist.
Verwende einfach eineindeutige ID's und Eventzuweisungen, dann hast du die Probleme nicht.
Deine Arraygestaltung habe ich aber trotzdem nicht nachvollziehen können - allerdings habe ich das Skript auch nicht durchgearbeitet um zu sehen, was wann und wo passiert. ![]()
Na, wenn die Logik steht, brauchst du doch nur in etwa so vorgehen:
- notwendige Sheets erstellen
- csv mit _FileReadToArray einlesen
- anhand deiner Bedingungen das Array Zeile für Zeile abarbeiten
z.B.
• 'Auftrag' UND 'Admin' UND 'IT' ? ==> zu Sheet MAC
• 'Auftrag' UND 'Admin' ? ==> zu Sheet ADMIN
• nur 'Auftrag' ? ==> zu Sheet separate Gruppe
Das kannst du über Select-Case oder If-Then-ElseIf -Strukturen gestalten. Das Problem ist wirklich ausschließlich die Logik, wann welcher Eintrag wo zugeordnet wird. Das Schreiben in die Sheets ist dann ein reiner Formalismus.
Bevor du an die Umsetzung der Kriterien gehst, hilft es vllt., wenn du dir das grafisch per Schnittmengen darstellst und daran die Priorität festlegst. Die Abfrage-Reihenfolge muß dann von der höchsten zur niedrigsten Priorität erfolgen.
Doch ich finde keine "elegante" Möglichkeit Die einzelnen Werte zu ersetzen, jemand eine Idee?
Das geht "elegant" mit StrRegExpReplace().
Sag nochmal genau was eingelesen wird (bzw. wie dieser Text aussehen kann, sicher unterschiedlich) und was am Ende übrig bleiben soll. Dann schau ich mal, dass ich dir das in ein schönes RegExp packe. ![]()
Der Fehler ist hausgemacht:
Du erstellst 2 GUI, verwendest für beide identische Controlnamen und weist diesen auch noch dieselben Events zu. - Das kann nicht gut gehen.
Deine Array-Konzept ist auch sehr unklar:
$Plakate_Array[0][190] <== Array mit nur einer Zeile aber 191 Spalten ? - Ist das beabsichtigt ?
Warum überhaupt 2D-Array, wenn du nur eine Dimension belegst?
Und das hier geht auch effizienter:
[autoit]
$len4 = StringLen(StringStripWS(GUICtrlRead($Text4),3))
$len5 = StringLen(StringStripWS(GUICtrlRead($EURO1),3))
$len6 = StringLen(StringStripWS(GUICtrlRead($EURO2),3))
$laenge = $len1 + $len2 + $len3 + $len4 + $len5 + $len6
if $laenge <= 1 Then ;...Fehlerbehandlung
; besser:
If (StringStripWS(GUICtrlRead($Text4),3) = '') Or _
(StringStripWS(GUICtrlRead($EURO1),3) = '') Or _
(StringStripWS(GUICtrlRead($EURO1),3) = '') Then ;...Fehlerbehandlung
Da solltest du schon den GUI-Teil des Codes mit einstellen, so ist das etwas Rätselraten. (und bitte Tags verwenden)
;Inhalt aus den Textfeldern holen und die Länge bestimmen. Leerzeichen am Anfang und Ende werden abgeschnitten
Hier bestimmst du nur die Länge des Inhalts, speicherst aber nicht den Inhalt.
msgbox (0,"Achtung speichern","Die eingegebenen Daten für das Plakat werden gespeichert!")
Ich sehe nicht, dass hier der Inhalt gelesen und gespeichert wird.
Das zeilenweise Schreiben kostet bei großen Dateien Zeit.
Besser Inhalt sammeln und auf einmal schreiben:
; ##### Variable um in einem Rutsch in Datei zu schreiben:
$sToWrite = ''
For $NextLoop = 0 To _GUICtrlListView_GetItemCount($ListView3) - 1
$MusicText = _GUICtrlListView_GetItemTextArray($ListView3, $NextLoop)
$sToWrite &= _
$MusicText[1] & "|" _
& $MusicText[2] & "|" _
& $MusicText[3] & "|" _
& $MusicText[4] & "|" _
& $MusicText[5] & "|" _
& $MusicText[6] & "|" _
& _GetMusicPathByName($MusicText[1]) & @CRLF
Next
$Fopen = FileOpen(@ScriptDir & "\Music2.txt", 2)
FileWrite($Fopen, StringTrimRight($sToWrite, 2)) ; hier alles auf einmal schreiben
FileClose($Fopen)
Alternativ geht auch StringRegExp():
[autoit]$test = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' & @CRLF & _
'<TEST1>' & @CRLF & _
'<TEST2>' & @CRLF & _
'<TEST3 cat="xt4"/>' & @CRLF & _
'</TEST2>' & @CRLF & _
'</TEST1>'
$search = StringRegExp($test, 'cat="([^"]+)"/', 1)
If IsArray($search) Then
MsgBox(0, '', 'Found: ' & $search[0])
Else
MsgBox(0, '', 'Kein Inhalt gemäß Muster')
EndIf
Hi,
du hast nun das Ergebnis geposted - ich brauch aber mal eine Zeile der Original.csv. Natürlich keine Echtdaten, nur in der Form etwa:
Zeile_in_CSV=Feld1,Feld2,Feld3,Feld4,Feld5
Feld1 = GRUPPE
Feld2 = BLA
Feld3 = BLUB
Feld4 = DIES
Feld5 = DAS
Und dann, die Zuordnungen
- je Gruppe ein Tabellenblatt
- innerhalb Gruppe Anordnung nach Muster/Sortierung....
- Auswerteblatt mit Einzel/Summen-Darstellung der Gruppen nach Kriterien..
Das Problem hier ist sicher nicht die skriptmäßige Umsetzung (das erklärt mein Bsp. bzw. die anderen Funktionen der Excel-UDF), sondern wohl eher die Auswertelogik zu erstellen.
Ich weiß nicht, woher die Info für die Gruppenzugehörigkeit stammt. Steht das in der csv?
Wenn alle Daten gemeinsam in einer Datei stehen, mußt du zuerst nach Gruppen sortieren. Anschließend überträgst du jeweils die Daten einer Gruppe auf ein Tabellenblatt. Das Tabellenblatt zur Auswertung enthält dann Formeln, die auf die einzelnen Tabellenblätter verweisen.
Normale Excel-Formeln halt. Ich häng dir mal noch eine nützliche Funktion zur Bestimmung der belegten Zeilen/Spalten an.
;==================================================================================================
; Function: _ExcelBookGetWidth($oExcel [, $iTyp=1 [, $iHeader=1 [, $sCol='A']]])
; Description: Gibt die letzte belegte Zeile und/oder Spalte einer Tabelle zurück
; Syntax: _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
; Parameter(s): $oExcel - Referenz eines geöffneten Excel Objekts
; $iTyp - 1=letzte Spalte (Standard); 2=letzte Zeile; 3=Spalte|Zeile
; $iHeader - Nummer der Zeile, in der die letzte Spalte gesucht wird
; $sCol - Buchstabe der Spalte, in der die letzte Zeile gesucht wird
; Return Value(s): Erfolg - letzte Spalte und/oder Zeile
; Ist die Zeile oder Spalte leer, wird '0' zurückgegeben
; Fehler - 0 und setzt @error:
; @error=1 - Objekt existiert nicht
; @error=2 - $iTyp oder $iHeader außerhalb des Wertebereichs (1 - 65536)
; @error=3 - $sCol außerhalb des Wertebereichs (A - IV)
; Requirement(s): $iHeader bzw. $sCol sind durchgängig bis zum letzten Zeilen-/Spaltenelement belegt
; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
;==================================================================================================
Func _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
If $iTyp < 1 Or $iHeader < 1 Or $iTyp > 65536 Or $iHeader > 65536 Then Return SetError(2, 0, 0)
$sCol = StringUpper($sCol)
If StringLen($sCol) = 2 Then
Local $str = StringSplit($sCol, '')
If Asc($str[1]) < 65 Or Asc($str[1]) > 73 Then Return SetError(3, 0, 0)
If Asc($str[2]) < 65 Or Asc($str[2]) > 90 Or _
(Asc($str[1]) = 73 And Asc($str[2]) > 86) Then Return SetError(3, 0, 0)
ElseIf StringLen($sCol) > 2 Then
Return SetError(3, 0, 0)
EndIf
If Asc($sCol) < 65 Or Asc($sCol) > 90 Then Return SetError(3, 0, 0)
Local $sColOut, $iRowOut
Select
Case $iTyp = 1 Or $iTyp = 3
For $i = 65 To 90
If $oExcel.Activesheet.Range(Chr($i) & $iHeader).Value = '' Then
If $i = 65 Then
$sColOut = 0
Else
$sColOut = Chr($i-1)
EndIf
ExitLoop
EndIf
If $i = 90 Then
For $j = 65 To 73
For $k = 65 To 90
If $j = 73 And $k = 87 Then
$sColOut = Chr($j) & Chr($k-1)
ExitLoop
EndIf
If $oExcel.Activesheet.Range(Chr($j) & Chr($k)).Value = '' Then
If $k = 65 Then
$sColOut = Chr($j)
Else
$sColOut = Chr($j) & Chr($k-1)
EndIf
ExitLoop
EndIf
Next
Next
EndIf
Next
ContinueCase
Case $iTyp = 2
For $i = 1 To 65536
If $oExcel.Activesheet.Range($sCol & $i).Value = '' Then
$iRowOut = $i -1
ExitLoop
EndIf
Next
EndSelect
Switch $iTyp
Case 1
Return $sColOut
Case 2
Return $iRowOut
Case 3
Return $sColOut & '|' & $iRowOut
EndSwitch
EndFunc ;==>_ExcelBookGetWidth
Habe zwischenzeitlich schon mal ein allgemeines Muster erstellt:
[autoit]#Include <Excel.au3>
#include <File.au3>
Local $csv = @ScriptDir & '\test_x.txt', $aCSV, $split
_FileReadToArray($csv, $aCSV)
$oExcel = _ExcelBookNew()
; in einzelne Zelle (Z2S2) schreiben (aus Datei Zeile1/ zweites Element ==> Vorname)
_ExcelWriteCell($oExcel, 'NAME', 1, 1)
_ExcelWriteCell($oExcel, 'VORNAME', 1, 2)
$split = StringSplit($aCSV[1], ',', 2)
_ExcelWriteCell($oExcel, $split[1], 2, 2)
; Tabellenblatt umbenennen
_ExcelSheetNameSet($oExcel, "Muster_1")
; nächstes Tabellenblatt aktivieren - wenn kein weiteres da ==> erstellen
$aSheets = _ExcelSheetList($oExcel)
If $aSheets[0] = 1 Then _ExcelSheetAddNew($oExcel, "Muster_2")
_ExcelSheetActivate($oExcel, 2)
If _ExcelSheetNameGet($oExcel) <> "Muster_2" Then _ExcelSheetNameSet($oExcel, "Muster_2")
; Daten auf diesem Sheet eintragen
_ExcelWriteCell($oExcel, 'NAME', 1, 1)
_ExcelWriteCell($oExcel, 'VORNAME', 1, 2)
$split = StringSplit($aCSV[3], ',', 2)
_ExcelWriteCell($oExcel, $split[1], 2, 2)
; Zellen Formatieren von Sheet 2
With $oExcel.ActiveWorkbook.Sheets(2)
.range("A1:B1").Font.Size = 16
.range("A1:B1").Font.Color = 0xff0000
.range("A1:B1").Font.Bold = TRUE
.range("A1:B1").Font.Name = 'Comic Sans MS'
.range("A1:B1").Interior.Color = 0x8888ff
Endwith
; Datei speichern
;~ _ExcelBookSave($oExcel)
; oder Datei speichern unter
;_ExcelBookSaveAs($oExcel, 'Speicherpfad')
; ODER schließen UND speichern
;~ _ExcelBookClose($oExcel)
Gib mir mal ein paar Zeilen csv mit Kriterien der Zuordnung - dann mach ich ein Bsp.
Also du willst die csv zerpflücken und in verschiedene Tabellenblätter die Daten einfügen.
Das kannst du mit der Excel-UDF tun. Schau dir mal die Befehle an - da findest du, was du brauchst.
Deine Kriterien zum Aufteilen der Daten mußt du dann nur noch in ein Programm pressen. ![]()
Eine CSV ist doch defacto schon eine Exceldatei - brauchst sie in Excel nur importieren.
3 Threads zu einem Thema ist auch Spam! ![]()
[Threads zusammengefaßt]
Und nun bitte Ende der Diskussion - das ist das Skript-Forum. ==> [Thread Closed]