| |
|
|
- 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 |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
Stephan Sonneborn | Hallo Pascal,
nein, leider wars das auch nicht.
Ich bin zwar auf diesen Uralt-Trick reingefallen, aber das wars nicht... |
|
|
| 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 |
|
|
| |
|
|
|
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:
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 |
|
|
| |
|
|
|
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:
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 |
|
|
| |
|
|
|
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.
|
|
|
| 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:
Einen ungültigen Wert erkennt man meist daran, daß er zu niedrig ist.
Halt mich auf dem Laufenden! Pascal |
|
|
| |
|
|
|
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 ▲ |
|
|
|