EXCEL: Kopieren von Spalten unterschiedlichen Typs

  • Hallo,

    seit vielen Stunden versuche ich die Excel UDF der Autoit v3.3.12.0 produktiv zu verwenden. Folgende Aufgabe:

    - es sollen eine Reihe von Spalten mit jeweils fester Länge
    - von einem Workbook in ein anderes kopiert werden
    - dabei können die Inhalte der Spalten jeweils Werte, Text, Datumsangaben oder Mischungen derselben enthalten

    Die Grundstruktur des Code ist hier dargestellt:

    - in einer FOR-Schleife werden ca. 10 vordefinierten Zellnamen durchgegangen
    - zunächst werden die Koordinaten der entsprechenden Zellbereiche ermittelt
    - und die Zellen per _Excel_RangeRead() in einer Arrayvariable zwischengespeichert
    - dann erfolgt das Aufspüren der jeweiligen Zielzellen im anderen Workbook
    - und das Hineinschreiben der zwischengespeicherten Arrayvariable per _Excel_RangeWrite()

    Es ergibt sich folgendes Problem: Die Zellen in meinem Quell-Workbook enthalten nicht nur Zahlen ("Values"), sondern auch manchmal mehrzeiligen Text oder Datums-Werte. Wenn ich also bei _Excel_RangeRead() den Parameter "iReturn" mit [1=values] wähle, läuft die Kopiererei so lange durch, bis beim Lesen per _Excel_RangeRead() eben dieser mehrzeilige Zelleninhalt erkannt wird und folgende Fehlermeldung erscheint:

    "Error: The requested action with this object has failed"
    Der Fehler bezieht sich dabei auf Zeile 732 in der "Excel.au3" der oben erwähnten Version. Dort scheint ein Transpose nicht zu funktionieren.

    In einem weiteren Schritt versuchte ich, die reinen Textkomponenten der Zellen auszulesen. In der Hoffnung, dass die Werte auf diese Weise als Text mit berücksichtigt werden. Wenn ich aber _Excel_RangeRead() mit dem Parameter "iReturn" = [3=the displayed text] aufrufe, bleiben ALLE Zellen nach dem Kopieren in das andere Workbook LEER.

    Weiter versuchte ich, zunächst per <range>.NumberFormat = "@" eine Umwandlung der Values (und Texte) in Texte zu bewirken und dann mit "iReturn" = [3] zu kopieren, aber auch dann bleiben die Zielzellen komplett leer.

    Hat jemand eine Idee, wo möglicherweise mein Denkfehler liegt?

    Danke.

  • in solchen Fällen ist dein Code hilfreich ...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • er ist leider bereits sehr lang... daher hier gekürzt und hoffentlich lauffähig...

    EDIT, 16.11.2014: CODE auf wesentliche Inhalte gekürzt

    Einmal editiert, zuletzt von nnako (16. November 2014 um 08:28) aus folgendem Grund: Kürzung des Code auf wesentliche Inhalte

  • Die angesprochne Transpose Methode hat das Problem, dass sie nur mit Zellen funktioniert, die weniger als 255 Zeichen Inhalt haben.
    Da Du aber sowieso nur Spalten kopieren willst, empfehle ich die Funktion _Excel_RangeCopyPaste zu verwenden.

  • Great!

    _Excel_RangeCopyPaste() seems to work just fine.

    Is there a way to include these hints about the special behaviour of _Excel_RangeWrite() and _Excel_RangeRead() somewhere in a documentation?

    Thanks.

  • Ist bereits in der "Remarks" Sektion beinhaltet. Oder fehlt noch was?

  • Nun muss ich aber doch nochmal bzgl. _EXCEL_RangeCopyPaste() nachfragen. Und zwar versuche ich beim Kopieren OHNE das Clipboard auszukommen. Also direkt die SourceRange (als Objekt) in die TargetRange (als Objekt) eines anderen Workbooks einzufügen. Mir scheint es so, als würde es folgendermaßen aussehen:

    -> es ist für die Operation irrelevant, ob der Parameter $oWorkbook das Source- oder das Target-Workbook ist
    -> die beiden Parameter $iPaste und $iOperation sind irrelevant für den direkten Kopiervorgang
    -> es wird immer ALLES (incl. Formeln, bedinten Formatierungen,...) von Source nach Target kopiert

    Ist das wirklich so? Soll das so? Oder habe ich einen Fehler gemacht?

    Eigentlich möchte ich nur die "Values" der Zellen direkt übertragen, nicht die anderen Eigenschaften.

  • $oWorkbook ist kein benötigter Parameter. Du meinst wohl $oWorksheet. Das ist immer das SOURCE sheet.

  • Sorry. Hast recht. Ich meinte $oWorksheet . Der Effekt ist aber der gleiche, wenn man zwei Range-Objekte verwendet und kein Clipboard.

    Man kann dann also das Kopieren nicht weiter spezifizieren?

  • Korrekt. Die verwendete Methode kopiert den kompleten Range so wie er ist. Du musst alos über die Zwischenablage gehen.
    Wenn Du den Inhalt der Zwischenablage nicht "killen" willst, dann sichere ihn vor _Excel_RangeCopyPaste und stelle ihn dann wieder her.

  • Sorry, nochmal.

    > Wenn Du den Inhalt der Zwischenablage nicht "killen" willst, dann sichere ihn vor _Excel_RangeCopyPaste und stelle ihn dann wieder her.

    Gibt es für das Sichern und Wiederherstellen des Clipboards geeignete Funktionen?

  • Aber klar doch: ClipGet und ClipPut