Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Das nächste Problem:
Wenn der User interaktiv im geladenen Excel-Sheet ändert (in eine Zelle klickt) ist der Zugriff über das Excel-Objekt auch wieder gesperrt bzw. "unklar". So lange bis der Benutzer die Zelle verlässt/das Editieren beendet.

Habe den Zustand versucht abzufragen, z.B. mit
u1 := oExcel:Application:UserControl
u2 := oExcel:Application:Interactive

aber es scheint als wäre der gesamte Zugriff auf das Excel-Objekt "blockiert". Alle Befehle die ich versucht habe stürzen ab.
(So ein Käse, so langsam ärgert mich das wirklich)

Jemand 'ne Idee?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:Habe den Zustand versucht abzufragen, z.B. mit
u1 := oExcel:Application:UserControl
u2 := oExcel:Application:Interactive
...
Jemand 'ne Idee?
ich denke nicht das dir ein "Zustand" (Property) was nützt ... du musst "alle" Events abfangen wenn du "interaktive" arbeiten willst.

Code: Alles auswählen

Worksheet :
*********
Activate 
AddRef
BeforeDoubleClick 
BeforeRightClick
Calculate 
Change
Deactivate
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
Invoke
QueryInterface
Release 
SelectionChange

Workbook:
*******
Activate
AddinInstall
AddinUninstall 
AddRef
BeforeClose
BeforePrint
BeforeSave
Deactivate 
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
Invoke
NewSheet
Open
QueryInterface 
Release 
SheetActivate
SheetBeforeDoubleClick 
SheetBeforeRightClick
SheetCalculate
SheetChange
SheetDeactivate
SheetSelectionChange
WindowActivate
WindowDeactivate
WindowResize

Application:
*********
Activate
AddRef
BeforeDoubleClick
BeforeRightClick
Calculate
Deactivate
DragOver
DragPlot
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
Invoke
MouseDown
MouseMove 
MouseUp
QueryInterface
Release
Resize 
Select
SeriesChange
solltest du auch "Chart","OLEObject" oder "QueryTable" verwenden sind die entsprechenden Events auch zu beachten.
gruss by OHR
Jimmy
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Jimmy

ich werde versuchen Deine Liste durchzuarbeiten und schauen ob irgendeine Antwort kommt.

Wenn ich in der Arbeitsmappe in eine Zelle klicke hat es den Anschein als würde Excel jeglichen Zugriff über das Excel-Objekt blockieren bis ich die Eingabe in die Zelle beende.
Versuche ich während dieser Zeit auf das Excel-Objekt zuzugreifen kommt eine Fehlermeldung, meist so:
  • E R R O R O B J E C T
    oError:args:
    1 -> VALTYPE: C VALUE: Application
    oError:canDefault:.T.
    oError:canRetry:.F.
    oError:canSubstitute:.T.
    oError:cargo:NIL
    oError:description:Aufruf wurde durch Aufgerufenen abgelehnt.
    oError:filename:NIL
    oError:operation:Application
    oError:osCode:-2147418111
    oError:severity:2
    oError:subCode:6500
    oError:subSystem:Automation
    oError:thread:1
    => Fehler bei der Generierung der ErrorObjectList
Mit oExcel:Application:Interactive := .F. / .F. begrenze ich die interaktiven Zugriffsmöglichkeiten des Users auf ein bestimmtes Zeitfenster. So klappt das jetzt langsam...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von brandelh »

Roland Gentner hat geschrieben:Das nächste Problem:
Wenn der User interaktiv im geladenen Excel-Sheet ändert (in eine Zelle klickt) ist der Zugriff über das Excel-Objekt auch wieder gesperrt bzw. "unklar". So lange bis der Benutzer die Zelle verlässt/das Editieren beendet.
mal ehrlich, wenn du während deine Anwendung 1000 Datensätze updatest mit Satzsperren, gleichzeitig mit dem HexEditor in der Datei herumschreibst,
dann wunderst du dich doch auch nicht oder ?

Wie genau übergibst du eigentlich deine Daten ?
Per Cut&Paste oder weißt du einer Zelle den value zu ? Im ersten Fall ist man extrem darauf angewiesen, dass der Curser weiß wo er zu stehen hat.
Und natürlich ist eine Zelle schreibgeschützt wenn einer darin herumschreibt.

