Seite 1 von 1

Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 9:03
von Benz
Hi,

ich lese eine größere Menge Daten in ein leere Excel-Datei ein, die noch nirgends gespeichert ist. Deshlab will ich Excel im Vordergrund laufen lassen, sodass der Benutzer beim Schließen gefragt wird, wie er die Datei speichern will.
Jetzt habe ich allerdings ein Problem und zwar wenn der Benutzer während dem Einlesen der Daten (zeilenweise) mit der Maus in irgendeine Zelle klickt, so wird das Einlesen sofort gestoppt und eine Fehlermeldung (s. Anhang) wird erzeugt und das Programm anschließend beendet.

Gibt es eine Möglichkeit Aktionen vom Benutzer in Excel zu unterdrücken und zwar so lange wie die COM Daten einliest?
Google gibt mir leider keine Infos, außer dass ich den PC in der Zeit sperren soll, aber das kann keine Lösung sein, dafür ist die COM zu langsam..

Und noch eine weitere Frage: Hat jemand einen Link für eine Befehlssammlung zu ActiveX - Komponenten zu Word, Excel, Outlook, etc.. ?
Kann mir vorstellen, dass es schon zickmal angesprochen wurde, allerdings finde ich keine wirklichen Links, die das unter den Programmen wirklich aufteilen.

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 9:07
von Rolf Ramacher
Guten Morgen benz,

versuche es mal mit visible:=.t. und später auf .f. zu setzen. Eine Sammlung der Befehle habe ich nicht und dies wurde hier schon öfters diskutiert. Sovile wie ich weiß, sind diese active-x befehle von mircosoft nicht aussreichend dokumentiert.

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 9:35
von brandelh
Ich würde visible auf .f. setzen bis die ganze Aktion durch ist und in Xbase++ z.B. einen Fortschrittsmeldung ...
Erst am Ende dann auf .t. (dann kommt Excel nach vorne und kann bedient werden.).

Du könntest aber auch einfach gleich den kompletten Dateinamen mit Pfad übergeben und automatisch speichern lassen.

Wenn du die Aktionen von Excel aber zeigen willst und die Eingaben sperren, könnte es funktionieren in Xbase++ ein Dialog/control zu erzeugen, der transparent ist und somit unsichtbar.
Dieses Systemmodal anzeigen und hoffen dass keine Benutzereingaben nötig werden ;-)
Ein solches Fenster könnte natürlich auch kleiner sein mit "Bitte warten ..." und eventuell einem Abbruch Button. Systemmodal verhindert Eingaben in andere Fenster.

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 9:51
von Benz
Hm ok. Das mit visible := .F. scheint für mich die beste Alternative, weil das schon ziemlich lange dauert und für die Benutzer schwierig wird, wenn sie keine anderen Eingaben mehr machen können. Ein Statusanzeiger wäre schon nicht schlecht, ich denke da immer an eine Progressbar aber ich habe so eine leider noch nie benutzt und weiß auch nicht wo ich die herbekomme. Könnt ihr mir da weiterhelfen?

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 11:46
von brandelh
Wenn die User anders arbeiten sollen, dann ist eine Laufanzeige nicht so toll (keine wirkliche Info)
Besser einen kleinen Dialog machen "Erledigt x von nMax" mit Abbrechen button und den ON TOP anzeigen.
Dann kann jeder machen was er will (außer Excel) und sieht doch die Anzeige.

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 12:11
von Wolfgang Ciriack
Also bei meinem Office 2003 findet man die Objectmodelle mit Methoden, Properties etc. als Hilfedateien unter
...\Microsoft Office\Office11\1031.
Wenn diese jemand haben möchte (ca. 5.5MB für Excel, Word,Outlook) so bitte eine Mail an mich (ciriack_at_ciju.de)

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 03. Sep 2013 21:16
von AUGE_OHR
Rolf Ramacher hat geschrieben:Eine Sammlung der Befehle habe ich nicht und dies wurde hier schon öfters diskutiert. Sovile wie ich weiß, sind diese active-x befehle von mircosoft nicht aussreichend dokumentiert.
Wolfgang zeigt ja wo sich bei Office XP 2003 noch die Help Files sind aber ab Office 2007 (mit Ribbonbar)
gibt es Help Files nur noch mit Online Verbindung z.b. "im" Macro-Editor bei F1.

