Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

erweiterung VBA Befehl

Begonnen von Dorian-1965, April 19, 2023, 12:28:11

⏪ vorheriges - nächstes ⏩

Dorian-1965

Hallo!

Ich habe einen VBA Befehl der einen gespeicherten Link im Explorer öffnet:

---
Private Sub Link_oeffnen_Click()
If Not IsNull(Me!Link_PC) Then
Application.FollowHyperlink Me!Link_PC
 Else
        MsgBox "Bitte zuerst einen Link einfügen!", vbInformation, ""
End If
End Sub

---

Diesen möchte ich erweitern:

1. Alle Deiteien in dem Ordner makieren
2. Befehl: "senden an" ausführen
3. Applikation: "Team Viewer"

Frage:

geht soetwas?

Vielen Dank

Dorian

Dorian-1965

#1
Guten Morgen.
Ich bin schon etwas weiter gekommen.

Private Sub Link_oeffnen_Click()
If Not IsNull(Me!Link_PC) Then
Application.FollowHyperlink Me!Link_PC
Shell "Explorer.exe , vbNormalFocus"
SendKeys "^(a)"
SendKeys "^+{F10}"
Sleep 250
SendKeys "s"
SendKeys "1"
SendKeys "(%{F4})"
SendKeys "{NUMLOCK}", True
 Else
        MsgBox "Bitte zuerst einen Link einfügen!", vbInformation, ""
End If
End Sub

jetzt klappts....
Aber es öffnet sich immer noch zusätzlich ein Explorer Fenster mit "Dieser PC"
Wie kann ich das noch ändern?


markusxy

Zitat von: Dorian-1965 am April 24, 2023, 11:06:32Aber es öffnet sich immer noch zusätzlich ein Explorer Fenster mit "Dieser PC"

Weil du den Explorer zweifach öffnest:

Zitat von: Dorian-1965 am April 24, 2023, 11:06:32Application.FollowHyperlink Me!Link_PC
Shell "Explorer.exe , vbNormalFocus"

Grundsätzlich ist so eine Art des Programmierens hochproblematisch, da nicht sauber dafür gesorgt wird, dass Sendkeys beim richtigen Empfänger landet und Sleep Befehle ... Ziemlich Dirty das Ganze. Da gibt es viele Bruchstellen, wo was daneben gehen kann - denn es kann viele Gründe geben, warum ein Vorgang unterschiedlich lange dauern kann und dann funktioniert der Code überhaupt nicht mehr, oder es wird irgend etwas anderes an die Anwendung geschickt.  :o.

Dorian-1965

Zuerst mal danke für die Antwort.

Wenn ich dies: "Shell "Explorer.exe , vbNormalFocus""
weglasse funktioniert der Befehl nicht mehr. Es wird nur der Hyperlink geöffnet.

markusxy

Zitat von: Dorian-1965 am April 24, 2023, 14:00:21Wenn ich dies: "Shell "Explorer.exe , vbNormalFocus""
weglasse funktioniert der Befehl nicht mehr. Es wird nur der Hyperlink geöffnet.

Ursprünglich hast du doch folgendes geschrieben:
Zitat von: Dorian-1965 am April 19, 2023, 12:28:11Ich habe einen VBA Befehl der einen gespeicherten Link im Explorer öffnet:

---
Private Sub Link_oeffnen_Click()
If Not IsNull(Me!Link_PC) Then
Application.FollowHyperlink Me!Link_PC
 ...

Wie passen diese Aussagen zusammen?
So wie du geschrieben hast, muss man davon ausgehen, dass Me!Link_PC einen Pfad beinhaltet und folglich durch FollowHyperlink der Explorer geöffnet wird und damit der Explorer doppelt geöffnet wird, weil der Shell Befehl den Explorer ein weiteres mal öffnet.

Dorian-1965

Ja, stimmt. Es sind Links die auf dem PC und sie sollen geöffnet werden.
Wenn ich aber dies: "Shell "Explorer.exe , vbNormalFocus""
weglasse wird nur der Link im Explorer geöffnet.
Die sendkeys werden dann nicht mehr ausgeführt.
Ich weiß leider keine Lösung. Die send Key Befehle habe ich durch Google gefunden.  :o

markusxy

Zitat von: Dorian-1965 am April 24, 2023, 14:52:22Die sendkeys werden dann nicht mehr ausgeführt.

SendKeys wird immer ausgeführt.
Auf das Problem habe ich dich ja bereits hingewiesen - du ignorierst das aber.
Sauber ist es so:

Man verwendet entweder Shell mit korrektem Pfad oder FollowHyperlink.
Dann ermittelt man den exakten Zeitpunkt, wann das Fenster bereit ist eine Eingabe zu empfangen und setzt den Focus auf das Fenster. Dann kann man Steuerzeichen an das Fenster schicken.
Soweit sollte die Umsetzung problemlos möglich sein.

Beim zweiten Teil, dem Senden der Steuerzeichen ist die zweite Bruchstelle.
Man kann das natürlich ohne jede Prüfung durchführen, und ist auch vollkommen aufgeschmissen, wenn sich am Menü etwas ändert. 



Dorian-1965

Also ist bis hier:
Private Sub Link_oeffnen_Click()
If Not IsNull(Me!Link_PC) Then
Application.FollowHyperlink Me!Link_PC

alles richtig!?

Dann den Focus auf das geöffnete Fenster setzen.

"Objekt.Setfocus"

Dann reichen bei mir 0,25 Sekunden Wartezeit

Anschließend die sendkeys Anweisungen, richtig?

markusxy

Du kannst es versuchen.
Ich persönlich würde wie mehrfach erwähnt nicht so arbeiten.
Mein Ansatz geht via Windows API Programmierung. Das ist etwas aufwändiger, da man sich erstmal damit auseinandersetzen muss was im Hintergrund für Formular Klassen im Einsatz sind.
Der Benefit daraus: es geht so performant, dass man vom Explorer und der Menüauswahl gar nichts mitkriegt, weil die Befehle umgesetzt sind bevor Explorer und Menü Popups vollständig sichtbar werden.
Wenn dann normale Windows Menü Klassen im Einsatz sind, müssen diese auch nicht aufgerufen werden, da man das mittels Befehl auslösen kann.
Lösungen mit Access Boardmittel sind nicht meins.

Dorian-1965

OK, trotzdem danke für das feedback