Ich habe doch beschrieben wie man während der Datenübergabe das Blatt verstecken kann, dann kann auch keiner gleichzeitig draum herumfummeln.
Gruß
Hubert
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Hubert

es geht vorrangig um das Zusammenspiel meines Progs per Excel-Objekt mit dem interaktiv tätigen User in Excel. Ein häufiges Ein-/Ausblenden des Excel-Fensters wäre unschön.

Z.B. sollen beim Ausarbeiten einer umfangreichen Kalkulationsmappe bereits reelle Werte erscheinen. Der User wählt eine Zelle mit der Maus aus und
- füllt in die Zelle einen vorher vereinbarten Code welcher dann von meinem Prog nach verlassen des Editiermodus der Zelle in den richtigen Wert getauscht wird + Formatierung.
- gibt der Zelle einen von vorher vereinbarten Namen. Mein Prog füllt die Zelle mit dem Referenzwert + Formatierung.
- wählt in meinem Prog aus einer Liste den in der Arbeitsmappe einzutragenden Wert aus.
- usw...

Deshalb meine anfängliche Frage nach der exakten Statusabfrage des Excel-Objekts.
Es scheint so als könnten jederzeit Störungen in der Kommunikation mit dem Excel-Objekt auftreten - insbesondere bei User-Eingriffen. Es wär nicht verkehrt die Wichtigsten zu kennen und möglichst abzufangen.

Das automatisierte ein-/auslesen von Werten in/aus einem vollständig vordefinierten Arbeitsblatt ist ein anderes Thema.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von Wolfgang Ciriack »

Dann laß doch den User in deinem Programm die Werte eingeben (z.B. in einem Browse mit Cell-Editing) und übertrage dann die Werte in einem Rutsch. Ist meines Erachtens efektiver als immer hin- und her zuschalten.
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von brandelh »

Ich denke nicht, dass dieses Verhalten von Excel / ActiveX vorgesehen war.
Nach meinen Erfahrungen ist genau dieses Verhalten (gemeinsamer Zugriff) nicht sinnvoll.

Und warum den Code in Excel eingeben und in deinem Programm dann in einer Liste suchen ?
Ich würde dafür ein kleineres Fenster bauen, das von den Eigenschaften XbpDialog():alwaysOnTop := .t. ist.
IN Excel die Zielzelle wählen und dann mit der Maus auf dein Fenster klicken (Fokuswechsel geht nicht automatisch).
Dort im XbpSLE das Kürzel oder die Werte erfasssen oder gleich aus einer Liste auswählen und per XbpPushbutton() die Übergabe veranlassen.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von Tom »

Ich verwende Excel in einer ähnlichen Situation so, wie Wolfgang das angedeutet hat. Es geht konkret z.B. um das Ausfüllen von Controlling-/Benchmarking-Tabellen, die von einem Institut vorgefertigt werden. Die zu besetzenden Zellen sind mit Namen versehen, das Layout aber wechselt halbjährlich. In der Anwendung werden Daten erhoben, dazu erscheint dann ein Eingabefenster, um die zusätzlich erforderlichen Daten zu erfassen. Anschließend erzeugt die Anwendung eine Kopie der Vorlage, öffnet sie versteckt, füllt sie mit den Daten - und erst wenn das alles geklappt hat, wird Excel abermals sichtbar gestartet, mit der ausgefüllten Tabelle.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von brandelh »

Wer Tabellen versteckt ausfüllen und in Abhängigkeit zu Inhalten etwas damit tun will, sollte sich auch mal die LibXL.DLL (mit meiner Klasse HBLibXL) ansehen,
man braucht kein Excel und es geht schneller als mit ActiveX. Bei einigen 100 bis 1000 Werten macht das schon was aus.
Gruß
Hubert
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Danke für Eure Vorschläge und Bedenken.

Es gibt manchmal einige Wege die zum Ziel führen - in diesem Fall also per Xbase++ mit Excel-Tabellen zu kommunizieren.
Der von mir beschriebene ist eben ein anderer Weg. Interaktiv teilautomatisiert :)
Vor allen Dingen ist es so gewollt. Es ist auch immer eine Frage des Betrachtungswinkels.
Und es funktioniert seit heute Nacht auch einigermaßen (in rudimentärer Form...).