auf der Start Seite http://msdn.microsoft.com/de-de/library ... 62978.aspx muss man auswählen welche Produkt man haben will.

z.b. Excel http://msdn.microsoft.com/de-de/library ... 79694.aspx
und dann rechts auf den Link zur API Referenz ( von Excel ) http://msdn.microsoft.com/en-us/library/ee861528.aspx
jetzt wählt man das "Object model" http://msdn.microsoft.com/en-us/library/ff194068.aspx
und kann sich die Members und deren Properties, Methods und Events ansehen.
Benz hat geschrieben:Gibt es eine Möglichkeit Aktionen vom Benutzer in Excel zu unterdrücken und zwar so lange wie die COM Daten einliest?
wenn du o:visible := .F. hast "sieht" der User es ja gar nicht und es ist auch "schneller" beim befüllen.

grundsätzlich ist die activeX Schnittstelle bei Office bidirektional d.h. Excel "sendet" auch Events wenn der User eine Aktion auslöst ( die man dann unterbinden kann )

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 04. Sep 2013 10:35
von Benz
AUGE_OHR hat geschrieben:
Rolf Ramacher hat geschrieben:Eine Sammlung der Befehle habe ich nicht und dies wurde hier schon öfters diskutiert. Sovile wie ich weiß, sind diese active-x befehle von mircosoft nicht aussreichend dokumentiert.
Wolfgang zeigt ja wo sich bei Office XP 2003 noch die Help Files sind aber ab Office 2007 (mit Ribbonbar)
gibt es Help Files nur noch mit Online Verbindung z.b. "im" Macro-Editor bei F1.

auf der Start Seite http://msdn.microsoft.com/de-de/library ... 62978.aspx muss man auswählen welche Produkt man haben will.

z.b. Excel http://msdn.microsoft.com/de-de/library ... 79694.aspx
und dann rechts auf den Link zur API Referenz ( von Excel ) http://msdn.microsoft.com/en-us/library/ee861528.aspx
jetzt wählt man das "Object model" http://msdn.microsoft.com/en-us/library/ff194068.aspx
und kann sich die Members und deren Properties, Methods und Events ansehen.
Benz hat geschrieben:Gibt es eine Möglichkeit Aktionen vom Benutzer in Excel zu unterdrücken und zwar so lange wie die COM Daten einliest?
wenn du o:visible := .F. hast "sieht" der User es ja gar nicht und es ist auch "schneller" beim befüllen.

grundsätzlich ist die activeX Schnittstelle bei Office bidirektional d.h. Excel "sendet" auch Events wenn der User eine Aktion auslöst ( die man dann unterbinden kann )

Das ist schonmal ein riesen Fortschritt und beinahe das was ich gesucht habe. Leider gibt Microsoft da wohl nicht alles frei oder ich finde das weiterführende nicht.
Jedenfalls wenn ich hier bin http://msdn.microsoft.com/en-us/library/ff839770.aspx dann sehe ich dass "Font" das letzte in der Hierarchie ist, allerdings gehören zu "Font" ja noch weitere Eigenschaften wie z.B. "Name" (s. Beispiel) und "Color" habe ich aus dem Forum. Aber woher bekomme ich die restlichen Eigenschaften von Font? Wie kann ich z.B. den Text einer Zelle fett machen?

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 04. Sep 2013 11:06
von Wolfgang Ciriack
Hier meine Funktion um einen Bereich in Excel mit Daten aus einem Array (bevorzugt, da sehr schnell) zu befüllen und den Font zu setzen:

Code: Alles auswählen

static FUNCTION SetExcelValue(cRange,oWorkSheet,xValue)
LOCAL oRange
oRange := oWorkSheet:Range(cRange)
oRange:Select()
oRange:Value := xValue
oRange:Font:Name:="Arial"
oRange:Font:Size:=8
oRange := nil
RETURN nil
Einzelne Zellen kannst du mit verschiedenen Eigenschaften versehen, z.B.

Code: Alles auswählen

   oWorkSheet:Columns( 5 ):NumberFormat := "#.#0,00"
   oWorkSheet:Columns( 6 ):NumberFormat := "0 %"
   oWorkSheet:Columns( 8 ):AutoFit()

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 04. Sep 2013 11:24
von brandelh
Hi, suche doch mal nach *excel* und du wirst viele Einträge finden, schon in den Überschriften sind dann jede Menge Anregungen.

auch oExcel oder oBook oder oSheet oder oWorksheet sind dankbare Suchbegriffe zu dem Thema

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 04. Sep 2013 12:59
von Koverhage
damit
oExcel:Range("A1"):Font():Bold := .t.

Beispiel:
oExcel:Range("A1:I1"):Value := aHeader //Spaltenüberschriften im Array
oExcel:Range("A1:I1"):Font():Size := 10 //Schriftgrösse ändern
oExcel:Range("A1:I1"):Font():Name := "Times" //Schrift festlegen
oExcel:Range("A1:I1"):Font():Bold := .t.

Re: Excel während COM-Eintrag sperren

Verfasst: Do, 05. Sep 2013 2:14
von AUGE_OHR
Benz hat geschrieben:Jedenfalls wenn ich hier bin http://msdn.microsoft.com/en-us/library/ff839770.aspx dann sehe ich dass "Font" das letzte in der Hierarchie ist, allerdings gehören zu "Font" ja noch weitere Eigenschaften wie z.B. "Name" (s. Beispiel) und "Color" habe ich aus dem Forum. Aber woher bekomme ich die restlichen Eigenschaften von Font? Wie kann ich z.B. den Text einer Zelle fett machen?
unter dem Link findest du in Zeile 3 das
Returns a Font object that represents the font of the specified object.
das ist ein Link zu http://msdn.microsoft.com/en-us/library/ff840959.aspx
wenn du dann auf Properties gehst bekommst du alle Eigenschaften die ein Font hat.

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 15. Okt 2013 10:03
von Benz
Das war viel zu einfach als dass ich es selbst hätte herausfinden können :banghead:

Danke!!!

Re: Excel während COM-Eintrag sperren

Verfasst: Di, 15. Okt 2013 16:22
von AUGE_OHR
Benz hat geschrieben:... ich denke da immer an eine Progressbar aber ich habe so eine leider noch nie benutzt und weiß auch nicht wo ich die herbekomme. Könnt ihr mir da weiterhelfen?
in der DXE Lib (Wissensbasis) findest du ein "native" Progressbar Control.

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 16. Okt 2013 7:53
von brandelh
Alaska hat für Subscriptionskunden einige neue Controls im Quellcode veröffentlicht, darunter auch ein Progressbar.

Re: Excel während COM-Eintrag sperren

Verfasst: Mi, 16. Okt 2013 21:59
von AUGE_OHR
brandelh hat geschrieben:Alaska hat für Subscriptionskunden einige neue Controls im Quellcode veröffentlicht, darunter auch ein Progressbar.
und der ist sogar "native" ;)

Code: Alles auswählen

...
   nHWND := CreateWindowExA( 0, PROGRESS_CLASSA, 0, ::nStyles, ;
                             0,0, aSize[1],aSize[2],      ;
                             ::SetParent():GetHWND(), 0,  ;
                             GetModuleHandleA(0), 0 )
...