Deutsch
Forum

Exceldaten über ocx kopieren

 
- Seite 1 -



Christof
Neuß
Hallo,

brauche mal wieder einen Anschubser. Es geht darum, dass ich einen Bereich aus einer Exceldatei in eine andere Exceldatei kopieren möchte. Eigentlich ganz einfach, aber...

Ich habs mal so probiert, aber schon beim "Select" springt mir das Ding raus.
Oh, äähh... die hier sind natürlich oben angegeben, sonst gehts ja gar nicht.
 $H Windows.ph
 $H ocx3a.ph
 $I ocx3a.inc

Proc DatenKopieren

    Excel öffnen
    ocxInit()
    VAR Datei1$   =$ProgDir+"GGBVSDialog.xls"
    VAR Datei2$   =$ProgDir+"GGBVSDialog_Auswertung.xlsx"
    VAR Excel&    =ocxCreate("Excel.Application")
    VAR Workbooks&=ocxGet(Excel&,"Workbooks")
    Exceldatei der Bank öffnen GGBVSDialog.xls
    VAR NewBook1&=ocxMethod(Workbooks&,"Open",Datei1$)
    VAR Sheet1&=ocxGet(NewBook1&,"Sheets","BankDaten")
    VAR Range1&=ocxGet(Sheet1&,"Range","B6:F100")
    Exceldatei der GGB öffnen GGBVSDialog_Auswertung.xlsx
    VAR NewBook2&=ocxMethod(Workbooks&,"Open",Datei2$)
    VAR Sheet2&=ocxGet(NewBook2&,"Sheets","BankDaten")
    VAR Range2&=ocxGet(Sheet1&,"Range","B6")
    BankDaten kopieren
    ocxMethod(Sheet1&,"Activate")
    ocxMethod(Sheet1&,"Select","B6:F100")
    Die Messagebox sollte nur anzeigen, ob der Select-Befehl funktioniert hat,
    also nicht mit Fehlermeldung dort rausgesprungen ist. Soweit kommt das Ding
    aber gar nicht.
    MessageBox("Select gelaufen","Meldung",0)
    ocxMethod(Sheet1&,"Copy")
    ocxMethod(Sheet2&,"Select","B6")
    ocxMethod(Sheet2&,"PasteSpecial",)
    Exceldateien und Excel schließen
    ocxPut(NewBook1&,"Saved",1)
    ocxMethod(NewBook1&,"Close")
    ocxMethod(NewBook1&,"Save")
    ocxPut(NewBook2&,"Saved",1)
    ocxMethod(NewBook1&,"Close")
    ocxMethod(Excel&,"Quit")
    ocxRelease(Range1&,Sheet1&,NewBook1&)
    ocxRelease(Range2&,Sheet2&,NewBook2&)
    ocxRelease(WorkBooks&,Excel&)
    ocxDeInit()

endproc


Oh, die Sheets sind in beiden Dateien gleich aufgebaut. Auf Formatierungen etc. braucht man also keine Rücksicht nehmen. Mit der ersten Datei werden die Daten beim Kunden abgeholt, in der zweiten sind zusätzlich die Auswertungsblätter.

Danke
 
Win10 16 GB RAM
14.04.2010  
 



 
- Seite 2 -



Stephan
Sonneborn
Hallo Pascal,

nein, leider wars das auch nicht.

Ich bin zwar auf diesen Uralt-Trick reingefallen, aber das wars nicht...

159 kB
Kurzbeschreibung: OCX-Fehlermeldung
Hochgeladen:02.10.2010
Ladeanzahl374
Herunterladen
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
02.10.2010  
 




Uwe
''Pascal''
Niemeier
Hi Stephan!

Ich dachte, der Fehler wäre CallMethod Fehler $-7FF5FC14-2146827284 unbekannter Fehler  ?
Der ließ sich nämlich durch einen falschen Pfad nachvollziehen und tritt beim versuchten Öffnen der xls auf.
Wo genau tritt denn der Fehler bei dir auf?

SeeYou
Pascal
 
02.10.2010  
 




Stephan
Sonneborn
Hi Pascal,

ich sollte mir vielleicht auch mal den ganzen Quellcode ansehen: da wurde auf Tabellen verwiesen, die nicht in den Testdaten drin waren...
Klar, dass dann Fehler kommen...

Jetzt läufts fehlerfrei durch, kopiert aber noch nicht. Ich schau mir jetzt nochmal Deine Hilfe-Datei an.
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
03.10.2010  
 




