Excel - Spalten löschen mit For-Next-Schleife

  • Hi all,

    bin seit einigen Stunden dran, ein Script zu basteln, mit dem ich bestimmte Spalten in Excel löschen kann (die Zahlen ändern sich nach belieben). Doch jetz komm ich nicht weiter:

    Code bis jetzt:

    so funktionierts:

    Code
    _ExcelColumnDelete($ofile,6,1)
    _ExcelColumnDelete($ofile,5,1)
    _ExcelColumnDelete($ofile,3,1)

    ;so funktionierts nicht (wäre aber schön, wenn!)

    Code
    for $i = 1 to UBound($ary)
    	_ExcelColumnDelete($ofile,$ary[$i],1)
    	;$ofile.ActiveSheet.Columns($ary[$i]).Delete
    Next

    hoffe ihr könnt mir helfen!

    Einmal editiert, zuletzt von x0rr0x (12. Oktober 2011 um 15:20)

  • Morgen, bin mir nicht sicher aber bei

    [autoit]

    _ExcelColumnDelete($ofile,$ary[$i],1) sollte das nicht _ExcelColumnDelete($ofile,$i,1)

    [/autoit]

    geschrieben sein?

    und noch ein kleiner Fehler

    [autoit]

    for $i = 1 to UBound($ary) muss for $i = 1 to UBound($ary) -1

    [/autoit]

    geschrieben werden, ansonsten gibt es Fehler beim auslesen des letzten Eintrages (der nicht vorhanden ist) :P.

    ansonsten würde doch nicht nur eine Zahl sondern auch der Name des Arrays bzw die Variable als Parameter an dei Func Excel... übergeben werden..


    Gruß Marvin

  • Hi Protex,

    danke für die Antwort, aber:

    [autoit]

    _ExcelColumnDelete($ofile,$i,1)

    [/autoit]


    Kann ich so nicht verwenden, da ich ja direkt den Wert des Arrays ansprechen möchte und nicht nur Zahlen aus $i (1 bis 3) (das würde mir Zeile 1 bis 3 löschen und nicht die gewünschten :))

    Und:

    [autoit]

    for $i = 1 to $ary[0]

    [/autoit]


    Hab ich jetzt drin, müsste funktionieren, da bei "StringSplit" immer $ary[0] die Gesamtzahl der Arrays beinhaltet und es quasi erst bei "$ary[1]" startet (bei mir ist das jedenfalls so :))

    Es kommt allerdings immer der Fehler:

    Code
    C:\Program Files (x86)\AutoIt3\Include\excel.au3 (890) : ==> The requested action with this object has failed.:
    $oExcel.ActiveSheet.Columns($iColumn).Delete
    $oExcel.ActiveSheet.Columns($iColumn)^ ERROR
    ->13:21:36 AutoIT3.exe ended.rc:1

    Drum hatte ich es ja sogar mit dem direkten Befehl versucht, aber ebenso kein Erfolg!

    Hier nochmal der komplette Test-Code:

    [autoit]

    #AutoIt3Wrapper_UseX64=no
    #include <excel.au3>

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

    dim $file, $ofile, $str, $ary

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

    $file = "C:\Users\x0r\Desktop\AutoIT_Excel\excel1.xlsx"
    $ofile = _ExcelBookOpen($file)
    $str = "6,5,3"

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

    $ary = StringSplit($str,",")

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

    ;MsgBox(0,"",$ary[1] & "_" & $ary[2] & "_" & $ary[3])

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

    ;funktioniert
    ;~ _ExcelColumnDelete($ofile,6,1)
    ;~ _ExcelColumnDelete($ofile,5,1)
    ;~ _ExcelColumnDelete($ofile,3,1)

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

    ;funktioniert nicht
    for $i = 1 to $ary[0]
    _ExcelColumnDelete($ofile,$ary[$i],1)
    ;$ofile.ActiveSheet.Columns($ary[$i]).Delete
    Next

    [/autoit]

  • // geänderter Bereich ist kommentiert
    // Ich weiß nicht genau wieso er nicht $Ary[$i] nimmt aber es geht sobald du die Zahl in eine andere Variable speicherst.. kp wieso er nicht mit dem Array umgehen kann...
    Gruß Marvin

    2 Mal editiert, zuletzt von Protex (12. Oktober 2011 um 14:07)

  • Hi,

    hast du das überhaupt mal ausprobiert oder ist das nur so eine Vermutung, wie ein Array tatsächlich funktioniert?

    [autoit]

    ;stringsplit - array

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

    dim $ary = "1,2,3,4,5"
    $ary = stringsplit($ary,",")

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

    MsgBox(0,"",$ary[0] & "_" & $ary[1] & "_" & $ary[2] & "_" & $ary[3] & "_" & $ary[4] & "_" & $ary[5])

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

    ;ergebnis = 5_1_2_3_4_5

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

    Fazit:
    $ary[0] = Gesamtzahl der Arrays
    $ary[5] = Letztes Array in dem Fall (obwohl es das laut dir gar nicht geben dürfte!)

    [Blockierte Grafik: http://i52.tinypic.com/11jaoed.png]

  • Es steht sogar in der Hilfe:

    Code
    Function StringSplit
    Returns an array, by default the first element  ($array[0]) contains the number of strings returned, 
    the remaining elements  ($array[1], $array[2], etc.) contain the delimited strings.
    Zitat


    ...da bei "StringSplit" immer $ary[0] die Gesamtzahl der Arrays beinhaltet und es quasi erst bei "$ary[1]" startet...

  • habe meinen Post oben noch einige Male überarbeitet, bei mir geht dieses Script ..

    [autoit]

    #include <Array.au3>
    #include <excel.au3>

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

    dim $file, $ofile, $str, $ary

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

    $file = "C:\excel1.xlsx"
    $ofile = _ExcelBookOpen($file)
    $str = "6,5,3"

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

    $ary = StringSplit($str,",")

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

    For $i = 1 To UBound($ary)-1
    _ExcelColumnDelete($ofile,$ary[0],1)
    Next

    [/autoit]

    Gruß Marvin

  • Mir ist klar das StringSplit schon die Anzahl der Einträge wiedergibt jedoch bin ich es gewöhnt den UBound Befehl zu verwenden und somit verwende ich ihn immer, dann weiß ich auch was ich habe und muss nicht ständig schauen .. gibt die Funk nun dies oder jenes zurück ist mir dann egal was als Rückgabe kommt..

    naja wie auch immer.. bekommst du beim letzten Script was ich gepostet habe einen Fehler?

  • hab jetz bissl rumprobiert, hab eine funktionierende lösung gefunden, allerdings ist diese extrem suboptimal für meine zwecke ;)

    [autoit]

    #AutoIt3Wrapper_UseX64=no
    #include <excel.au3>

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

    dim $file, $ofile, $str, $ary, $cnt

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

    $file = "C:\Users\x0r\Desktop\AutoIT_Excel\excel1.xlsx"
    $ofile = _ExcelBookOpen($file)
    $str = "F,E,C"

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

    $ary = StringSplit($str,",")

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

    For $i = 1 to $ary[0]
    $ary[$i] = Asc($ary[$i]) -64
    _ExcelColumnDelete($ofile,$ary[$i],1)
    Next

    [/autoit]

    warum auch immer, aber so funktionierts... (das blöde ist nur, spalten in excel können auch z.b. AF heissen ;))

  • Ich habe auch die ganze Zeit herrumgespielt aber aus irgend einem Grund nimmt er dieses Array einfach nicht an ich steig da im Moment auch nicht durch :/

    naja wie auch immer geht ja nun mehr oder weniger^^

    Gruß Marvin

  • ja, nach stundenlangem rumprobieren an diesem popeligen Ding :D

    Falls es jemanden interessiert, das Programm sollte ursprünglich die erste Spalte einer Excelliste auslesen und den Inhalt ersetzen von "Nachname Vorname" in "Vorname_Nachname" (funktionierte auf Anhieb!).
    Als nächstes eben individuelle Spalten löschen (hätte ich die Musterliste gehabt, wär das kein Problem gewesen, hätte ich einfach die entsprechenden Zahlen einfügen können).

    Hier der Code (ist nicht perfekt, tut aber seinen Sinn und Zweck, also bitte keine Verbesserungsvorschläge :)):

    [autoit]

    #AutoIt3Wrapper_UseX64=no
    #include <excel.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Excel = GUICreate("Excel Editierer", 533, 100, 189, 110)
    $choose = GUICtrlCreateInput("Öffnen klicken --------------------------------------------------------------------->", 104, 8, 329, 21)
    $Label1 = GUICtrlCreateLabel("Excel auswählen:", 16, 16, 87, 17)
    $delspalte = GUICtrlCreateInput("F,E,C", 104, 48, 249, 21)
    $Label2 = GUICtrlCreateLabel("Spalten löschen:", 16, 56, 83, 17)
    $search = GUICtrlCreateButton("Öffnen", 440, 8, 75, 25, $WS_GROUP)
    $doit = GUICtrlCreateButton("Ausführen", 360, 48, 75, 25, $WS_GROUP)
    GUICtrlSetState($doit,$GUI_DISABLE)
    $exit = GUICtrlCreateButton("Beenden", 440, 48, 75, 25, $WS_GROUP)
    $Label3 = GUICtrlCreateLabel("(Buchstaben von rechts nach links)", 16, 72, 171, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    dim $file, $ofile, $repcell, $str, $ary

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $search
    excelchoose()
    Case $doit
    doit()
    Case $exit
    Exit
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    ;excel auswählen
    func excelchoose()
    $file = FileOpenDialog("Excel auswählen",@ScriptDir,"Excel Dateien (*.xls*)", 1 + 4)
    GUICtrlSetData($choose,$file)
    if StringLen($file) > 1 then GUICtrlSetState($doit,$GUI_ENABLE)
    EndFunc

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

    func doit()
    $ofile = _ExcelBookOpen($file)

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

    ;excel spalte bearbeiten
    for $i = 1 to 1000
    $repcell = _ExcelReadCell($ofile,$i+1,1)
    $repcell = StringRegExpReplace($repcell,@crlf,'')
    $repcell = StringSplit($repcell," ")

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

    if $repcell[0] <> 2 then ExitLoop
    _ExcelWriteCell($ofile,$repcell[2] & "_" & $repcell[1],$i+1,1)
    Next

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

    ;excel spalten löschen
    $str = GUICtrlRead($delspalte)
    $ary = StringSplit($str,",")

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

    For $i = 1 to $ary[0]
    $ary[$i] = Asc($ary[$i]) - 64
    _ExcelColumnDelete($ofile,$ary[$i],1)
    Next

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

    ;excel speichern und schließen
    _ExcelBookSave($ofile)
    _ExcelBookClose($ofile)
    EndFunc

    [/autoit]
  • wenn dies funktioniert:

    [autoit]

    #AutoIt3Wrapper_UseX64=no
    #include <excel.au3>

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

    dim $file, $ofile, $str, $ary, $cnt

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

    $file = "C:\Users\x0r\Desktop\AutoIT_Excel\excel1.xlsx"
    $ofile = _ExcelBookOpen($file)
    $str = "F,E,C"

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

    $ary = StringSplit($str,",")

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

    For $i = 1 to $ary[0]
    $ary[$i] = Asc($ary[$i]) -64
    _ExcelColumnDelete($ofile,$ary[$i],1)
    Next

    [/autoit]

    sollte auch das funktionieren:

    [autoit]

    #AutoIt3Wrapper_UseX64=no
    #include <excel.au3>

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

    dim $file, $ofile, $str, $ary, $cnt

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

    $file = "C:\Users\x0r\Desktop\AutoIT_Excel\excel1.xlsx"
    $ofile = _ExcelBookOpen($file)
    $str = "6,5,4"

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

    $ary = StringSplit($str,",")

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

    For $i = 1 to $ary[0]
    _ExcelColumnDelete($ofile,Int($ary[$i]),1)
    Next

    [/autoit]

    das Problem scheint daran zu liegen dass der Datentyp als String und nicht als INTeger erkannt wird, habe aber kein Excel installiert kann es nicht testen,

    mfg autoBert