Mal sehen wie viele neue Stolpersteine der Live-Betrieb mit sich bringt...

Nichts desto trotz lässt die Statusabfrage des Excel-Objekts zu wünschen übrig. Damit kann ich leben - der Endkunde muss damit leben.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von brandelh »

Roland Gentner hat geschrieben:Nichts desto trotz lässt die Statusabfrage des Excel-Objekts zu wünschen übrig. Damit kann ich leben - der Endkunde muss damit leben.
Stimmt, es wäre besser wenn Microsoft da mehr getan hätte :wink:
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:Nichts desto trotz lässt die Statusabfrage des Excel-Objekts zu wünschen übrig.
Nö ... es ist der Weg den du benutzt. Es gab da mal ein "DSOFramer.FramerControl" ...
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:Nö ... es ist der Weg den du benutzt. Es gab da mal ein "DSOFramer.FramerControl" ...
Vorsicht, DSOFramer funktioniert nur bis einschließlich Office 2007!
es grüßt

Werner

<when the music is over, turn off the lights!>
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Jimmy
AUGE_OHR hat geschrieben:Es gab da mal ein "DSOFramer.FramerControl" ...
was ist das?
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von Werner_Bayern »

Alaska xpp-compilation-de

Aber ich rate dringend davon ab! Ist eine Sackgasse. Ist uralt das OCX von Microsoft und wird nicht mehr weiterentwickelt. Es gibt keine bezahlbare Alternative dazu!
es grüßt

Werner

<when the music is over, turn off the lights!>
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Werner

also OSD...= totes Gleis,

Danke
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Aber ich rate dringend davon ab! Ist eine Sackgasse.
YUP ... darauf wollte ich bei Roland hinaus ;)

der DSOframer war ja ein Versuch von M$ Office COM als Control "in" einer Applikation zu verwenden wobei die Events an den Parent weitergeleitet werden.
Die Office COM Schnittstelle ist ja bi-direktional ausgelegt und bei jeder User Tätigkeiten wird ein Event "gesendet".
man sollte schon "alle" Events "auswerten" ... egal was man dann macht {|| NIL }.
gruss by OHR
Jimmy
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Klaus

bin erst jetzt dazugekommen Deinen Vorschlag zu testen:
Koverhage hat geschrieben:oBook:BeforeClose := {||lExcelFinished := .T.}
Da bekomme ich aber eine Fehlermeldung:
oError:args:
1 -> VALTYPE: C VALUE: BeforeClose
2 -> VALTYPE: B VALUE: {||lExcelFinished := .T.}
oError:description:Unbekannter Name.
Member-Variable ist für dieses Objekt unbekannt
oError:operation:BeforeClose
oError:osCode:-2147352570
oError:severity:2
oError:subCode:6500
oError:subSystem:Automation
oError:thread:1
Habe Win8 + Office 2010
Muss ich ein "anderes" oBook verwenden?

Code: Alles auswählen

oBook := oExcel:ActiveWorkBook
Das wäre schon eine prima Funktion...
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

ERGÄNZUNG

habe gerade noch etwas gefunden in einem älteren Beitrag:
http://www.xbaseforum.de/viewtopic.php? ... ast#p28657
Damit scheint es zu gehen...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:dynamiccast...
Damit scheint es zu gehen...
dann kannst du ja jetzt auch die Events verarbeiten.
gruss by OHR
Jimmy
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Jimmy

hatte mich in der Vergangenheit mit DynamicCast() nicht weiter beschäftigt - jetzt weiß ich wenigstens auch wann und warum man das manchmal braucht.

Noch was anderes:

Code: Alles auswählen

lSaved := oBook:Saved
Die Zeile sollte mir eigentlich zeigen wenn ein geändertes Arbeitsblatt bereits gespeichert wurde. Tut es aber nicht, es kommt immer .F. zurück.
Auch wenn ich in Excel gerade "speichern" gedrückt habe.

