VBA Datei mittels C++ Code lesen



  • Hallo zusammen,

    wir haben mehrer Dateien welche mittels VBA Code (per Macro unter Excel) gespeichert sind. Der VBA Code zum lesen lautet zusammengefasst :

    Type Mytyp
            Bezeichnung As Variant
            kategorie As Variant
            material As Variant
            Mat_Maße As Variant
            Verschnitt As Variant
            Meng_einh As Variant
            DM_ME As Variant
            kg_me As Variant
            DM_KG As Variant
    End Type
    
    Dim Dummy As Mytyp
    Open BvhAdresse For Random As 1 Len = Len(Dummy) + 150
    Get #1, 1, Dummy
    ...
    

    hat jermand ne Idee wie man man solche dateien am besten mit BCB Mitteln (XE4) ausliest bzw. wie man am dümmsten rangeht? Danke



  • Keiner ne Idee? Wenn man ein aquivalenten Datentyp in C++ erstellen könnte wäre man ja schon weiter. Hab folgendes probiert :

    struct sMytyp
    {
    	Variant Bezeichnung;
    	Variant kategorie;
    	Variant material;
    	Variant Mat_Maße;
    	Variant Verschnitt;
    	Variant Meng_einh;
    	Variant DM_ME;
    	Variant kg_me;
    	Variant DM_KG;
    };
    

    Und dann eine Funktion mit folgenden Code:

    sMytyp dummy;
    int i;
    ifstream f("c:\\test1.dat",ios::binary);
    vector <sMytyp> Daten;
    while (f.read((char*)&dummy,(sizeof(dummy)+150)))
    {
    sMytyp Var;
    Var=dummy;
    Bauvortypen.push_back(Var);
    }
    if (!f.eof())
    this->ShowError("XOpSa","OpenKB2File","Fehler bei read");
    f.close();
    

    Hat schonmal nit funktioniert. Irgend jemand Ideen zur Hernangehensweise an solche Probleme?



  • BCB Mitteln (XE4)

    Das heißt mit ganz normalem C++, oder gibts da Besonderheiten die zu beachten sind ? 😕

    Ich kenn ich mich VBA nicht gut aus, aber Variant ist sowas wie "object" in anderen Programmiersprachen. D.h. da kann alles mögliche drinnen stehen, ohne mehr Infos kann dir aber keiner sagen was.

    Wo kommt eigentlich die "150" her ?

    Am besten wäre das ganze Script und ne excel-testdatei um das ganze am selber anschauen zu können. sonst kann ich dir da auch nicht helfen.



  • Hi DarkShadow44,

    es gibt da keine weitere Besonderheiten.
    Ich kann dir auch weder die Excel-Datei noch dass BCB - Projekt schicken da ich glaub dann richtig Probleme bekommen würde.

    Wo die 150 herkommen kann ich dir nicht ssagen (hab das Script nicht geschrieben) soll nur ein BCB - Programm schreiben welches die olle Excel Tabelle ersetzt.
    Zu den 150 folgende These:
    Der Datentyp Variant kann wie du ja sagst alles speichern. D.h. der Speicherplatz ist dynamisch. Ich denke dass bei Erstellung der Datentyp leer ist und mit "Len(dummy)" einfach nicht genug Speicherplatz reerviert wird.

    Im weiteren Programmverlauf des VBA Scripts wird dann einfach der Zellinhalt einer Tabelle geschrieben oder gelesen also z.B.

    Sheets("kalkulation").Cells(4, 8) = Dummy.DM_KG
    

    Interessant finde ich, dass object dass passende Pendant zu Variant ist. Hatte da auf den Datentyp Variant getippt wie du siehst. Werds mal ausprobieren. Danke



  • Interessant finde ich, dass object dass passende Pendant zu Variant ist. Hatte da auf den Datentyp Variant getippt wie du siehst

    Hm das war jetzt eigentlich nur meine erste Überlegung. Ich weiß auch nicht wie VBA Variant implementiert. Aber ich gehe davon aus dass es einfach ein Typ ist der alles mögliche enthalten kann. Bei ner Variant-struct bin ich mir nicht sicher ob man das einfach serialisieren kann, aber ich würde eher davon ausgehen dass nicht.
    Darum würde ich ja gerne mal ne Beispieltabelle sehen, nur damit feststeht welche Typen denn in der Textdatei stehen. Kannst du nicht eine eigene Tabelle mit 3 Einträgen machen und daraus eine .dat generien und diese irgendwo hochladen ?
    Sonst kann ich da echt nichts mehr dazu sagen.

    Ich denke dass bei Erstellung der Datentyp leer ist und mit "Len(dummy)" einfach nicht genug Speicherplatz reerviert wird

    Wäre schon leicht seltsam, dann könnte man das "Len" doch gleich weglassen...



  • Hallo,
    warum löst Du es nicht mittels OLE Automation. Damit kannst Du die Excel Datei öffnen und ändern. Mit den Schlagworte "C++ Builder Ole Automation Excel" sollten genügend Beispiele zu finden sein.

    Gruß



  • warum löst Du es nicht mittels OLE Automation.

    Das wäre eine Notlösung. Aber dann müsste stets Excel 2003 auf den Rechnern bleiben, da dafür das VBA Script geschrieben ist und keiner mehr Bock hat in die VBA-Technik noch großartig Zeit zu investieren um die dat Datei z.B. mittels Excel 2007 öffnen zu können. Trotzdem danke



  • Hallo,
    wie es aussieht reden wird aneinander vorbei. Beschreib doch mal in Stichpunkten was Du genau vor hast bzw. umsetzten musst. Mit der Ole Automation kannst Du auch Excel 2007 öffnen und bearbeiten unabhängig von VBA Makro, vorausgesetzt dass Office installiert ist. Ich bin davon ausgegangen, dass Office auf den Rechneren installiert ist und die Excel Dateien für die weitere Verarbeitung angepasst werden soll. Du öffnest die Datei, passt die Werte mittel c++ Code an, schreibst die Werte zurück und fertig.
    Wenn die Lösung Geld kosten darf und Du Excel-Dateien ohne Office Installation erstellen möchtest, dann schau Dir mal folgendes an: http://www.tmssoftware.com/site/flexcel.asp

    Gruß



  • Hallo,

    Beschreib doch mal in Stichpunkten was Du genau vor hast bzw. umsetzten musst

    - gegeben sei eine über zehn Jahre alte Arbeitsmappe (Excel 2003)
    - in dieser Arbeitsmappe sind zahlreiche VBA-Macros sowie Datenbankanwendungen
    mit eingebaut
    - damit man nicht jedesmal eine Kopie der Arbeitsmappe anlegen muss, kann die
    Arbeitsmappe die Eingabewerte in einer *.dat Datei speichern und öffnen
    - da im Laufe der Zeit noch Anforderungen hinzugekommen sind hat man sich
    entschlossen, das Ganze mit einer ordentlichen Entwicklungsumgebung
    umzusetzten (BCB)
    - Da man in dieser neuen Version ja auch die Dateien lesen will welche mittels
    VBA Code von der alten Excelarbeitsmappe angelegt worden sind haben wir das
    Dilemma, dass wir mittels C++ Code Dateien öffnen müssen welche mittels VBA
    angelegt worden sind
    - Die Lösung mit dem OLE-Automation hätte zur Folge, dass Excel 2003 auf dem
    ausführenden Rechner installiert sein muss. Bei anderen Excel-Versionen
    funktioniert der VBA - code nit. Daher nur eine Notlösung



  • Probier´s doch mal per Reverse Engineering. Der Datentyp VARIANT wird von Microsoft definiert, exportier´ doch einfach mal ein VARIANT Objekt und guck´ dir im Hex Editor an, wie der auf der Festplatte aussieht. Das probierst du dann für alle gängigen Datentypen (Ganzzahl, Fließkommazahl, Text, etc.).



  • Das Format ist doch mehr oder weniger dokumentiert, wieso Reverse-Engineering?
    http://msdn.microsoft.com/en-us/library/aa266212(v=vs.60).aspx

    Die Frage ist, ob man sich so einen Klotz ans Bein binden will. Ich würde eher das VBA-Script so ändern, dass es nicht in einem proprietären MS-Format abspeichert.



  • Bashar schrieb:

    Das Format ist doch mehr oder weniger dokumentiert, wieso Reverse-Engineering?
    http://msdn.microsoft.com/en-us/library/aa266212(v=vs.60).aspx

    Die Frage ist, ob man sich so einen Klotz ans Bein binden will. Ich würde eher das VBA-Script so ändern, dass es nicht in einem proprietären MS-Format abspeichert.

    Oh, das habe ich gesucht und nicht gefunden 👍

    Vielleicht sind Bestandsdaten noch ein Kriterium, sodass man nicht einfach das Dateiformat ändern kann?



  • Die konvertiert man dann einmal.



  • Die konvertiert man dann einmal.

    Es handelt sich hier um Berechnungen von 10 Jahren. Der Wandlungsaufwand wäre enorm (aber im Notfall sicherlich möglich).

    Anderer Vorschlag:
    Was wäre wenn man sich eine VBA Entwicklungsumgebung zulegt (möglichst kostenlos) den Code zum Öffnen in eine DLL packt und somit die Datei öffnet? Spricht was dagegen? Kennt eine ne kostenlose VBA Entwicklungsumgebung?



  • Der Wandlungsaufwand wäre enorm

    Haeh, man definiert ein neues Daenformat, implementiert einen Konverter (wegen mir in VBA) und laesst alle Daten automatisch umwandeln.



  • Kennt eine ne kostenlose VBA Entwicklungsumgebung?

    Schon mal Alt + F11 in Excel benutzt?

    Gruß


Log in to reply