Problem mit Excel in anders Programm Daten kopieren

  • Ich muss von Excel in ein anders Programm Daten kopieren. Das Programm klappt so weit gut, nur kopiert ClipGet() nichts in die Variable $text ... und ich habe keine Ahung wieso!

    Ich benutzte ClipGet() weil das per Strg+C kopierte von Excel leere Zeilen enthalten kann und diese (komischer/glücklicher weise) mit ClipGet() verschwinden!

    [autoit]

    ;...
    Send("^c") ; Inhalt in Zw.-Abl. kopieren
    sleep($sleep)
    Send("!{F4}") ; Excel schließen
    sleep($sleep)
    Send("{SPACE}") ; Inhalt aus Zw.-Abl. soll gespeichert werden
    sleep($sleep)

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

    ; Kopieren
    $text = ''
    $text = ClipGet() ; Inhalt aus Zw.-Abl. in String
    sleep($sleep)
    If @error then
    MsgBox(0, $titel, "Fehler:"&@CRLF&@error)
    exit
    endif
    MsgBox(0, $titel, $text)
    ;$text = StringReplace($text, " ", "-") ; ...
    ClipPut($text) ; löscht (komischer weiße) die leeren Zeilen
    sleep($sleep)
    If @error then
    MsgBox(0, $titel, "Fehler:"&@CRLF&@error)
    exit
    endif
    If $text = "" then
    MsgBox(0, $titel, "Fehler:"&@CRLF&"Kein Text!")
    exit
    endif
    ;...

    [/autoit]

    Hier mal das komplette Skript:

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    ;#include <Array.au3>
    ;#include <GUIConstants.au3>

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

    $sleep = 1000
    $sleep_test = 0

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

    $dheight = @DesktopHeight ; Bildschirmhöhe
    $dwidth = @DesktopWidth ; Bildschirmbreite
    $mmove = 0 ; Mausgeschwindigkeit
    $titel = "EasyFit-1-import"
    $pfad = @ScriptDir

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

    ; ### Benutzer Eingaben
    MsgBox(0, $titel, "MS Excel muss geschlossen sein!"&@CRLF&"EasyFit muss offen sein!"&@CRLF&"In der geöffnetten Datei werden dann die Daten aus Excel importiert!")
    $pfad = FileSelectFolder("Ordner wählen, in dem die Excel-Dateien liegen:", "", 5, $pfad)
    $dateien = _FileListToArray($pfad, "*.xls", 1) ; Pfad untersuchen
    If @Error=4 Then
    MsgBox (0,"","Keine Dateien gefunden.")
    Exit
    EndIf
    ;_ArrayDisplay($dateien, "$FileList")

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

    $zeit = Inputbox($titel, "Wieviele Sekunden braucht Excel max. zum starten?", "10")
    $msg = MsgBox(1, $titel, "Ab jetzt werden alle Benutzereingaben blockiert!", 10)
    if $msg <> 1 then
    Exit
    endif
    if @Compiled then
    BlockInput(1)
    endif

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

    ; ### Befehle ausführen
    for $n=1 to $dateien[0]
    ; Excel-Datei öffnen
    ShellExecute('excel', '/e "'&$pfad&'\'&$dateien[$n]&'"')
    sleep($zeit*1000)

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

    ;WinActivate ("Microsoft Excel")
    sleep($sleep_test)
    ControlClick("Microsoft Excel", "", "[CLASS:EXCEL7; INSTANCE:2]") ; Hauptfenster auswählen
    sleep($sleep_test)
    Send("{CTRLDOWN}") ; Strg drücken
    sleep($sleep)
    for $i=1 to 4 ; sicher in ganz linken Blatt sein
    Send("{PGUP}")
    sleep($sleep_test)
    next
    Send("{PGDN}") ; 2tes Blatt
    sleep($sleep)
    Send("{HOME}") ; Oben-Links auswählen
    sleep($sleep_test)
    Send("{CTRLUP}") ; Strg loslassen
    sleep($sleep)
    for $i=1 to 3 ; zum Titel
    Send("{DOWN}")
    sleep($sleep_test)
    next
    for $i=1 to 22 ; zu 'height Z'
    Send("{RIGHT}")
    sleep($sleep_test)
    next
    Send("{CTRLDOWN}") ; Strg drücken
    sleep($sleep_test)
    Send("{SHIFTDOWN}") ; Umsch. drücken
    sleep($sleep_test)
    Send("{DOWN}") ; nach ganz unten
    sleep($sleep_test)
    Send("{RIGHT}") ; nach ganz rechts
    sleep($sleep_test)
    Send("{SHIFTUP}") ; Umsch. loslassen
    sleep($sleep_test)
    Send("{CTRLUP}") ; Strg loslassen
    sleep($sleep)
    Send("^c") ; Inhalt in Zw.-Abl. kopieren
    sleep($sleep)
    Send("!{F4}") ; Excel schließen
    sleep($sleep)
    Send("{SPACE}") ; Inhalt aus Zw.-Abl. soll gespeichert werden
    sleep($sleep)

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

    ; Kopieren
    $text = ''
    $text = ClipGet() ; Inhalt aus Zw.-Abl. in String
    sleep($sleep)
    If @error then
    MsgBox(0, $titel, "Fehler:"&@CRLF&@error)
    exit
    endif
    MsgBox(0, $titel, $text)
    ;$text = StringReplace($text, " ", "-") ; ...
    ClipPut($text) ; löscht (komischer weiße) die leeren Zeilen
    sleep($sleep)
    If @error then
    MsgBox(0, $titel, "Fehler:"&@CRLF&@error)
    exit
    endif
    If $text = "" then
    MsgBox(0, $titel, "Fehler:"&@CRLF&"Kein Text!")
    exit
    endif
    ;MsgBox(0, $titel, $text)

    ; EasyFit
    WinActivate ("EasyFit")
    sleep($sleep)
    Send("^t") ; neue Tabelle
    sleep($sleep)
    Send("^v") ; Inhalt aus Zw.-Abl. kopieren
    sleep($sleep)

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

    ; Umbennen der Tabelle
    ControlClick("EasyFit", "", "[CLASS:TRzTreeView; INSTANCE:1]") ; TrewView auswählen
    Send("{APPSKEY}") ; Rechte Maustaste
    sleep($sleep)
    Send("{DOWN}") ; Nachunten
    Send("{DOWN}") ; Nachunten
    sleep($sleep)
    Send("{ENTER}") ; Auswählen
    sleep($sleep)
    $dateinamen = StringSplit($dateien[$n], ".")
    ControlSend("Umbenennen", "", "[CLASS:TEdit; INSTANCE:1]", $dateinamen[1]) ; Dateinamen
    sleep($sleep)
    ControlClick("Umbenennen", "", "[CLASS:TRzButton; INSTANCE:2]") ; OK
    sleep($sleep)
    next

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

    ; ### Abschluss
    BlockInput(0)
    MouseMove($dwidth/2, $dheight/2)
    MsgBox(0, $titel, "Ende!")

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

    ;Ende

    [/autoit]

    Wieso kommt von ClipGet() nichts in $text an?

  • Ich würde dir hier ganz klar die _Excel-Udf empfehlen.
    Sieh dir doch mal in der Hilfe die _Excel-Funktionen und die dazugehörigen Beispiele an.
    Das ist viel sicherer als mit send, clipget usw zu arbeiten

  • Könnte ich ... ich sehe aber keinen Sinn darin!
    Ich muss ja nur eine beliebige Zahl an Zeilen kopieren, mehr muss ich mit Excel nicht machen!
    Wenn ich 200 Daten übertragen habe kann ich Heim gehen ... wenn ich mich jetzt mit der excel.au3 beschäftige braucht das sicher länger ... das kann ich am WE machen ...
    Es geht ja nur das kopieren nicht ... was ich (nehm ich mal sehr stark an) sowieso nicht mit der excel.au3 machen kann!
    Also würde das mir sehr wahrscheinlich nicht mal zu meinen Problem beitragen ...

  • Ich habs jetz nur überflogen aber wunderst du dich wirklich wieso nichts im Clip steht?

    [autoit]

    Send("{SPACE}") ; Inhalt aus Zw.-Abl. nicht speichern

    [/autoit]

    PS:

    [autoit]

    _ExcelReadSheetToArray

    [/autoit]


    Und schon hättest du die komplette Tabelle in einem Array.

  • Bei mir läuft das Script.
    Mit deinen angaben kann man nicht herrausfinden wo der Fehler liegt!

    Zitat

    Wieso sollte ich die Zellen in ein Array kopieren?


    Weil es so zu 99% leichter ist die Daten zu verarbeiten.
    Außerdem ist es 100 mal sicherer. Mit Strg+C zu arbeiten is sehr fehleranfällig.

    Gib doch einfach mal genauere Details was du wohinkopierst.
    Am besten stellste die Excel (oder ne ähnliche Beispieldatei) zur Verfügung und erklärst mal was für ein "Geheim"-programm das ist wohin du es kopierst.
    Wie soll man dir helfen wenn man sogut wie nichts weiß. Es gibt n paar Tausend Möglichkeiten wieso das nicht funktioniert...

  • Bei mir läuft das Script.
    Mit deinen angaben kann man nicht herrausfinden wo der Fehler liegt!


    Ich glaube du siehst das Problem viel zu komplex!
    Es funktioniert nur die Zeilen zwischen dem Kopieren (Strg+C klicken) und dem GetClip() nicht!
    Sonst funktioniert alles einwandfrei und muss auch in keinster weise optimiert werden!


    Weil es so zu 99% leichter ist die Daten zu verarbeiten.


    Ok, dann schreib mir bitte eine Funktion, mit der ich aus dem Array wieder ein String bekomme, in der die einzelnen Variablen des Arrays per Tab bzw. Zeilenumbruch getrennt sind und alle Zeilen, die komplett leer seid, löscht!
    Ich habe dazu schlicht weg keine Lust ...

    Gib doch einfach mal genauere Details was du wohinkopierst.
    Am besten stellste die Excel (oder ne ähnliche Beispieldatei) zur Verfügung und erklärst mal was für ein "Geheim"-programm das ist wohin du es kopierst.
    Wie soll man dir helfen wenn man sogut wie nichts weiß. Es gibt n paar Tausend Möglichkeiten wieso das nicht funktioniert...


    Das ist kein 'Geheimprogramm'! In meinen Skript steht "WinActivate ("EasyFit")" und so heißt auch das Programm ... ist zum ersten von Verteilungsparametern aus Messreihen ... wenn du danach suchst, kannst du sogar ne Demo herunterladen.
    Hier der Link zu einer Excel Datei, aus der ich Passagen in EasyFit importieren muss!
    Ich muss aus jeder solchen Excel-Datei einfach aus dem 2ten Datenblatt ab dem Titel "height Z" bis zur letzten Zahl rechts unten alles in eine EasyFit-Tabelle kopieren um dort damit weiter zu arbeiten.

    Aber wie gesagt, es gibt eig. nur ein Problem mit dem kopieren des Zwischenablagen Inhalts in eine Variable!

  • Jaja, erst eine noch genauerer Problembeschreibung wollen, dann bekommst du diese und schon lässt du nicht mehr von dir hören ;)

    Btw. mit der excel.au3 habe ich es auch schon getestet ... geht aber nicht!
    1.) Alleine das einlesen der Zellen in das AutoIt-Array braucht schon ewig .. eine Tabelle mit 500 Zeilen braucht schon geschlagene 5min! Mit Hand oder meinem Copy&Paste Befehl brauche ich dafür 10sec!
    2.) Und dann ließt die leeren Zellen auch mit ein, d.h. ich muss alle leeren Zellen aussortieren, das braucht noch mal 2min zum auswerten ...
    3.) Dann muss ich noch das Array in ein Semikolon getrennten String umwandeln, dass ich das in mein Programm einfügen kann ... noch mal 1min ....
    Ne, das mit dem Array lass ich sein ...


    Neue Frage:
    Wie kann ich ganz einfach bestimmen, wie viele Zeilen und Spalten ein Tabellenblatt hat, also wie viele ausgefüllt sind?