Stephan
Sonneborn
Hi Pascal,

ich hab noch ne Frage: wie kann ich die letzte Zeile aus einer Excel-Mappe auslesen?
in VBA wäre das

das müsste doch irgendwie mit ocxget() gehen...
Wenn Sheet& die aktuelle Mappe ist, dann müsste das doch irgenwie ocx(Sheet&, "UsedRange",...) heißen... Hast Du ne Idee?
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
03.10.2010  
 




Uwe
''Pascal''
Niemeier
Hi Stephan!

Den VBA-Ausdruck Sheet.UsedRange.Rows.Count mußt du für ocx in einzelne Objekte zerlegen:
var Sheet&=ocxGet(NewBook&,"Sheets","Seite1")
var UsedRange&=ocxGet(Sheet&,"UsedRange")
var Rows&=ocxGet(UsedRange&,"Rows")
print ocxGet(Rows&,"Count")

BTW: Das Sheet selbst hat bereits ein Row-Unterobjekt, aber das enthält anscheinend die theoretisch  verfügbare Zeilenanzahl.

Was mir noch aufgefallen ist: Die Excel-Anwendung wird durch das Release am Programmende leider nicht beendet, sondern bleibt unsichtbar im Speicher hängen.
Hier ein vollständiges Beispiel mit Workaround dafür:
window 600,600
 $H Windows.ph
 $H ocx3a.ph
 $I ocx3a.inc
ocxInit()
var Datei$="C:1TestTest.xls"'---Existierende Datei
var Excel&=ocxCreate("Excel.Application")
var ExcelWnd&=ocxGet(Excel&,"Hwnd")'--Fenster von Excel (auch wenn nicht sichtbar)
'ocxPut(Excel&,"Visible",1)'--zu Testzwecken
var Workbooks&=ocxGet(Excel&,"Workbooks")
var NewBook&=ocxMethod(Workbooks&,"Open",Datei$)
var Sheet&=ocxGet(NewBook&,"Sheets","Seite1")'--Tabelle "Seite1" muß vorhanden sein
var UsedRange&=ocxGet(Sheet&,"UsedRange")
var Rows&=ocxGet(UsedRange&,"Rows")
print ocxGet(Rows&,"Count")
ocxRelease(Rows&,UsedRange&,Sheet&,NewBook&,WorkBooks&,Excel&)
ocxDeInit()
sendmessage(ExcelWnd&,16,0,0)'--WM_CLOSE an Excel
waitinput

Das mit dem Kopieren hab' ich mal mit eigenen Dateien angetestet; sollte auch klappen.

HTH
Pascal
 
04.10.2010  
 




Stephan
Sonneborn
Hallo Pascal,

vielen Dank für Deine Hilfe. Jetzt hab ich die Zeilen auslesen können. Ich versuch mich nun mal an den Tabellennamen innerhalb einer Datei...
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
04.10.2010  
 




Stephan
Sonneborn
Hallo Pascal,

gibts eigentlich Unterschiede zw. Excel 97 und 2003 in Bezug auf OCX?
Ich hab hier ne Testumgebung nur mit Excel 97 und laufe ständig auf Fehler auf.

Z.B. $8002006 -2147352570 bei der Zeile
ExcelWnd&  = ocxGet(Excel&,"Hwnd")

Mal ne generelle Frage: In der ocx3a.inc sind bei der ocxGET-Funktion nur 2 Parameter angegeben. Liest die Funktion trotzdem "Seite1" aus?
var Sheet&=ocxGet(NewBook&,"Sheets","Seite1")
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
08.12.2010  
 




Uwe
''Pascal''
Niemeier
Hi Stephan!


gibts eigentlich Unterschiede zw. Excel 97 und 2003 in Bezug auf OCX?
Ich hab hier ne Testumgebung nur mit Excel 97 und laufe ständig auf Fehler auf.


Ich würde mal sagen: Ja
So genau kenne ich mich nicht aus, aber ich denke mal, daß auch Makros und Skripte nicht immer abwärtskompatibel sind, weil neuere Office-Versionen Befehle/Funktionen enthalten, die in älteren eben fehlen.
Da wirst du dich wohl in den jeweiligen Befehlssatz einarbeiten müssen.


Mal ne generelle Frage:
In der ocx3a.inc sind bei der ocxGET-Funktion nur 2 Parameter angegeben.
Liest die Funktion trotzdem "Seite1" aus?


Jepp! Alle weiteren Parameter werden innerhalb von "ocxGet" zur Prozedur "ocxPutParams" durchgereicht.
Etwa so:
window 500,200

