Zeilen innerhalb von 2 csv-Dateien verschieben.

  • Hallo Zusammen,

    Mein Vorhaben:
    Ich möchte bestimmte Zeilen von einer .csv Datei in eine andere verschieben.
    Es gibt 2 Dateien mit den Namen "ergebnis.csv" und "rohdaten.csv". Die Zeilen 8 bis 16 in "rohdaten.csv" möchte ich in die "ergebnis.csv" ab Spalte B verschieben, Da Spalte A Daten enthält.
    Meine Vorgehensweise:
    Ich lasse von Autoit "rohdaten.csv" auslesen und in "ergebnis.csv" eintragen. Jedoch scheitere ich daran, dass die Daten nicht übertragen werden. Vielleicht habe ich noch nicht verstanden, wie man Arrays handhaben müsste.

    Wie muss ich vorgehen, um die Zeilen 8 bis 16 in "rohdaten.csv" nach "ergebnis.csv" ab Spalte B, Zeile 1 und jeweils drunter zu verschieben?

    Ich wäre für eure Hilfe sehr dankbar.
    Folgend mein Versuch:

    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.10.2
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ; ergebnisse zum kopieren bereitstellen
    #include <Excel.au3>
    #include <MsgBoxConstants.au3>

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

    Local $sFilePath1 = @ScriptDir & "\rohdaten.csv" ;This file should already exist
    Local $oExcel = _ExcelBookOpen($sFilePath1)
    Local $aArray = $oExcel

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

    If @error = 1 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "File does not exist - Shame on you!")
    Exit
    EndIf
    _ExcelSheetActivate($oExcel, "rohdaten") ; Richtigen Reiter aktivieren

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

    ;Von Ergebnisse Daten von Excel auslesen Beginnen bei Zeile 8, Spalte A, Zelle 1
    _ExcelReadArray ( $oExcel, 8, 1, 1 )

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

    For $i = 8 To 16 ; Schleife um von Zeile 8 bis 18 auszulesen
    _ExcelReadArray($oExcel, $i, $i, 1)
    Next

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

    ;Daten jetzt übertragen
    Local $sFilePath1 = @ScriptDir & "\ergebnis.csv" ;This file should already exist
    Local $oExcel = _ExcelBookOpen($sFilePath1)

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

    If @error = 1 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "File does not exist - Shame on you!")
    Exit
    EndIf
    _ExcelSheetActivate($oExcel, "ergebnis") ; Richtigen Reiter aktivieren
    _ExcelWriteArray( $oExcel, 1, 2, $aArray) ; Ergebnisse neben Zelle B1 usw. eintragen

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

    Einmal editiert, zuletzt von dirkrid (17. Mai 2014 um 18:08) aus folgendem Grund: Vielen Dank

  • Ich empfehle die neueste Beta version von AutoIt zu verwenden.
    Dort wurde die Excel UDF komplett neu geschrieben (= inkompatibel mit der bestehenden UDF).
    Beispiel 2 der Funktion _Excel_RangeCopyPaste zeigt sehr gut, wie man Inhalte zwischen WorkBooks kopiert. Wenn das erfolgreich war, dann kannst Du den Source Range löschen.

  • Hey,

    hier die Lösung:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.10.2
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ; ergebnisse zum kopieren bereitstellen
    #include <Excel.au3>
    #include <MsgBoxConstants.au3>

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

    Local $sFilePath1 = @ScriptDir & "\rohdaten.xlsx" ;This file should already exist
    Local $oExcel = _ExcelBookOpen($sFilePath1)

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

    If @error = 1 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "File does not exist - Shame on you!")
    Exit
    EndIf

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

    _ExcelSheetActivate($oExcel, "rohdaten") ; Richtigen Reiter aktivieren

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

    ;Von Ergebnisse Daten von Excel auslesen Beginnen bei Zeile 8, Spalte A, Zelle 1

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

    Global $aArray = _ExcelReadArray($oExcel, 8, 1, 9, 1)

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

    ;Daten jetzt übertragen
    Local $sFilePath2 = @ScriptDir & "\ergebnis.xlsx" ;This file should already exist
    Local $oExcel = _ExcelBookOpen($sFilePath2)

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

    If @error = 1 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "Unable to Create the Excel Object")
    Exit
    ElseIf @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error!", "File does not exist - Shame on you!")
    Exit
    EndIf

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

    _ExcelSheetActivate($oExcel, "ergebnis") ; Richtigen Reiter aktivieren
    _ExcelWriteArray( $oExcel, 1, 2, $aArray, 1) ; Ergebnisse neben Zelle B1 usw. eintragen

    [/autoit]


    Du hast die Daten Falsch eingelesen. Nämlich musst du nicht mit einer Forschleife jede Zeile durchgehen, weil das übernimmt schon die Funktion --> _ExcelReadArray :)
    schau dir einfach mal die Beispiele und die Funktion genauer an: _ExcelReadArray & _ExcelWriteArray

    ===========================================
    Friedrich Schiller - Einfachheit ist das Resultat der Reife.

  • Vielen Dank für eure Hilfe.
    Ich benutze jetzt die Beta-Version. Mit folgendem Code werden die Daten richtig übertragen:

    Spoiler anzeigen
    [autoit]


    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.11.5 (Beta)
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

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

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

    ; Create application object and open an example workbook
    Local $oAppl = _Excel_Open()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

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

    ; Open Workbook 2
    Local $oWorkbook2 = _Excel_BookOpen($oAppl, @ScriptDir & "\rohdaten.csv")
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example", "Error opening workbook '" & @ScriptDir & "\rohdaten.csv'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oAppl)
    Exit
    EndIf

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

    ; Open Workbook 1
    Local $oWorkbook1 = _Excel_BookOpen($oAppl, @ScriptDir & "\ergebnis.csv")
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example", "Error opening workbook '" & @ScriptDir & "\ergebnis.csv'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    _Excel_Close($oAppl)
    Exit
    EndIf

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

    ; *****************************************************************************
    ; Copy cells from another workbook. Pass the source range as object.
    ; *****************************************************************************
    Local $cRange = $oWorkbook2.ActiveSheet.Range("A1:L8")
    _Excel_RangeCopyPaste($oWorkbook1.Worksheets(1), $cRange, "B1")
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example 1", "Error copying cells." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    ; *****************************************************************************
    ; Delete a range on the active worksheet
    ; and shift the cells up.
    ; *****************************************************************************
    _Excel_RangeDelete($oWorkbook2.ActiveSheet, $cRange, $xlShiftUp)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeDelete Example 1", "Error deleting cells." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

    [/autoit]

    Mir ist im nachhinein aufgefallen, dass ich die Daten, die bereits richtig übertragen werden, gelöscht werden, wenn ich diesen Skript erneut ausführe.
    Ich möchte nun in der Datei "ergebnis.csv" in Spalte B nach der nächst leeren Zelle suchen und dort die zu verschiebende Zellen von "rohdaten.csv" hineinkopieren, bevor sie gelöscht werden.
    Autoit bietet hierzu die Funktion _Excel_Rangefind
    Mit der Hilfe kam ich leider nicht zurecht. Wie gebe ich an, dass die leere Zellen gesucht werden sollen?
    Mein Versuch scheiterte leider:

    [autoit]

    Local $aResult = _Excel_RangeFind($oWorkbook1, "", "B", $xlFormulas, $xlWhole)

    [/autoit]
  • Meinst Du, dass Du am Ende des benutzten Bereiches anhängen möchtest (Beispiel: Letzte Zeile mit Inhallt = 51, daher nach Zeile 52 schreiben) oder die erste Leerzeile (hier kann es sein, dass danach noch weitere Zeilen mit Daten folgen).

  • $oWorksheet.Usedrange.Rows.Count gibt Dir die Nummer der letzten benutrzen Zeile.

  • Ich finde leider kein hilfreiches Beispiel. Wie wende ich die Funktion $oWorksheet.Usedrange.Rows.Count an?
    So bin ich vorgegangen:
    Ich deklariere eine lokale Variable $iLastRow. Diese hat die Funktion UsedRange.Rows.Count.
    Dann frage ich mit einer Schleife ab, ob $iLastRow leer ( "" ) ist, wenn ja, dann soll _Excel_RangeCopyPaste angewendet werden.

    [autoit]

    ; *****************************************************************************
    ; Copy cells from another workbook. Pass the source range as object.
    ; *****************************************************************************
    Local $cRange = $oWorkbook2.ActiveSheet.Range("A1:L8")
    Local $iLastRow = $oExcel.Activesheet.UsedRange.Rows.Count
    If $iLastRow.Value = "" Then
    _Excel_RangeCopyPaste($oWorkbook1.Worksheets(1), $iLastRow)
    EndIf
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeCopy Example 1", "Error copying cells." & @CRLF & "@error = " & @error & ", @extended = " & @extended)

    [/autoit]
  • Das funktioniert bei mir:

    [autoit]

    #include <Excel.au3>
    #include <Debug.au3>
    _DebugSetup()
    _DebugCOMError()
    $oExcel = _Excel_Open()
    ConsoleWrite(@error & @LF)

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

    $oRohdaten = _Excel_BookOpen($oExcel, @ScriptDir & "\Rohdaten.csv")
    ConsoleWrite(@error & @LF)

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

    $oErgebnis = _Excel_BookOpen($oExcel, @ScriptDir & "\Ergebnis.csv")
    ConsoleWrite(@error & @LF)

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

    $iTargetRow = $oErgebnis.ActiveSheet.Usedrange.Rows.Count + 1
    ConsoleWrite($iTargetRow & " " & @error & @LF)
    $oTargetRange = $oErgebnis.ActiveSheet.Range("B" & $iTargetRow)
    ConsoleWrite(@error & @LF)

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

    _Excel_RangeCopyPaste($oRohdaten.Activesheet, "A8:B16", $oTargetRange)
    ConsoleWrite(@error & " " & @error & @LF)

    [/autoit]

    Das Beispiel geht davon aus, dass Du weisst, wieviele Spalten der zu kopierende Bereich hat. Falls dem nicht so ist, dann müsste noch etwas Code eingefügt werden.