Excel - verbundene Zellen und mehr :-)

  • Hiho,

    ich lese wiederkehrende (nach unten) Daten aus Excel ein und erstelle daraus TXT-Dateien.
    Leider sind die Daten in einer Zelle (sprich 5 Spalten) miteinander verbunden und der bricht mir die Daten in ne neue Zeile um.
    Wie kann ich dies in eine Zeile bekommen?

    Ebenso weiß ich nicht, wann die Tabelle aufhört -> mehr als 8 Zeilen leer wäre Ende der Excel-Datei, gibt es da ne einfache Prüfung odermuss ich auf leer testen??

    Spoiler anzeigen
    [autoit]


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

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

    Global $error
    Global $sFilePath1 = @ScriptDir & "\e2.xls" ; D
    Global $oExcel = _ExcelBookOpen($sFilePath1)

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

    Global $aarrayr[8][2] = [[3,1],[4,1],[12,1],[14,2],[18,2],[19,2],[18,5],[19,5]]
    Global $date

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

    $oExcel.ActiveWorkbook.Sheets("Belege").Select()

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

    If $error = 1 Then
    MsgBox(0, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden")
    Exit
    ElseIf $error = 2 Then
    MsgBox(0, "Fehler!", "Die Lese-Datei existiert nicht!")
    Exit
    EndIf

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

    Local $file = FileOpen("test.txt", 1)

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

    If $file = -1 Then
    MsgBox(0, "Fehler", "Die Schreib-Datei konnte nicht geöffnet werden.")
    Exit
    EndIf

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

    For $j = 0 to 210 step 21; wiederkehrende Zellen + 21
    For $i = 0 To 7; 8 Zellen werden gelesen
    $date =_ExcelReadCell($oExcel, ($aarrayr[$i][0])+$j,$aarrayr[$i][1])
    FileWriteLine($file, $date & @CRLF)
    Next
    FileWriteLine($file, "--------------------------------------" & @CRLF)
    Next

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

    _ExcelBookClose($oExcel) ;
    FileClose($file)

    [/autoit]

    Einmal editiert, zuletzt von Torni (31. März 2013 um 11:04)

  • Ich vermute mal, dass im gelesenen Zellenwert ein @CRLF oder @LF für die zweite oder mehrere Zeilen in der Ausgabedatei sorgt. Musst du vorher durch ein Leerzeichen ersetzen.
    Die größe des benutzten Bereiches bekommst Du durch die UsedRange property.
    $oExcel.ActiveSheet.UsedRange.Rows.Count

  • water: thx an die @LF hab ich absolut nicht gedacht, hrhrhr

    das mit dem $oExcel.ActiveSheet.UsedRange.Rows.Count gibt er mir IMMER 16384 zurück, dem ist aber so nicht.. :(
    Anscheinend wurde das in dieser Excel-Sheet so definiert oder was auch immer, aber definitv benutzt werden weniger.

  • Dann bleibt Dir nichts anderes übrig, als das Worksheet von hinten (sprich Zeile 16384) zu durchsuchen bis Du die erste Zeile/Zelle mit Inhalt findest. Mach das dann aber nicht mit _ExcelCellRead da das ewig dauert.


  • Eventuell sind ja bis an das Ende Formeln kopiert? Dann ist die Zelle auch nicht leer, also "used".

    absolut keine Formeln drin, da werden nur automatisiert Daten eingetragen. Wie entzieht sich mir leider.

  • Es reicht schon, die Zellen zu formatieren, damit $oExcel.ActiveSheet.UsedRange.Rows.Count "belegte" Zellen zurückgibt...
    Definitiv ist in dem Sheet irgendetwas bearbeitet worden.


    Btw...

    Zitat

    Dann bleibt Dir nichts anderes übrig, als das Worksheet von hinten (sprich Zeile 16384) zu durchsuchen bis Du die erste Zeile/Zelle mit Inhalt findest. Mach das dann aber nicht mit _ExcelCellRead da das ewig dauert.

    :D jaja, die VBA-Spezis wieder....sag mal irgendeine Funktion, die Excel schnell abarbeitet^^

    "Durchlaufen" dauert ewig, habe mal ein Beispiel gemacht, da wird mit nur 21 Abfragen die letzte belegte Zeile bei einer Blattgrösse von einer Million Zeilen gefunden..

    Spoiler anzeigen
    [autoit]

    dim $array[1000000]

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

    $erste=0 ;erste belegte zelle
    $letzte=ubound($array)-1;letzte mögliche zelle

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

    $last=random($erste,$letzte,1) ;letzte gefüllte zelle
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $last = ' & $last & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ;Array bis zu zufälliger Zeile füllen
    for $i= 1 to $last
    $array[$i]="a"
    Next

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

    $letzte_belegt=_findlast($erste,$letzte)
    MsgBox(0,"letzte belegte Zelle="&$last,"Suche im Array, letzte belegte Zelle = "&$letzte_belegt)

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

    func _findlast($a,$b)
    $m=$a+bitshift($b-$a,1) ;mitte
    if $m=$a or $m=$b then return $m ;letzte gefüllte Zelle gefunden
    $l=$array[$a];linke grenze
    $r=$array[$b];rechte grenze
    $mid=$array[$m];die mitte
    if $mid<>"" then
    $m=_findlast($m,$b) ;von mitte bis rechts
    Else
    $m=_findlast($a,$m) ;von links bis mitte
    endif

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

    return $m

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

    endfunc

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (30. März 2013 um 19:35)

  • Btw...

    :D jaja, die VBA-Spezis wieder....sag mal irgendeine Funktion, die Excel schnell abarbeitet^^

    Mit "das dauert ewig" habe ich mich auf Funktionen aus der Excel UDF bezogen. Die sind nicht wirklich effizient. Darum bin ich ja gerade dran, die UDF neu zu schreiben.

  • Zitat

    Mit "das dauert ewig" habe ich mich auf Funktionen aus der Excel UDF bezogen. Die sind nicht wirklich effizient. Darum bin ich ja gerade dran, die UDF neu zu schreiben.


    naja, für´s "letzte belegte Zeile finden" hast du schon eine "schnelle" Funktion^^

    Ich mache in letzter Zeit viel mit VBA, und muss sagen, genau wie bei AutoIt ist es für 99,9% aller Fälle schnell genug. AutoIt für die "externen" Programme und deren Zusammenspiel mit Excel und VBA dann fürs "eingemachte".
    Btw, die "Excel-UDF" habe ich Aufgrund der Einschränkungen nie benutzt, ggf. kannst du mich mit einer "neuen" UDF umstimmen :thumbup:

  • Btw, die "Excel-UDF" habe ich Aufgrund der Einschränkungen nie benutzt, ggf. kannst du mich mit einer "neuen" UDF umstimmen :thumbup:

    I will do my very best!
    Die Alpha-Version sollte schon einen ersten Eindruck geben. Zellbereiche (Zelle, Range, Sheet) lesen und schreiben läuft schon um Lichtjahre schneller. Außerdem versteht es alle Dateiformate (xls, xlsx ...) und kann gleichzeitig mit mehreren Worksbooks und -sheets arbeiten und nicht nur mit dem aktuellen wie die "alte" Version.
    Derzeit läuft die Entwicklung etwas langsam, bin in der Firma 110% eingespannt (ISO 27001). Aber bald gibt es hoffentlich ne erste Beta.

  • Zitat

    Derzeit läuft die Entwicklung etwas langsam, bin in der Firma 110% eingespannt

    Willkommen im Club....

  • Moin,

    dann werde ich als Excel-Noobie mal meinen Senf dazu geben... :D

    Ich habe das Problem vor kurzer Zeit so gelöst:

    Code
    With Me.Cells(Rows.Count, 1).End(xlUp)
    ...


    Die Spalte ( Hier A = 1 ) muss, sofern nötig, noch angepasst werden.
    Evtl. klappt es ja damit...


    Grüße
    Greenhorn