WinAPI verwendet Dinge wie Fenstergriffe (Sie haben hWnd
im Code vorher gesehen?), Um ein bestimmtes Fenster zu zielen. Sobald Sie dies haben, können Sie Nachrichten an dieses Fenster senden und empfangen, ungeachtet dessen Fensterstatus (aktiv/inaktiv) usw.
Sie arbeiten direkt mit dem Objekt, das ist die Art, wie Programmierung sein sollte.
Die Methode SendKeys()
emuliert nur einen Benutzer, der auf einer Tastatur Tasten drückt, unabhängig davon, welches Fenster geöffnet ist und wo - so sendet er die Ausgabe natürlich an welches Objekt auch immer aktiv ist und es empfangen kann.
Ein anderer Weg, um darüber nachzudenken
Wenn Sie einen Wert in einer Zelle auf einem bestimmten Blatt in VBA zu platzieren sind Codierung Sie Folgendes tun:
Range("A1").Value = "Foo"
Das ist alles gut und gut, aber es geht davon aus, dass das Blatt, das wir wollen, das aktive Blatt zu diesem Zeitpunkt ist. Ist dies nicht der Fall, wird stattdessen die falsche Zelle auf dem falschen Blatt ausgefüllt. Dies ist effektiv, was Sie mit SendKeys()
Diesem auf der anderen Seite tun:
Workbooks("Target Workbook.xlsx").Sheets("Target Sheet").Range("A1").Value = "Foo"
Gibt die genaue Zelle, in dem genauen Blatt, genau in der Arbeitsmappe, die wir ansprechen möchten - also wenn das Blatt ist zu diesem Zeitpunkt nicht aktiv dann keine Sorgen! Es geht immer noch an der richtigen Stelle (dies ist eine Art, was Sie mit API tun)
Ein Wort der Vorsicht
mit WinAPI in VBA Spielen kann riskant sein, wenn Sie Ich weiß nicht, was Sie tun - der Code für diese Methoden ist in einer externen Bibliothek vorkompiliert, was bedeutet, dass Ihr VBE-Fehlerhandler keinen Nutzen hat. Wenn Sie einen Fehler mit der API machen, laufen Sie Gefahr, Ihre Arbeitsmappe zu beschädigen (oder schlimmer, je nachdem, was Sie gerade tun).
Sie müssen auch die bedingte Kompilierung in VBA betrachten, da Sie Funktionen und Parameter abhängig davon, ob Sie eine 32-Bit- oder 64-Bit-Version verwenden, unterschiedlich deklarieren müssen.
SendKeys ist unzuverlässig, weil es den Befehl buchstäblich an das aktive Fenster sendet, und es ist nicht immer möglich, zu garantieren, dass das das beabsichtigte Fenster ist. – ojf
Also, für API ist es egal, welches Fenster aktiv ist? – Sun
Korrigieren. Es ist nur [Schlüsselstriche senden] (https://msdn.microsoft.com/en-us/library/office/ff821075.aspx) (wie von @ojf erklärt). Und nun stellen Sie sich vor, dass Ihr Excel-Code läuft und jemand versucht, während des Programmablaufs etwas zu durchsuchen, indem er die Tasten drückt und das aktive Fenster in einen Browser ändert. – Ralph