none
Excel Range kopieren in Recordset RRS feed

  • Frage

  • Hallo Experten!

    Um ein Range aus einem Excelblatt per VBA nach Access zu kopieren, gibt es wohl nicht sehr viele Möglichkeiten(?). Die Methode, die ich im Moment anstrebe, ist über ein ADO-Recordset. Im Netz finde ich immer nur copyFromRecordset, ich brauche aber die umgekehrte Richtung.

    Da ich nichts gefunden habe, mache ich es im Moment über eine Schleife, die jede Zelle einzeln aus dem Range holt und in das passende Feld des Recordset schreibt, also etwa so:

    dim ARS as new ADO-Recordset
    ARS.open Access-Tabelle
    for zeile= erste to letzte    'des Excel-Range
    ARS.addnew
       for spalte= erste to letzte
           ARS.fields(..)= zelleninhalt
       next spalte
    ARS.update
    next zeile

    Das funktioniert natürlich prima, ist aber für größere Datenmengen tödlich langsam. Ich habe gehört, dass es eine Methode geben soll, die ein einteiliges rechteckiges Range aus Excel "mit einem Schlag" transferiert. (?)

    Ich habe es übrigens auch mit der Windows-Zwischenablage versucht, etwa so:

    exlRange.Copy
    DoCmd.OpenTable "...."
    DoCmd.GoToRecord , , acLast
    DoCmd.RunCommand acCmdPasteAppend

    Hier kommt immer die Meldung "Die Daten in der Zwischenablage sind beschädigt. Microsoft Access kann den Einfügevorgang daher nicht ausführen."

    Danke für Tipps!

    Raimund Gryszik, Berlin



    • Bearbeitet IT-Designer Montag, 1. September 2014 10:47
    Montag, 1. September 2014 08:57

Alle Antworten

  • Ich habe gehört, dass es eine Methode geben soll, die ein einteiliges rechteckiges Range aus Excel "mit einem Schlag" transferiert. (?)

    Du kannst ein Excel.Range in ein Array einlesen, von daher bist Du an der Stelle schon mal Faktor 200 schneller.

    dim R as Range
    dim A as Variant
    set R = Range("A1:Z2000")
    A = R.Value

    A ist nun ein 2 dimensionales Array.

    Aber mir ist nichts bekannt wie Du das in einem Rutsch in Dein Record-Set bekommst, ein RecordSet.SetRows gibt es ja leider nicht:

    http://msdn.microsoft.com/de-de/library/office/dn125237%28v=office.15%29.aspx

    Aber ich bin auch kein Experte in Sachen RecordSets, ich brauch das nur alle paar Jubeljahre mal.

    Andreas.

    Mittwoch, 3. September 2014 15:07
  • Hi,

    also das scheint wirklich nur Zeilenweise Row für Row zu funktionieren. Es gibt aber möglicherweise ein paar Dinge das zu trotzdem beschleunigen.

    Hier ein Beitrag dazu. Bitte bis zu Ende ansehen, da sind am Anfang noch Fehler enthalten im Code.

    http://www.mrexcel.com/forum/microsoft-access/583521-fastest-way-copy-excel-range-access.html

    Zum einen wird dort DAO und nicht ADO verwendet... das ist zwar steinalt und hat Nachteile aber es ist bei solchen Dingen schneller als ADO.

    Weiterhin dürften die Anweisungen hier unten auch dazu beitragen das ganze zu beschleunigen. Schau dir das einfach mal an und teste es.

    Application.ScreenUpdating = False

    Application.EnableEvents = False

    Muss natürlich am Ende wieder auf True gesetzt werden.

    PS.

    die Microsoft DAO 3.6 Object Library müsste natürlich erst eingebunden werden (unter Verweise) und ob dies geht hängt wohl von dem System und der Office Version ab. Unter 32 bit soll das angeblich auch mit neueren Office Versionen funktionieren, unter 64 bit geht es offensichtlich nicht mehr.

    Gruß

    Jens


    • Bearbeitet Jens Gerber Mittwoch, 3. September 2014 16:00
    Mittwoch, 3. September 2014 15:44
  • Danke an alle!

    Ich werde testen (das dauert ...)

    @Jens: ich habe gehört, dass mit neueren Windows- oder Office-Versionen DAO ein Comeback bei MS erlebt hat. Die nutzen es jetzt wohl verstärkt wieder selbst, so dass es an manchen Stellen irgendwie implizit vorhanden ist (wo es früher explizit eingebunden werden musste). Genaueres weiß ich nicht, schade, ich hatte mich so mit ADO angefreundet.

    Application screenupdating brauche ich hier gar nicht, da die Excel-Instanz sowieso nicht visible ist.

    Raimund

    Donnerstag, 4. September 2014 13:35