proc Test2'-----------------------------------

    print &(1),&(2),&(3)

endproc'--------------------------------------

proc Test1'-----------------------------------

    Test2

endproc'--------------------------------------

Test1(1,2,3)
waitkey

Zugegebenermaßen nicht sehr elegant, zumal Roland dieses Verhalten schon bei der nächsten Profan-Version kippen kann
Die Verarbeitung von Variablen unbestimmten Typs (bei ActiveX Gang und Gäbe) ist noch 'ne große Schwachstelle; das geht bisher am einfachsten über Prozedur-Parameter, weil da Wert und Typ quasi getrennt gehandhabt werden.

HTH
Pascal
 
09.12.2010  
 




Stephan
Sonneborn
Hallo Pascal,

ich hab wieder ein Problem mit ocx und Excel. Bei ocxDEInit() schmiert mir Profan ab. Kannst Du Dir einen Reim drauf machen? Ich hab in der ocx3a.inc die Proc ocxrelease als Ursache (der call-Aufruf im besonderen) festgestellt.

Anbei auch ein Bild der Fehlermeldung.


64 kB
Hochgeladen:02.06.2011
Ladeanzahl339
Herunterladen
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
02.06.2011  
 




Uwe
''Pascal''
Niemeier
Hi Stephan!

Bisher lief es doch? Was hast du denn geändert / neu eingebaut?

Bei ocxDeInit() werden alle zu dem Zeitpunkt noch vorhandenen Objektpointer automatisch freigegeben, indem sie an ocxRelease() weitergereicht werden. Ein möglicher Fehler wäre, daß einer dieser Pointer in irgendeiner Weise ungültig ist.

Du arbeitest noch mit XProfan 11.2? Ein ähnliches Problem trat nämlich bei der vorletzten Version von X2 auf, weil beim Auslesen der ocx-internen Liste ein falscher Wert ermittelt wurde; allerdings ergab das einen unbestimmten Fehler und keine Zugriffsverletzung...

Du könntest dir mal die Objektliste anzeigen lassen:
...
clearlist
movehandletolist(ocxList&)
listbox$("Objekte",1)
ocxDeInit()
...

Einen ungültigen Wert erkennt man meist daran, daß er zu niedrig ist.

Halt mich auf dem Laufenden!
Pascal
 
02.06.2011  
 




Stephan
Sonneborn
Uwe ''Pascal'' Niemeier (02.06.11)
Bisher lief es doch? Was hast du denn geändert / neu eingebaut?


Das hatte ich mich auch gefragt. Eigentlich nix besonderes. Jedenfalls nix, was mit mit den ocx-Routinen zu tun hätte. Nur ein paar farbige Edits...

Uwe ''Pascal'' Niemeier (02.06.11)
Du arbeitest noch mit XProfan 11.2? Ein ähnliches Problem trat nämlich bei der vorletzten Version von X2 auf, weil beim Auslesen der ocx-internen Liste ein falscher Wert ermittelt wurde; allerdings ergab das einen unbestimmten Fehler und keine Zugriffsverletzung...


Ich arbeite mit X2. Mir war nur aufgefallen, dass ich noch mit der 12.00.058er Beta gearbeitet hatte und hatte dann die aktuelle X2er als Interpreter genutzt.
Aber dass das der Fehler war, war mir nicht sofort klar. Erst als ich mal eine Exe des Programms (funktionstüchtig) als Interpreter-Datei verwendet hatte, fiel der Groschen: es musste tatsächlich an der aktuellen X2er Version liegen!

Dann muss ich wohl erstmal bei der alten Beta als Interpreter und Runtime für die OCX-Rogramme bleiben...

Meine aktuellen Versionen sind:
Runtime: 12.0.0.226
Interpreter: 12.0.0.221
 
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
02.06.2011  
 




RGH
Hallo,
die aktuelle Version ist X2.0a und wurde an alle Subscriptionskunden versandt!
Runtime und Interpreter haben die interne Version 12.0.1.0!

(Sollte die Mail bei Dir nicht angekommen sein, schicke mir eine Mail und Du erhältst umgehend Post!)

(BTW: Bei JDS ist ab heute nur diese aktuelle Version erhältlich.)

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
02.06.2011  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

29.334 Betrachtungen

Unbenanntvor 0 min.
Langer02.04.2017
Uwe Lang22.07.2016
RudiB.19.11.2015
Klaus Ernst03.03.2015
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie