Excel und RTD
#1
Guten Tag,
ich sitze vor einem für mich unlösbaren Problem:
meine Exceltabelle wird permanent mit RTD-Daten versorgt.
Ich habe einige Prozeduren geschrieben, die diese Daten dann auswerten.
Diese Prozeduren werden über eine Befehlsschaltfläche aufgerufen.

Das will ich nun automatisieren, damit ich nicht alle 5 Minuten diese Schaltfläche betätigen muß.
Da RTD aber nur übertragen wird, wenn Excel idle ist, kann ich innerhalb Excel keine Timer installieren, weil Excel damit permanent busy ist.

Ich habe es mit VBScript versucht. Einmal durch Aufruf der Procedur, auch mit SendKeys.
Aber entweder stellt die RDT-Versorgung ihre Dienste ein oder die Prozeduren  antworten nicht.

Ich hatte auch die Idee, einen Zeitstempel mit den RTD-Daten zu übertrage. Damit hätte ich die Permanentarbeit ausgelagert. Dann wäre ein Change-Ereignis angesagt, hat aber auch noch nicht funktioniert.


Hat jemand schon einmal mit diesem Problem zu gehabt und kann mir einen Fingerzeig geben, wo man hier etwas nachlesen kann?

Ich wäre Ihnen sehr verbunden!
Top
#2
Hallöchen,

wenn Du schreibst, dass Deine Exceldatei permanent mit Daten versorgt wird, bedeutet das doch, dass Excel permanent offen ist? Was meinst Du mit Excel ist busy? Dass Excel offen ist oder CPU usw. belegt?
Du könntest in einem Makro z.B. 5 Minuten pausieren, ohne dass da großartig was gebraucht wird. Nutze dazu die API "sleep". Die verbraucht keine oder keine nennenswerten Ressourcen.
Oder willst Du Excel alle 5 Minuten starten? Dann nimm die Aufgabenplanung.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Guten Morgen,
danke für die Reaktion.
Mit busy meine ich den Zustand einer Windowsanwendung, wenn ein Ereignis eigetreten, aber noch nicht vollständig abgearbeitet ist. Das Gegenteil ist idle, die Anwendung ist im Leerlauf.
Da RTD nur im "idle"-Zustand kommuniziert, muß ich einen Weg finden,  mit Excel zu kommunizieren, ohne den Ruhezustand länger als unbedingst nötig zu "stören".
Ich will von außen eine Prozedur aufrufen, und nur während der Zeit, in der diese Prozedur abläuft, die Ruhe stören, um das Zugangsfenster für RTD-empfang möglichst lange offen zu halten (beispielsweise 99% der Zeit).

Ich hatte bereits früher das angesprochene SLEEP versucht, siehe nachfolgendem Listing
.....................................................................................................................................
'Excel-Makro-Aufruf

Pfad_u_Datei="C:\BasisTest.xlsm"
Set objexcel = CreateObject("Excel.Application")
objexcel.Visible = True
Set objWorkbook = objexcel.workbooks.Open(Pfad_u_Datei, 3, false,,,,,,,,True,,,True,)

for i=1 to 105
    objexcel.Application.Run "starte_Makro1"
    WScript.Sleep 300000
next

Set objWorkbook = Nothing
Set objexcel = Nothing
WScript.quit
.....................................................................................................................................


Erfolg: Ecxel verweigerte den RTD-Empfang.

Wie kann ich exakt erfahren, ob Excel idle oder busy ist (in einer Zeitschleife ist Excel ja nur scheinbar idle)
Da fehlt mir zu viel Wissen um die inneren Abläufe einer Windowsanwendung.

Der obige Ansatz scheint mir eher erfolgversprechender, bisher blieb die Erfüllung des Versprechens aber noch aus.



danke für den Hinweis
Top
#4
Verwende Application.ontime:

http://www.snb-vba.eu/VBA_Application.OnTime_en.html
Top
#5
Hallo Gustav,

hast Du schon mit DoEvents experimentiert?

Aus der Hilfe:

Übergibt die Steuerung an das Betriebssystem, damit es andere Ereignisse verarbeiten kann.

Syntax

DoEvents( )

Bemerkungen

Die DoEvents-Funktion gibt einen Wert vom Typ Integer zurück, der die Anzahl der geöffneten Formulare in eigenständigen Versionen von Visual Basic (z.B. Visual Basic, Professional Edition) repräsentiert. In allen anderen Anwendungen gibt DoEvents Null zurück.

DoEvents übergibt die Ablaufsteuerung an das Betriebssystem. Das Programm erhält erst dann die Steuerung wieder zurück, wenn das Betriebssystem alle wartenden Ereignisse verarbeitet hat und alle wartenden Tastenanschläge in der SendKeys-Warteschlange abgearbeitet sind.

