Daten aus Excel auslesen und ins ERP einlesen

  • Hallo Forum

    Ich habe kleines Problem und ich hoffe das ihr mir weiterhelfen könnt.

    Ich musste fast täglich Daten aus einem Excel in unser ERP-System reinschreiben, was nicht gerade der schönste Job ist. Nun habe ich vor ca. 1 Woche mein erlöser AutoIT endeckt und lese mich in die Materie ein.
    Habe vorgestern mein ersten hiifreichen script fertig gestellt, der aber noch etwas langsam ist. Der Script funktioniert wie folgt;

    1. Artikel Nr. aus Excel kopieren
    2. ERP Programm Artikeldaten aktivieren, Artikel such modul öffnen, kopierte Artikel nr. einfügen, enter (Neues Fenster geht auf, Artikeldetails)
    3. Excel aktivieren, Info zelle vom Artikel kopieren
    4. ERP einfügen
    5. Excel, Info2 kopieren
    6 ERP einfügen
    etc, etc, etc.

    Die Schritte sind im Quellcode nochmals erläutert.

    Der Script sieht wie folgt aus "Ist für euch bestimmt etwas lustig da das Ding sehr einfach aufgebaut ist :S " Wie gesagt bin 2 Wochen Neu...

    [autoit]


    Opt("WinWaitDelay",1000)
    Opt("WinTitleMatchMode",4)
    Opt("WinDetectHiddenText",1)
    Opt("MouseCoordMode",0)
    Opt("SendKeyDelay",25)
    Opt("SendKeyDownDelay",25)
    $Pause=500

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{ESC}","Beenden")
    Func _exit()
    EXIT
    Endfunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $i = 1 to 49
    ;~ Artikelnummer aus Excel kopieren, Cursor in das erste zu kopierende Feld stellen, Cluster voreinstellen!!!
    WinWait("Microsoft Excel - Planartikel_PlanfensterExtra","")
    If Not WinActive("Microsoft Excel - Planartikel_PlanfensterExtra","")Then WinActivate("Microsoft Excel - Planartikel_PlanfensterExtra","")
    WinWaitActive("Microsoft Excel - Planartikel_PlanfensterExtra","")
    Send("{CTRLDOWN}c{CTRLUP}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Sleep($Pause)
    ;~ Planartikel suchen ERP
    WinWait("cprpd1500m000 : Plan Item Data [User: pagnro] [400]","")
    If Not WinActive("cprpd1500m000 : Plan Item Data [User: pagnro] [400]","")Then WinActivate("cprpd1500m000 : Plan Item Data [User: pagnro] [400]","")
    WinWaitActive("cprpd1500m000 : Plan Item Data [User: pagnro] [400]","")

    [/autoit][autoit][/autoit][autoit]

    Send("{CTRLDOWN}f{CTRLUP}")

    [/autoit][autoit][/autoit][autoit]

    Send("{TAB}{TAB}{TAB}{CTRLDOWN}v{CTRLUP}{TAB}{ENTER}{ENTER}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Planungsfensterdaten aus Excel kopieren
    WinWait("Microsoft Excel - Planartikel_PlanfensterExtra","")
    If Not WinActive("Microsoft Excel - Planartikel_PlanfensterExtra","")Then WinActivate("Microsoft Excel - Planartikel_PlanfensterExtra","")
    WinWaitActive("Microsoft Excel - Planartikel_PlanfensterExtra","")

    [/autoit][autoit][/autoit][autoit]

    Send("{TAB}{TAB}{TAB}{TAB}{CTRLDOWN}c{CTRLUP}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Sleep($Pause)
    ;~ Planungsfenster im ERP eintragen Baan
    WinWait("cprpd1101s000 : Plan Items [User: pagnro] [400]","")
    If Not WinActive("cprpd1101s000 : Plan Items [User: pagnro] [400]","")Then WinActivate("cprpd1101s000 : Plan Items [User: pagnro] [400]","")
    WinWaitActive("cprpd1101s000 : Plan Items [User: pagnro] [400]","")

    [/autoit][autoit][/autoit][autoit]

    Send("{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{CTRLDOWN}v{CTRLUP}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Extra-Lead aus Excel kopieren
    WinWait("Microsoft Excel - Planartikel_PlanfensterExtra","")
    If Not WinActive("Microsoft Excel - Planartikel_PlanfensterExtra","")Then WinActivate("Microsoft Excel - Planartikel_PlanfensterExtra","")
    WinWaitActive("Microsoft Excel - Planartikel_PlanfensterExtra","")

    [/autoit][autoit][/autoit][autoit]

    Send("{TAB}{CTRLDOWN}c{CTRLUP}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Sleep($Pause)
    ;~ Extra leadtime im ERP eintragen
    WinWait("cprpd1101s000 : Plan Items [User: pagnro] [400]","")
    If Not WinActive("cprpd1101s000 : Plan Items [User: pagnro] [400]","")Then WinActivate("cprpd1101s000 : Plan Items [User: pagnro] [400]","")
    WinWaitActive("cprpd1101s000 : Plan Items [User: pagnro] [400]","")

    [/autoit][autoit][/autoit][autoit]

    Send("{TAB}{TAB}{TAB}{TAB}{CTRLDOWN}v{CTRLUP}{TAB}{TAB}{TAB}{ENTER}{UP}{ENTER}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ nächster Artikel wählen
    WinWait("Microsoft Excel - Planartikel_PlanfensterExtra","")
    If Not WinActive("Microsoft Excel - Planartikel_PlanfensterExtra","")Then WinActivate("Microsoft Excel - Planartikel_PlanfensterExtra","")
    WinWaitActive("Microsoft Excel - Planartikel_PlanfensterExtra","")

    [/autoit][autoit][/autoit][autoit]

    Send("{DOWN}{LEFT}{LEFT}{LEFT}{LEFT}{LEFT}")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Next
    Func Beenden()
    While 1
    Exit
    WEnd
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]

    Jetzt die Frage an die Profis, ist es möglich das ich die DAten alle beisammen aus dem Excel kopiere und im ERP einlese? Ich habe etwas über .ini gelesen, bekomme das aber nicht hin. Technisch hatte ich mir das so vorgestellt.
    1. DAten aus Excel auslesen
    2. Datensatz 1 ins ERP eintragen --> Artikel suchen, Artikel Detail öffnen, Wert1 eintragen, Wert2 eintragen, Wert3 eintragen, etc, etc, speicher schliessen.
    3. DAtensatz 2........
    Wenn di DAtensätze durch sind, stoppt das Ding. Bei meiner aktuellen Verison muss ich die Schleifen durchgänge angeben.

    Ich hoffe ihr könnt mir einen Hint geben, damit ich weiter experimentieren kann. :)

    Liebe Grüsse
    Ramona

  • Schau mal in die Hilfe. Es gibt extra eine Excel UDF. Leider kann man selber kein Script schreiben, da wir ja die ERP Software nicht haben. Somit geht's nur über "try and error".

    Achja. Hast du schonmal mit dem Window Info Tool geschaut ob du die Controls von der Software ansprechen kannst? Dann brauchst du nix mit Copy and Paste machen.
    Übrigens ist Strg+C "^c" und Strg+V ist "^v" und 4mal Tab ist "{TAB 4}".

    Einmal editiert, zuletzt von m-obi (19. Mai 2012 um 08:33)

  • Hallo m-obi

    Vielen DAnk für die schnelle Antwort! :) Try and error ist super, lern effect & funfactor. Der Hinweis mit den befehlen werde ich mir merken, im Moment muss ich die abläufe noch mit dem AU3record aufnehmen und füge sie dann im script ein. ;) Bin noch etwas neu aber das kommt schon...

    Excel UDF werde ich gleich durchlesen
    Das mit den controls vom ERP werde ich am Montag im Büro gleich prüfen, melde mich noch dazu.

    Gruss Ramona

    • Offizieller Beitrag

    muss ich die abläufe noch mit dem AU3record aufnehme


    Davon möchte ich dir dringend abraten. Dieses Tool ist nur dann halbwegs brauchbar, wenn du gar kein Standard-Control auf der Anwendung hast und tatsächlich rumklicken mußt mit Maus-Simulation.
    Der erste Weg sollte immer das AutoIt-Windows-Info-Tool sein. Da siehst du, ob die Fenster/Controls per ID oder CLASS ansprechbar sind. Nur, wenn das erfolglos ist, sollte man auf die Krücke der Mausklickerei zurückgreifen.


  • Davon möchte ich dir dringend abraten. Dieses Tool ist nur dann halbwegs brauchbar, wenn du gar kein Standard-Control auf der Anwendung hast und tatsächlich rumklicken mußt mit Maus-Simulation.
    Der erste Weg sollte immer das AutoIt-Windows-Info-Tool sein. Da siehst du, ob die Fenster/Controls per ID oder CLASS ansprechbar sind. Nur, wenn das erfolglos ist, sollte man auf die Krücke der Mausklickerei zurückgreifen.


    Ja das habe ich schon bemerkt, insbesondere weil bei einem der ersten serien Importversuche im ERP, eine unheergesehene Fehlermeldung aufgepoppt ist und mein Script einfach kreuz und quer weiter geklickt hat. :S

  • Ein Error-Handling und Abfrageroutinen sollten natürlich drin sein. Aber Mausklickerei wurde ich auch nicht machen, nur im äußersten Notfall.

  • Hi

    So, da melde ich mich wider... Habe mich euren Tipps angenommen und habe nach ein paar Stunden lesen folgendes zusammen gestellt. Da die Sache für mich etwas komplexer ist als anfänglich angenommen, habe ich das Projekt in 3 Teile gesplittet. Natürlich hätte ein Profi dies in wenigen Minuten erstellt, da ich aber Anfänger bin und verstehen will was ich da mache dauerts halt etwas länger.

    1. Excel auslesen (Excel.au3)
    2. Array funktion anzeigen und verstehen
    3. Daten aus array verwenden (Artikel suchen) und irgendwo reinschreiben (Artikelparameter)

    Für das Projekt habe einen Ordner erstellt /Daten.
    Darin sind 3 Excel Files abgelegt
    - Import Datei.xlsx (Enthält die Artikel und die Parameter)
    - Item1.xlsx (Artikel der beschrieben werden muss)
    - Item2.xlsx (dito)

    Ziel ist es aus der Importdatei ein array zu erstellen und die Datenblätter Item1& Item2 korrekt zu beschreiben. Zusätzlich sollte wenn ein Schritt nicht gemacht werdne kann eine Fehlermeldung aufpoppen.

    Nun zu meinem Script;

    Die #array.au3 habe bereits eingetragen da ich denke das diese später verwendet wird.

    Problem1
    Bei der _ExcelReadSheetToArray funktion habe ich 5 spalten und endlos viele Zeilen die ich einlese, wie kann ich nur so viele Zeilen lesen wie auch beschrieben sind?
    Bei der _ArrayDisplay Funktion bin ich überfordert, wie kann ich die Daten anzeigen? Muss ich irgendwo der Array ein Namen geben?


    [autoit]


    ;===START===
    #include <Excel.au3>
    #include <File.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $sFilePath = "C:\Users\RP2\Desktop\daten\ImportDatei.xlsx" ; Dateiquelle
    $oExcel = _ExcelBookOpen($sFilePath); Datei öffen

    [/autoit][autoit][/autoit][autoit]

    ;File überprüfung
    If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Import Datei nicht gefunden")
    Exit
    EndIf
    ;Daten aus Excel auslesen
    _ExcelSheetActivate($oExcel, "Tabelle1") ; Richtigen Reiter aktivieren
    _ExcelReadSheetToArray($oExcel, 2, 1, 0, 5, True) ; Daten auslesen
    _ArrayDisplay(

    [/autoit][autoit][/autoit][autoit][/autoit]

    MFG Ramona

    • Offizieller Beitrag

    wie kann ich nur so viele Zeilen lesen wie auch beschrieben sind?


    Gibt verschiedene Möglichkeiten. Ich habe z.B. die Funktion _ExcelBookGetWidth() erstellt, mit der sich das abfragen läßt.
    Andere Variante:

    [autoit]

    ; === letzte Zeile
    ConsoleWrite('Anzahl Zeilen: ' & $oExcel.Worksheets(1).UsedRange.Rows.Count & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ; === letzte Spalte
    ConsoleWrite('Anzahl Spalten: ' & $oExcel.Worksheets(1).UsedRange.Columns.Count & @CRLF)

    [/autoit]
  • In ArrayDisplay kommt das Array rein, welches du dir ansehen möchtest. Eigentlich ist in der Hilfe zu _ExcelReadSheetToArray alles beschrieben. Der Rückgabewert ist ein Array.

  • In ArrayDisplay kommt das Array rein, welches du dir ansehen möchtest. Eigentlich ist in der Hilfe zu _ExcelReadSheetToArray alles beschrieben. Der Rückgabewert ist ein Array.


    Kannst du mir weiterhelfen, wie würde der Script aussehen? Das excel hat 5 Spalten und sagen wir 5 Zeilen. Nach dem auslesen würde ich das gerne angezeigt haben..
    Vielen Dank

  • Das $oExcel... Jeweils als Zeile und Spalte angeben. Steht doch da was es liefert.

  • Ich schreibe alles am Handy. Lappi ist momentan nicht bereit.
    Also etwa so:

    [autoit]

    $aSheet = _ExcelReadSheetToArray(...)
    _ArrayDisplay($aSheet)

    [/autoit]
  • I will das aber als eine Tabelle 5x5 angezeigt haben und nicht einzelne Werte. Ist das möglich?

  • Ich schreibe alles am Handy. Lappi ist momentan nicht bereit.
    Also etwa so:

    [autoit]

    $aSheet = _ExcelReadSheetToArray(...)
    _ArrayDisplay($aSheet)

    [/autoit]


    Ah, OK.... versuch ich gleich mal...

    Vielen DAnk

  • Ich bin da auf dem Holzweg, da wird nichts angezeigt.

    Excel wird geöffnet, Excel tabelle angewählt und dann nix mehr... :(

    Das ist der Script, was ist falsch?

    [autoit]


    ;===START===
    #include <Excel.au3>
    #include <File.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $sFilePath = "C:\Users\RP2\Desktop\daten\ImportDatei.xlsx" ; Dateiquelle
    $oExcel = _ExcelBookOpen($sFilePath); Datei öffen

    [/autoit][autoit][/autoit][autoit]

    ;File überprüfung
    If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Import Datei nicht gefunden")
    Exit
    EndIf
    ;Daten aus Excel auslesen
    _ExcelSheetActivate($oExcel, "Tabelle1") ; Richtigen Reiter aktivieren
    _ExcelReadSheetToArray($oExcel, 2, 1, 0, 5, True) ; Daten auslesen
    ;Tabelle im Display anzeigen
    _ArrayDisplay($oExcel, "Import Overview")

    [/autoit]
  • Schau nochmal in meinen Codeschipsel. Du willst ein Objekt übergeben. Es muss aber ein Array sein.

  • Ja sag doch einfach das ich der array erst einen Namen geben muss! :thumbup: Bin doch ein blutiger Anfänger... ;)

    Es hat funktioniert!! So geil! Endlich nahc 10h Arbeit kann ich das excel auswählen, die richtige Tabelle kopieren und diese in einmr array zur verfügung stellen :)

  • Wenn ich jetzt die WErte aus der Array verwendet möchte um z.B. eine Excel Datei in einem bestimmten pfad zu finden. Wie muss da der Script aussehen? Ich habe folgenden Script vorbereitet.
    Im Script habe ich die Komentare eingetragen. Kann mir jemand helfen?

    [autoit][/autoit][autoit][/autoit][autoit]

    ;Anhand von der Array Info in Spalte2 die Excel Datei finden
    $FilePath2 = "C:\Users\RP2\Desktop\daten\?????????????.xlsx" ; Die Fragenzeichen müssten doch mit $irgendetwas (variable?) ersetzt werden?
    $Excel2 = _ExcelBookOpen($FilePath2); Datei öffen
    ;Prüfen ob es diese Datei gibt und wenn nötig Fehler ausgeben
    If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Import Datei nicht gefunden")
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit]

    Vielen Dank

  • Ich weiß ja jetzt nicht welchen Index du nimmst, aber ich nehme jetzt einfach mal den ersten, also 0.

    [autoit]

    $FilePath2 = "C:\Users\RP2\Desktop\daten\" & $aSheet[0][1] & ".xlsx"

    [/autoit]
  • Ich weiß ja jetzt nicht welchen Index du nimmst, aber ich nehme jetzt einfach mal den ersten, also 0.

    [autoit]

    $FilePath2 = "C:\Users\RP2\Desktop\daten\" & $aSheet[0][1] & ".xlsx"

    [/autoit]


    Perfect! Habe ich mir nicht mal schlecht zusammen gereimt! :)

    Vielen lieben Dank! :party:
    LG