Suche eigentlich eine Funktion welche mir sagt ob der Benutzer in Excel irgend etwas geändert hat. Dass ich Ihn beim Verlassen von Excel fragen kann ob er "Speichern" will.
Im Moment wird er immer gefragt, auch wenn nichts geändert wurde.
So einen "geändert"-Flag müsste es im Excel-Objekt doch bereits geben - oder?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:hatte mich in der Vergangenheit mit DynamicCast() nicht weiter beschäftigt - jetzt weiß ich wenigstens auch wann und warum man das manchmal braucht.
mit CreateObject() kannst du ja KEINE activeX Events mit o:subscribeEvent() "abonnieren" sondern muss erst per DynamicCast() ein ActiveXObject() machen.
Roland Gentner hat geschrieben: Noch was anderes:

Code: Alles auswählen

lSaved := oBook:Saved
Die Zeile sollte mir eigentlich zeigen wenn ein geändertes Arbeitsblatt bereits gespeichert wurde.
Tut es aber nicht, es kommt immer .F. zurück.
ein Arbeitsblatt ist ein "Worksheet" ...
Roland Gentner hat geschrieben:Auch wenn ich in Excel gerade "speichern" gedrückt habe.
hm ...
lege mal ein "neues" Workbook an und frage dann die o:Saved Property ab wenn es noch NICHT gespeichert wurde.
Roland Gentner hat geschrieben:Suche eigentlich eine Funktion welche mir sagt ob der Benutzer in Excel irgend etwas geändert hat. Dass ich Ihn beim Verlassen von Excel fragen kann ob er "Speichern" will.
Im Moment wird er immer gefragt, auch wenn nichts geändert wurde.
So einen "geändert"-Flag müsste es im Excel-Objekt doch bereits geben - oder?
für "Worksheet" gibt es den "Change" Event.
gruss by OHR
Jimmy
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

Hallo Jimmy

mit oSheet:Change
so wie mit
oBook:SheetChange
habe ich rumprobiert. Keiner der Events wird ausgelöst - zumindest nicht in meinen Tests :?
Ich muss ja dort Parameter angeben - wo landet das ausgelöste Signal dann aber...?

Ergänzung:
Meine Frage muss vermutlich lauten: Wie belege ich den jeweiligen Event-Kanal mit einer Funktion (Block)?

NOCHMAL NACHTRAG:
Habs gefunden... :banghead:
DelUser01

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von DelUser01 »

trotzdem seltsam:

bei

Code: Alles auswählen

oSheet:Change := { | oSheet , cRange | ChkCell1( oSheet , cRange ) }
so wie bei
oBook:SheetChange := { | cRange | ChkCell2( cRange ) }
sollte bei cRange ein String zurückkommen, es wird aber ein Objekt übergeben. Ein Range-Objekt?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel-Object: Excel geöffnet? Arbeitsblatt geladen?

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben:

Code: Alles auswählen

oSheet:Change := { | oSheet , cRange | ChkCell1( oSheet , cRange ) }
so wie bei
oBook:SheetChange := { | cRange | ChkCell2( cRange ) }
sollte bei cRange ein String zurückkommen, es wird aber ein Objekt übergeben. Ein Range-Objekt?
em ... äh ... wir sprechen von activeX Events und nicht von Property wo du "etwas" ( Codeblock ) zuweisen könntest.

ein activeX Event musst du "abonnieren" mit o:subscribeEvent()

Code: Alles auswählen

   cEventName := "Change"
   nDISPID := oSheet:isEventPublished( cEventName )
   IF nDISPID <> 0
       lSuccess := oSheet:SubscribeEvent( nDISPID, { |a| MSGBOX("Change "+Var2Char(a)) } )
       IF lSuccess
           AADD(aEvents,{cEventName,nDISPID})
       ENDIF
   ENDIF
das ganze funktioniert natürlich nur wenn du vorher

Code: Alles auswählen

   oSheet := oSheet:dynamicCast( ActiveXObject() ) 
durchgeführt hast.
( p.s. dito das selbe für "Workbook" und "Application" also jede COM Class die du benutzt )

... und am Schluss "aufräumen" nicht vergessen d.h. mit o:unsubscribeEvent() alle Verbindungen lösen bevor du die jeweilige COM Class wieder auf NIL setzt.
gruss by OHR
Jimmy
Antworten