DoEvents ist für einfache Operationen besonders hilfreich, wenn z.B. einem Benutzer die Möglichkeit gegeben werden soll, einen Prozeß abzubrechen, nachdem er begonnen wurde, beispielweise die Suche nach einer Datei. Bei länger andauernden Vorgängen sollte die Steuerung besser mit Hilfe eines Zeitgebers an den Prozessor abgegeben werden, oder die Aufgabe sollte einer ActiveX-EXE-Komponente übertragen werden. Im zweiten Fall kann die Aufgabe vollkommen unabhängig von Ihrer Anwendung durchgeführt werden, und das Betriebssystem übernimmt das Multitasking und die Zuteilung der Prozessorzeit.

Vorsicht°°°Jedesmal wenn Sie die Steuerung zeitweise innerhalb einer Ereignisprozedur an den Prozessor abgeben, sollten Sie sicherstellen, daß die Prozedur nicht von einem anderen Teil des Codes aufgerufen wird, bevor der erste Aufruf beendet ist. Die Folgen eines solchen Aufrufs sind nicht vorhersehbar. Führen Sie DoEvents auch dann nicht aus, wenn Sie nicht ausschließen können, daß andere Anwendungen in irgendeiner Weise eine Verbindung mit der Prozedur herstellen, während das Betriebssystem die Ausführung steuert.


Gruß Uwe
Top
#6
zuerst einmal vielen Dank, für die Anregungen.
Es hat etwas länger gedauert, bis ich antworte.
Ich habe die Anregungen durchexerziert, leider ohne Erfolg.
ich komme darauf zurück, daß RTD nur bei leerer Eventschleife zugreifen kann.
Aber sowohl onTime als auch do eEvent werkeln während ihrer Aktionen über Zählungen in Excel.
Ich glaube, die Lösung ist in Richtung Scripting zu suchen, also streng außerhalb der Windowsanwendung.
VBS kann ich ausklammern. Hier hatte ich zwar Zugriff auf meine Prozedur, aber der RTD-Empfang riß ab, sodaß ich vermuten muß daß sich VBS und VBA im selben Raum bewegen, sodaß keine strikte Ereignistrennung vorliegt.
Die gesuchte Lösung liegt wohl in einer eigenen COM-Ansprache, von wo auch immer.
Ich habe mir ein Buch über Powershell, Jawascript etc bestellt.
Wenn ich dort eine Lösung finde, will ich gerne berichten (wenn das gewünscht wird).

Ich danke nochmals und wünsche weiterhin viel Freude mit Excel
Top
#7
Zitat:Aber sowohl onTime als auch (..) werkeln während ihrer Aktionen über Zählungen in Excel.


Das stimmt sicher nicht.
Top
#8
Hallöchen,

mit den Begrifflichkeiten geht wohl etwas durcheinander.
VBS und Scripting gehört in einen Topf. VBS = Visual Basic Script. Du kannst es mit wscript oder cscript ausführen und das sind Windowsanwendungen.
VBS und VBA beeinflussen sich nur, wenn Du Excel per VBS steuerst.

Im Ruhezustand dürfte eigentlich nichts laufen, wenn Du den vom Windows meinst. Den Ruhezustand kannst Du aber z.B. mit der Aufgabenplanung zum Start einer Aufgabe beenden. Daneben gibt es z.B. noch den abgemeldeten Zustand oder auch den Zustand, wo der Bildschirmschoner aktiv ist.

Bist Du sicher, dass Dein Makro läuft? In Deinem Script ist m.E. zumindest ein Fehler drin:
statt
objexcel.Application.Run "starte_Makro1"
dann
objexcel.Run "BasisTest.xlsm!Modul1.starte_Makro1"

Statt Modul1 setzt Du den korrekten Namen des Moduls ein.

Aus Excel heraus könntest Du z.B. die Abarbeitung verschiedener Stände und Aktionen in ein Logfile schreiben.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#9
Hi,

(02.07.2016, 18:41)schauan schrieb: Im Ruhezustand dürfte eigentlich nichts laufen, wenn Du den vom Windows meinst.

ich glaube, er meint, daß Excel läuft, aber kein Makro läuft, also, wie wenn Excel mit einer Datei gestartet ist und einfach so auf Eingaben wartet (Excel-Idle). Dann kann RTD die Daten in das Excel-File schreiben.
Während eines Makro-Laufs in Excel (also auch beim Warten auf einen Zähler, CountDown, onTime) ist kein Daten-Import durch RTD möglich, es können also keine Daten in die Datei geschrieben werden.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste