Excel Tabelle auslesen und Datumsformat mit übernehmen

  • Hallo arbeite gerade daran eine exportierte Excel Liste auf eigene Ansprüche zu verbessern, leider hänge ich an 2 entscheidenen Punkten.

    Also ich arbeite mit 3 Tabellen. Die erste ist ein Export aus unserem Helpdesk, die zweite ist die NEUE und die 3 gibt nur Informationen über bestimmte Beschreibungen.

    Es soll im Grunde die erste Tabelle ausgelesen werden, in der 3 nachgeschaut ob der Eintrag vorhanden ist und dementsprechend den Eintrag in der neuen Tabelle in 2 neue Spalten aufgliedern.


    Problem 1: Es kann vorkommen das in der 3 Tabelle kein entsprechender Wert existiert und das Programm dann eine Ausnahmebehandlung durchführen soll (ist mir bisher nicht gelungen)
    Problem 2: Das Datumsformat in der 1 Tabelle wird in der 2 nicht berücksichtigt und es kommt einfach nur eine elendig lange Zahl.

    Hier mal der bisherige Code (bißchen unübersichtlich sorry)

    [autoit]

    #include <Excel.au3>
    #include<Array.au3>

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

    $sFilePath = "C:\SC_Export\SC_Export"
    $oExcel = _ExcelBookOpen($sFilePath)
    $description = _ExcelBookOpen("C:\SC_Export\test.xls")
    $new = _ExcelBookNew()
    $eingabe = string("")

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

    ;Gucken wieviele Tickets in SC Export existieren
    $atickets = string("Zellen zählen")
    $zticket = 1
    while $atickets <> ""
    $atickets = _ExcelReadCell($oExcel,$zticket,1)

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

    $zticket = $zticket + 1
    WEnd

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

    ;gucken wieviele Descriptions vorhanden sind
    $adescription = string("Zellen zählen")
    $zdescription = 1
    while $adescription <> ""
    $adescription = _ExcelReadCell($description,$zdescription,1)

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

    $zdescription = $zdescription + 1
    WEnd
    msgbox(0,"$zticket",$zticket)
    msgbox (0,"$zdescription",$zdescription)

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

    For $zeile = 1 To $zticket

    for $spalte = 1 to 25
    $zelle = _ExcelReadCell($oExcel,$zeile,$spalte)


    #region 2 Spalten einfügen für Desription Split
    if $spalte = 6 Then
    $spalte = $spalte + 2
    endif
    _excelwritecell($new,$zelle,$zeile,$spalte)
    #endregion


    ;Splitten der Brief Description
    if $spalte = 8 and $zeile > 1 then
    $i = 1
    $e = string(" ")
    $t = int(0)

    for $i = 1 to $zdescription
    $e = _ExcelReadCell($description,$i,1)
    $t = StringCompare($zelle,$e)

    if $t = 0 then
    $e1 = _ExcelReadCell($description,$i,2)
    $e2 = _ExcelReadCell($description,$i,3)
    _ExcelWriteCell($new,$e1,$zeile,6)
    _ExcelWriteCell($new,$e2,$zeile,7)

    endif
    Next

    endif


    Next
    Next

    [/autoit]
  • Könntest Du das nicht mit Excel alleine machen?
    Ich denke da an sowas ähnliches wie =Wenn(Tabelle1a1:z99;zu suchendes Element aus Tabelle3;Tabelle2a1)
    Häng doch mal drei solcher Tabellen an.

    • Offizieller Beitrag

    Um ein Excel-Datum auszulesen, darfst du nicht den Wert (.Value) der Zelle auslesen, sondern mußt die Formel (.Formula) auslesen.
    Der Wert gibt dir das Datum als 'JJJJMMTThhmmss' zurück. Wenn du das in eine andere Zelle einträgst, wird es als Zeichenkette und nicht als Datum erkannt.
    Die Formel gibt den intern verwendeten Integerwert für das Datum zurück. Schreibst du diesen in eine andere Zelle und formatierst als Datum, so wird auch das korrekte Datum angezeigt.
    Und verwende bei deinen Variablen besser einen Bezug zum Typ - $o.. für Objekt. Macht es lesbarer.

    Spoiler anzeigen
    [autoit]

    $oExcel = ObjCreate('Excel.Application')

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

    $sPath1 = 'C:\Test\test.xls'
    $sPath2 = 'C:\Test\test_1.xls'

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

    $RangeRead = 'D1'
    $RangeWrite = 'A1'

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

    $oBook1 = $oExcel.Workbooks.Open($sPath1)
    $oBook2 = $oExcel.WorkBooks.Add

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

    $Date = $oBook1.Sheets(1).Range($RangeRead).Formula ; Datum ist kein Wert, sondern eine Formel, Wert bringt: JJJJMMTThhmmss!!

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

    $oBook2.Sheets(1).Range($RangeWrite).Value = $Date
    $oBook2.Sheets(1).Range($RangeWrite).NumberFormat = "TT.MM.JJJJ"

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

    $oExcel.DisplayAlerts = False ; <== unterdrückt Speichern - Nachfrage
    $oExcel.ActiveWorkBook.SaveAs($sPath2)
    $oExcel.Application.Quit

    [/autoit]
  • Vielen Dank, habs gerade getestet so läuft das mit dem Datum wunderbar.

    Jetzt muss ich peinlicher Weise nachfragen, einfach um das Verständnis zu bekommen...

    Du liest in deinem Script die Excel Liste auf eine ganz andere Methode aus, als ich das tue.
    In meiner Hilfe stehen aber diese Befehle, die du verwendest gar nicht mit drinnen.
    Oder ich bin derart Blind. Wo kann ich denn sowas auch nachlesen?

    Danke!:)


    Wenn ich es auf diese Weise tue, erscheint das Datum und ist auch sofort wieder weg, diesen Effekt hatte ich schon einmal, bekomme diesen
    hier gerade aber nicht geregelt :(

    [autoit]

    $range = string("I") & string($zeile)
    $rangewrite = string("Q") & $zeile
    if $spalte = 9 and $zeile > 1 Then
    $Date = $oExcel.Sheets(1).Range($range).Formula ; Datum ist kein Wert, sondern eine Formel, Wert bringt: JJJJMMTThhmmss!!

    $new.Sheets(1).Range($rangewrite).Value = $Date
    $new.Sheets(1).Range($rangewrite).NumberFormat = "TT.MM.JJJJ"
    msgbox(0,"kurz anhalten","Wert vorhanden")

    [/autoit]

    3 Mal editiert, zuletzt von milchtrinker (9. November 2010 um 11:55)

    • Offizieller Beitrag

    Du liest in deinem Script die Excel Liste auf eine ganz andere Methode aus, als ich das tue.
    In meiner Hilfe stehen aber diese Befehle, die du verwendest gar nicht mit drinnen.
    Oder ich bin derart Blind. Wo kann ich denn sowas auch nachlesen?


    :D Wenn man mit dem Excel- (oder auch Word-) Objekt umgehen kann, ist es einfacher die direkten Befehle zu verwenden. Du siehst diese nur nicht, weil sie innerhalb der UDF-Funktionen ablaufen. (Einfach mal das Excel-Include öffnen und die einzelnen Funktionen anschauen).

    Zu deinem Auslesen eines Bereiches. Ich habe mal ein kleines Muster erstellt und kommentiert. Ich denke, das erklärt es recht gut.

    Spoiler anzeigen
    [autoit]

    $oExcel = ObjCreate('Excel.Application')
    ;~ $oExcel.Visible = 1

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

    $sPath1 = 'C:\Test\test.xls'
    $sPath2 = 'C:\Test\test_1.xls'

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

    $RangeRead = "A1"

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

    $oBook2 = $oExcel.WorkBooks.Add
    $oBook1 = $oExcel.Workbooks.Open($sPath1)

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

    ; === nehmen wir an, es wird von A1 bis I16 gelesen
    ; === dazu bietet sich die Methode "Offset" an, es wird um ein Offset(Versatz) von (Zeilen,Spalten) zur Ausgangsrange gelesen
    ; === D.h., um die Startrange auch zu verwenden, muß mit Offset(0,0) gestartet werden (negatives Offset geht übrigens auch)
    ; === Offset funktioniert aber nicht mit dem Workbookobjekt - hier verwenden wir das Excelobjekt selbst

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

    For $i = 0 To 15 ; 16 Zeilen (1 - 16)
    For $j = 0 To 8 ; 9 Spalten (A-I)
    ; === als Zwischenschritt setze ich den Fokus auf die jeweilige Zelle (um die Zelladresse ermitteln zu können)
    $oExcel.Range($RangeRead).Offset($i, $j).Select
    ; === dann lese ich das Datum aus
    $Date = $oExcel.Selection.Formula
    ; === nun lasse ich mir die ZellAdresse ausgeben um an dieselbe Adresse in der Zieltabelle zu schreiben
    $Cell = StringReplace($oExcel.Selection.Address, '$', '')
    ; === in Zieltabelle schreiben
    $oBook2.Sheets(1).Range($Cell).Value = $Date
    ; === als Datum formatieren
    $oBook2.Sheets(1).Range($Cell).NumberFormat = "TT.MM.JJJJ"
    Next
    Next

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

    $oExcel.DisplayAlerts = False ; <== unterdrückt Speichern - Nachfrage
    $oExcel.ActiveWorkBook.SaveAs($sPath2)
    $oExcel.Application.Quit

    [/autoit]
    • Offizieller Beitrag

    Ich hab hier mal noch weitere Varianten erstellt. Die .Copy Variante ist eigentlich am Besten - du sparst dir das Formatieren, da .Copy das Format übernimmt.

    Spoiler anzeigen
    [autoit]

    ; === wenn du einen komplexen Bereich (Range) kopieren willst, geht das auch so (Formatierung wird übernommen):
    $oBook1.Sheets(1).Range('A1:I16').Copy($oBook2.Sheets(1).Range('A1:I16'))

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

    ; === Offset Variante mit Auslesen, Schreiben,Formatieren
    ; === Offset kann entweder auf das Excel-Objekt selbst oder auf Sheet-Objekte angewendet werden
    For $i = 0 To 15 ; 16 Zeilen (1 - 16)
    For $j = 0 To 8 ; 9 Spalten (A-I)
    ; === Datum aus Book1 auslesen und in Book2 eintragen
    $Date = $oBook1.Sheets(1).Range($RangeRead).Offset($i, $j).Formula
    $oBook2.Sheets(1).Range($RangeRead).Offset($i, $j).Value = $Date
    ; === als Datum formatieren
    $oBook2.Sheets(1).Range($RangeRead).Offset($i, $j).NumberFormat = "TT.MM.JJJJ"
    Next
    Next

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

    ; === Offset Variante mit Copy
    For $i = 0 To 15 ; 16 Zeilen (1 - 16)
    For $j = 0 To 8 ; 9 Spalten (A-I)
    $oRangeRead = $oBook1.Sheets(1).Range($RangeRead).Offset($i, $j)
    $oRangeWrite = $oBook2.Sheets(1).Range($RangeRead).Offset($i, $j)
    $oRangeRead.Copy($oRangeWrite)
    Next
    Next

    [/autoit]