Zwischenablage abfragen

Hallo
bin mittlerweile an entscheidender Stelle angelangt.
Ich habe mein Excelproblem über die Zwischenablage gelöst.
Mein VBA-Code wird abgearbeitet in der Exceldatei und wenn fertig,
lasse ich einen text in die Zwischenablage schreiben.

Diesen Text soll mein VB auffangen, sobald er drin steht.
Ich glaube aber das meine Lösung:

Do
ZwAblageText = Clipboard.GetText(vbCFText)
If ZwAblageText = „777.78“ Then Exit Do
Loop
'weiter im Code

irgendwie nicht die tollste ist, weil der VBCode ständig die Schleife ausführt.

Gibt es eine andere Methode, den VBCode genau dann fortzuetzen, wenn der Text 777.78 in die Zwischenablage kopiert wurde.

Mfg Werner

Hallo Werner,

so wie Du das geschrieben hast, verbraucht das Programm die gesamte Prozessorleistung. Vermeiden kannst Du das mit einem Sleep().

Du kannst auch auf die Rückgabe über die Zwischenablage verzichten und prüfen, ob das Programm noch läuft, Du hast ja das Handle, weil Du das Programm aus Deiner Anwendung startest, ohne es suchen zu müssen.

http://www.activevb.de/tipps/vb6tipps/tipp0148.html

Wahrscheinlich kann man auch von VBA aus in der VB-Anwendung ein Ereignis auslösen, da habe ich aber keine Ahnung wie.

Gruß, Rainer

Hallo
Dein Do Loop kannst Du vergessen.
Selbst wenn Du ein DoEvents mit reinnimmst, ist der Prozessor ständig mit 100% belasted.
Sleep(0) ist etwa dasselbe wie DoEvents.
Richtig wäre das erstellen eines Zwischenablageprograms. Dafür muß man unter anderem einen Callback registrieren und die Nachrichten weitergeben, soweit ich mich erinnere.
Möglich wäre auch eine andere Art der „IPC-interprocess communication“.
Mit SendMessage von Window zu Window kann z.B. eine Nachricht stattfinden.
Statt der Windows-Zwischenablage kann dann auch mittels der WM_COPY(?) Nachricht direkt von Anwendung zu Anwendung kopiert werden.
Das Windows Handle der Zielanwendung könnte z.B. in der Registry gespeichert oder müßte gesucht werden.
In einer VB-exe eine Addresse zu exportieren, so das man sie aufrufen könnte, so wie in einer dll, geht leider nicht.
DDE ist etwas kompliziert und ich hab keine Ahnung davon.
Ich weiß nur nicht, ob man in VBA dasselbe machen kann, wie in VB5(hab ich). Außerdem brauchst Du das SDK bzw. MSDN, oder Beispiele aus dem Internet könnten auch gehen.
MfG
Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo nochmal

Do
ZwAblageText = Clipboard.GetText(vbCFText)
If ZwAblageText = „777.78“ Then Exit Do
Loop
'weiter im Code

Es gäbe noch eine weitere Lösung, wenn es denn einfach sein soll:
Schreib einen Timerintervall für z.B. 1 Sekunden.
Wenn z.B. Timer1 aufgerufen wird, schaltet er sich zunächst selbst ab und führt Code aus.
Timer1.enabled = False
In diesem Code fragst Du das Clipboardformat ab und wenn ok, dann Dein

ZwAblageText = Clipboard.GetText(vbCFText)
If ZwAblageText = „777.78“ Then …

Das hat den Vorteil, das nur alle 1 Sekunden der Inhalt der Zwischenablage abgefragt wird.
Es geht auch Sleep().
Aber handelt es sich um einen großen Inhalt in der Zwischenablage, dann gibt es keine Möglichkeit, ein komplettes Laden zu verhindern, und der Rechner rödelt unnötig. Als Ergänzung zu dieser einfacheren Methode bietet sich an, das VB-Programm mit einer Option zu aktivieren oder zu deaktivieren.
Dann gibst noch die Möglichkeit, ein eigenes Format zu registrieren, um aufgrund des Formates reagieren zu können. Du kannst ja trotzdem Text reinschreiben.
Ein eigenes Format kannst Du aber normalerweise nicht mit VB selbst sondern nur mit API-calls öffnen.
MfG
Matthias