tim589
Goto Top

AutoIT - Wie kann ich einen Buchstaben auslesen

Ich habe folgenden Plan. Folgender Dienstplan soll jeden Monat automatisch in den Google Kalender eingetragen werden:
fd6b8b087a79fac9ff9c6a4f5fb11d7b
Die unterste Spalte ist wichtig. Hinter den Buchstaben stehen verschiedene Zeiten (F = Frühschicht)

Also ich weiß jetzt dass das was ich bisher zusammen gebastelt habe echt nicht die schönste Lösung ist, aber das ist die einzige Lösung die ich selber beim schreiben verstehe von den Befehlen her :D

#include <MsgBoxConstants.au3>

;Fenster maximieren
WinSetState ( "Microsoft Excel - Dienstplan 2015.xls [Schreibgeschützt] [Kompatibilitätsmodus]", "",@SW_MAXIMIZE)
;Anzeigegröße auf 100 setzen
MouseClick("left",1759, 1038,2)
Sleep(500)
MouseClick("left",1017, 577, 2)
Sleep(500)
Send( "100")
Send ("{ENTER}")
; Feld 1 anklicken
MouseClick("left",250, 379)
sleep(500)
;Textzeile anklicken
MouseClick("left",265, 149,2)
Send("^c")
InputBox("", "Zahl wird erkannt...", "", "")
sleep(500)
Send("^v")
Send("{Enter}")

Es soll quasi einfach automatisch durch geklickt werden. Am Anfang wird das Fenster maximiert dass alles immer an der gleichen Stelle ist und der Zoom wird angepasst (auf 100 gesetzt) Jetzt geht die Maus von Feld zu Feld. Bei F soll die Zeit bei im Google Kalender eingetragen werden. Im prinzip ist das ganze dann immer ein und der selbe Ablauf.Die Maus und Eingaben werden so gesteuert wie es ein User auch manuell machen würde.

Das letzte mit dem auslesen der msgbox geht schon mal nicht. Mit der msgbox macht das script eine Pause. Ich muss jetzt aber den Buchstaben auslesen damit die richtige Zeit eingetragen wird. Hat mir jemand eine Lösung? face-smile

Content-ID: 272584

Url: https://administrator.de/contentid/272584

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

114757
114757 21.05.2015 aktualisiert um 17:37:38 Uhr
Goto Top
Moin,
warum durchklicken face-big-smile ?, das ist absoluter mist (sorry aber das ist die leider die nackte Wahrheit). Du kannst viel zuverlässiger mit Autoit direkt auf die Excel-Zellen zugreifen indem du über COM-Automation auf das Workbook zugreifst, gleichzeitig ist dann egal wo das Workbook auf dem Bildschirm steht, das kann sogar unsichtbar sein (Zeile 3 des Scripts auf False ändern)
; Excel öffnen
$objExcel = ObjCreate("Excel.Application")  
$objExcel.Visible = true

; Dokument öffnen
$doc = $objExcel.Workbooks.Open("C:\Pfad\Dienstplan 2015.xls")  

; Worksheet 1 einer Variablen zuweisen
$sheet = $doc.Worksheets.Item(1)

; Fürs Beispiel die Zellen A18:E18 nacheinander durchlaufen und ausgeben
for $cell in $sheet.Range("A18:E18")  
	msgbox(0,"","Wert der Zelle ist " & $cell.Value)  
        ; je nach Buchstabe etwas machen ...
        if $cell.Value = "F" then  
           msgbox(0,"","Zeit für F = 05:00 14:00")  
        else
           msgbox(0,"","Zeit für S = 14:00 - 23:00")  
        Endif
Next
Gruß jodel32
TIM589
TIM589 21.05.2015 um 18:13:14 Uhr
Goto Top
hammer face-smile
des ist perfekt hehe. Wie gesagt ich kenn mich da echt kaum mit aus. Des wusste ich zb. nicht wie diese Befehle gehen, oder ob es sie gibt. Google hilft da irg wie auch nur Bedingt weiter. Wenn man weiß wie man es anstellen will kommt man mit Google schon einigermaßen weiter aber wie ich hier zb. die Zahlen oder Buchstaben auslese dazu habe ich lange gesucht und nichts gefunden :D

Vielen Dank dir!

Beim durchschauen bin ich mir noch nicht ganz sicher was bei Zeile 8.9 gemeint ist aber ich denke das finde ich heraus ;)
114757
114757 21.05.2015 aktualisiert um 18:21:13 Uhr
Goto Top
Beim durchschauen bin ich mir noch nicht ganz sicher was bei Zeile 8.9 gemeint ist aber ich denke das finde ich heraus ;)
Damit sagst du auf welchem Tabellenblatt die Daten im Excel-Dokument stehen. Im Beisipiel ist es das erste. Du kannst anstatt des Index aber auch den Namen verwenden.
$sheet = $doc.Worksheets.Item("Tabelle1") 
TIM589
TIM589 21.05.2015 um 18:36:53 Uhr
Goto Top
achso. ja perfekt dann könnte man theoretisch ein ganzes Jahr komplett eintragen lassen, weil die tabellen sind die Monate. Der Dienstplan geht direkt über ein ganzes Jahr face-smile
Vielen Dank nochmal!
114757
114757 21.05.2015 aktualisiert um 18:40:28 Uhr
Goto Top
ja perfekt dann könnte man theoretisch ein ganzes Jahr komplett eintragen lassen, weil die tabellen sind die Monate
Könnte man, aber das würde ich dann komplett z.B. mit Powershell und dem Google-Clalendar API lösen und nicht mit einer Auto-Klickorgie face-smile
Zitat von @TIM589:
Vielen Dank nochmal!
Keine Ursache.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.

Gruß jodel
TIM589
TIM589 21.05.2015 um 23:03:10 Uhr
Goto Top
Eine Frage habe ich jetzt doch noch. Ich würde gerne die Werte mit der Inputbox selber eintragen lassen. Allerdings funktioniert das ganze nicht so wie ich es jetzt habe:

________________________________________________________________________________________________
; Excel öffnen
$objExcel = ObjCreate("Excel.Application")
$objExcel.Visible = true

; Dokument öffnen
$doc = $objExcel.Workbooks.Open("C:\Users\Timo\Dropbox\Arbeit & Schule\Allgäu Airport\Dienstplan 2015.xls")
$Monat = InputBox("Monatsangabe","Bitte geben Sie den gewünschten Monat an! (Beispiel: 1 für Januar oder 2 für Februar)")
; Worksheet 1 einer Variablen zuweisen


$sheet = $doc.Worksheets.Item($Monat)


$Zellenanfang = InputBox("Zellenabfrage","Bitte geben die Anfangszelle Ihres Planes an! (Beispiel: C35)")
$Zellenende = InputBox("Zellenabfrage","Bitte geben die Anfangszelle Ihres Planes an! (Beispiel: AB35)")
; Fürs Beispiel die Zellen A18:E18 nacheinander durchlaufen und ausgeben


for $cell in $sheet.Range("$Zellenanfang:$Zellenende")


msgbox(0,"","Wert der Zelle ist " & $cell.Value)
; je nach Buchstabe etwas machen ...
if $cell.Value = "F" then
_______________________________________________________________________________________________

Bei den größeren Lücken findest du die beiden Stellen. Also $Monat,$Zellenanfang und $Zellenende. Da kommt immer eine Fehlermeldung und den Monat nimmt er zwar aber nicht richtig, dann kommt bei der Zellenabfrage wieder die Fehlermeldung weil keine Tabelle mit dem Namen $Monat existiert. So hab ich es mal verstanden.
114757
114757 22.05.2015 aktualisiert um 00:04:08 Uhr
Goto Top
Also, erstens lieferst du mit der InputBox eine Variable vom Typ String zurück. Jedoch erwartet Excel bei der Übergabe eines Strings, bei der Angabe des Worksheets den Namen des Sheets und nicht die Nummer. Wenn du den Index angeben willst, muss das auch ein Integer-Wert sein, also musst du die Variable in einen Integer umwandeln
$doc.Worksheets.Item(Number($Monat))

Zweitens ist die Angabe des Ranges nicht korrekt. Variablen werden in AutoIT nicht innerhalb von Anführungszeichen expandiert ! Du musst sie also miteinander verketten:
for $cell in $sheet.Range($Zellenanfang & ":" & $Zellenende)
Gruß jodel32
TIM589
TIM589 23.05.2015 um 11:59:42 Uhr
Goto Top
Vielen Dank dir! Bester Mann face-smile
Das klappt schon mal perfekt jetzt. Falls ich irg wo weitere Probleme haben sollte melde ich mich wieder face-smile
TIM589
TIM589 02.06.2015 um 10:13:29 Uhr
Goto Top
Ich war letzte Woche im Urlaub und kann jetzt erst weiter an dem Programm arbeiten sonst wäre mir die Frage schon früher aufgefallen.

Wie kann ich folgendes deklarieren:
In Excel Zelle C ist immer der 1. vom Monat, D ist immer der 2. usw. das ganze geht dann bis zum 31. durch

und noch etwas. Es wird mit einer MsgBox abgefragt, welcher Monat genommen wird. Diesen muss ich ebenfalls weiter verwenden. Für die Datumsangabe.

So sieht es jetzt aus. Ganz unten fehlen mir die beiden sachen wie ich das Datum angeben kann, der Rest dürfte einfach sein.

_________________________________________________________________________________________________________
func _stop()
Exit
endFunc
HotKeySet("{Esc}","_stop") ;Ende mit Escape

; Excel öffnen
$objExcel = ObjCreate("Excel.Application")
$objExcel.Visible = true

; Dokument öffnen
$doc = $objExcel.Workbooks.Open("\\apa-file\Daten\98 - Alle\Dienstpläne\Aviation\Dienstplan 2015.xls")
$Monat = InputBox("Monatsangabe","Bitte geben Sie den gewünschten Monat an! (Beispiel: 1 für Januar oder 2 für Februar)")
; Worksheet 1 einer Variablen zuweisen
$sheet = $doc.Worksheets.Item(Number($Monat))

$Zellenanfang = InputBox("Zellenabfrage","Bitte geben den ersten Tag Ihres Planes an! (Beispiel: C35)")
$Zellenende = InputBox("Zellenabfrage","Bitte geben den letzten Tag Ihres Planes an! (Beispiel: AB35)")

;Google Kallender öffnen
$programm = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
ShellExecute($programm,"www.google.com/calendar")
WinWaitActive("Google Kalender - Google Chrome")
$titel = WinGetTitle("Google Kalender - Google Chrome")
WinMove("Google Kalender - Google Chrome","",0,0,1936, 1066) ; Platzieren
MsgBox(0,"Google Chrome wird geöffnet.","Bitte loggen Sie sich in ihr Google Kalender Konto ein. Klicken Sie dann erst auf OK!")


; Fürs Beispiel die Zellen A18:E18 nacheinander durchlaufen und ausgeben
for $cell in $sheet.Range($Zellenanfang & ":" & $Zellenende)
;msgbox(0,"","Wert der Zelle ist " & $cell.Value)
;je nach Buchstabe etwas machen ...
;if $cell.Value = "F" then
;msgbox(0,"","Zeit für F = 05:00 14:00")
;Endif
if $cell.value = "F" Then
MouseClick("left",102, 228)
Send("Frühschicht")
Next
_________________________________________________________________________________________________________
TIM589
TIM589 02.06.2015 um 11:12:06 Uhr
Goto Top
Hab doch noch eine andere Lösung gefunden allerdings muss man jetzt beim 1. vom Monat immer anfangen, sonst wird komplett alles verschoben :D

Vielleicht findet sich ja doch noch ne Möglichkeit um die Zelle C dem 1. vom Monat zuzuweisen^^

Hier meine Lösung:
_______________________________________________________________________________________________
func _stop()
Exit
endFunc
HotKeySet("{Esc}","_stop") ;Ende mit Escape

; Excel öffnen
$objExcel = ObjCreate("Excel.Application")
$objExcel.Visible = true

; Dokument öffnen
$doc = $objExcel.Workbooks.Open("\\apa-file\Daten\98 - Alle\Dienstpläne\Aviation\Dienstplan 2015.xls")
$Monat = InputBox("Monatsangabe","Bitte geben Sie den gewünschten Monat an! (Beispiel: 1 für Januar oder 2 für Februar)")
; Worksheet 1 einer Variablen zuweisen
$sheet = $doc.Worksheets.Item(Number($Monat))

$Zellenanfang = InputBox("Zellenabfrage","Bitte geben den ersten Tag Ihres Planes an! (Beispiel: C35) WICHTIG: Bitte immer beim 1. des Monats anfangen!")
$Zellenende = InputBox("Zellenabfrage","Bitte geben den letzten Tag Ihres Planes an! (Beispiel: AB35)")

;Google Kallender öffnen
$programm = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
ShellExecute($programm,"www.google.com/calendar")
WinWaitActive("Google Kalender - Google Chrome")
$titel = WinGetTitle("Google Kalender - Google Chrome")
WinMove("Google Kalender - Google Chrome","",0,0,1936, 1066) ; Platzieren
MsgBox(0,"Google Chrome wird geöffnet.","Bitte loggen Sie sich in ihr Google Kalender Konto ein. Klicken Sie dann erst auf OK!")

$x=0

for $cell in $sheet.Range($Zellenanfang & ":" & $Zellenende)
;msgbox(0,"","Wert der Zelle ist " & $cell.Value)
;je nach Buchstabe etwas machen ...
;if $cell.Value = "F" then
;msgbox(0,"","Zeit für F = 05:00 14:00")
;Endif
; Fürs Beispiel die Zellen A18:E18 nacheinander durchlaufen und ausgeben
$Fa = "5:00"
$Fe = "14:00"
$Sa = "14:00"
$Se = "23:00"
;Zähler für die Wochentage
$x=$x+1

if $cell.value = "F" Then
MouseClick("left",102, 228)
Sleep(500)
Send("Frühschicht")
Send("{TAB}")
Send($x & "." & $Monat & ".2015") ;Datum
Send("{TAB}")
Send($Fa) ;Von
Send("{TAB}")
Send($Fe) ;Bis
MouseClick("left",156, 178) ;Speichern
EndIf
if $cell.value = "S" Then
MouseClick("left",102, 228)
Sleep(500)
Send("Spätschicht")
Send("{TAB}")
Send($x & "." & $Monat & ".2015") ;Datum
Send("{TAB}")
Send($Sa) ;Von
Send("{TAB}")
Send($Se) ;Bis
MouseClick("left",156, 178) ;Speichern
EndIf
Next
_________________________________________________________________________________________________________
114757
114757 02.06.2015 aktualisiert um 11:37:40 Uhr
Goto Top
$anfang = InputBox("Zellenabfrage","Bitte geben den ersten Tag Ihres Planes an! WICHTIG: Bitte immer beim 1. des Monats anfangen!")  
$ende = InputBox("Zellenabfrage","Bitte geben den letzten Tag Ihres Planes an!")  

for $cell in $sheet.Range($sheet.Cells(35,2 + Number($anfang)),$sheet.Cells(35,2 + Number($ende))
....
...
..
.
oh man wie umständlich mit der Klickerei und unzuverlässig hoch drei ...
Die armen Leute die das verwenden müssen face-wink da hab ich richtig Mitleid mit denen.
Mit Powershell und dem Google API geht das wesentlich zuverlässiger, ohne irgendein sichtbares Fenster !

Na dann noch viel Spaß beim Frickeln...

i'm out'a here

Gruß jodel32
TIM589
TIM589 02.06.2015 um 12:40:25 Uhr
Goto Top
hehe du hast ja recht :D Ich sag ja ich kenn mich da noch nicht wirklich mit aus unso. Bis vor dem hier habe ich nur mal ein wenig rum probiert eine Installation automatisch laufen zu lassen, das ist aber auch schon ein Jahr her und ich hab irg wann nicht mehr weiter gemacht. Meine Kenntnisse sind also gleich Null ;)

Dass das soweit funktioniert, da bin ich schon recht stolz :D

Ich danke dir vielmals. Du hilfst echt richtig top weiter!