Kaum hat man die Überschrift gelesen, kommt einem schon der Gedanke: Warum sollte ich das tun? Es gibt unzählige Programme im Netz, mit denen man Vorgänge automatisieren und andere Programme fernsteuern kann. Bekannter Vertreter dieser Gattung ist AutoIt, aber auch die Suchbegriffe Maus + Tastatur + Makro fördern einiges zu Tage.
Was aber tun, wenn man keins davon zur Verfügung hat. AutoIt verlangt Admin-Rechte für die Installation, und nicht jeder Arbeitgeber steht der Installation oder auch nur der Ausführung fremder Software auf den Firmenrechnern besonders offen gegenüber. Weniger hilfreich sind diese Programme auch dann, wenn Informationen aus einer Excel-Tabelle verarbeitet werden sollen. Und genau an dieser Stelle werden Excel Makros dann schnell wieder interessant, möchte man sich trotz Einschränkungen dennoch die Arbeit erleichtern. Denn die Berechtigungen und Möglichkeiten von VBA sind schon recht beeindruckend und ein etwas genauerer Blick darauf lässt auch erahnen, warum man unbedingt die Ausführung von Makros in Dokumenten unbekannter Herkunft verhindern sollte.
Im folgenden werde ich daher mal ein paar Module vorstellen, mit denen man zumindest ähnliche Ergebnisse wie mit AutoIt erreichen kann.
Vorbereitungen
1. Einfache Warteschleife
2. Programme öffnen
3. Wechseln des aktiven Fensters
4. Tastatureingaben mit VBA
5. Zwischenablage nutzen
6. Den Mauszeiger positionieren
7. Mausklicks ausführen
Abschließende Worte & Download
Eines vor weg… ich verwende noch Office 2003. Ob die vorgestellten Makros auch mit neueren Versionen von Office funktionieren, kann ich nicht beurteilen. Ich komme mit dieser Version gut zurecht und auch mein AG sieht scheinbar keinen Grund für einen Wechsel ^^
Zuerst öffnet man in Excel eine neue Datei. Mit ALT+F11 oder alternativ über Extras => Makro => Visual Basic Editor wechselt man anschließend in selbigen. Um das ganze später übersichtlich zu halten, verwende ich für die einzelnen Programmmodule VBA Module.
Das erste Modul ist für Eingabeverzögerungen nützlich. Nicht jedes Programm kommt damit zurecht, wenn es sämtliche Steuerungsbefehle innerhalb Sekundenbruchteilen verarbeiten soll. Daher hier eine schlicht gehaltene Warteschleife.
Public Sub wait(ByVal zeit As Long) i = Timer Do Loop While Timer <= i + zeit End Sub
Der Übergabewert entspricht Sekunden, die gewartet werden soll. Der Aufruf
Call wait.wait(2)
sorgt für eine Verzögerung von 2 Sekunden.
Der Code-Schnipsel stammt aus einem Makro, welches ich vor Jahren mal zur Massenbeauftragung in einer firmeneigenen Anwendung erstellt habe. Es gibt aber auch elegantere Ansätze, wie ich grad gelesen habe:
Application.Wait (Now + TimeValue("00:00:02"))
Selbes Ergebnis, besserer Code 🙂
Geht wunderbar mit VBA, dazu ist nur ein kleiner Befehl notwendig. Hier am Beispiel vom Windows-Rechner:
Shell "calc"
Schon öffnet sich der Rechner und ist bereit für Eingaben. Man kann hier natürlich auch absolute Pfadangaben eintragen und so beliebige Programme ausführen.
3. Wechseln des aktiven Fensters
Entweder verlässt man sich auf ALT+TAB oder man nutzt eine VBA-Funktion, um ein anderes Fenster anzusteuern. Man benötigt dazu nur einen Befehl und den Titel des Fensters. Ein geöffneter Rechner heißt auch Rechner.
AppActivate "Rechner"
Nachdem der Code ausgeführt wurde, ist der Rechner das aktive Fenster. Das Makro arbeitet im Hintergrund weiter, alle Eingaben erfolgen nun aber im Rechner.
Dies funktioniert aber nur bei Fenstern, die nicht minimiert sind. Im Gegensatz zu ALT+TAB ist AppActivate nicht in der Lage, ein minimiertes Fenster wieder aus der Taskleiste zu holen. Liegt es nur im Hintergrund, ist es aber kein Problem.
Drücke Taste x, bestätige mit Enter.
SendKeys "{x}", True SendKeys "{ENTER}", True
Via Sendkeys man fast alle Tasten der Tastatur senden. Aber leider auch nur fast alle.
Eine Liste aller unterstützten Befehle findet sich in der MSDN Library.
Liegen Daten in Excel vor, die vom Makro verarbeitet und in einer anderen Anwendung eingefügt werden sollen, macht es wenig Sinn, diese Informationen einzeln via SendKeys zu übergeben. Die Nutzung der Zwischenablage bietet sich hier viel eher an.
Public Sub Clipboard(text) Dim oData As New DataObject oData.SetText text oData.PutInClipboard End Sub
Um diese Funktion nutzen zu können, muss zuvor noch ein Verweis auf die Microsoft Forms 2.0 Object Library gesetzt werden. Dazu geht man im VB-Editor auf Extras => Verweise und setzt dort einen Haken bei dem entsprechenden Eintrag. Sollte der Eintrag fehlen, kann man ihn über Durchsuchen.. manuell hinzufügen. Die Bibliothek befindet sich unter %SystemRoot%\system32\FM20.DLL. Anschließend Speichern nicht vergessen.
Falls einem das zu umständlich erscheint, reicht es auch, in der Excel-Tabelle über die Steuerelement-Toolbox einen Button oder ähnliches einzufügen. Dadurch wird die Bibliothek ebenfalls eingebunden.
Am Beispiel eines bereits geöffneten Notepads:
AppActivate "Editor" Call Clipboard.Clipboard("Hier kann beliebieger Text oder ne Variable rein") SendKeys "^{v}", True
Fertig. Der Text sollte nun im Editor stehen.
Grade bei VB-Paradise gesehen, dass das auch auf umgekehrten Wege geht:
Public Function HoleTextVonZwischenablage() As String Dim oData As New DataObject On Error Resume Next oData.GetFromClipboard HoleTextVonZwischenablage = oData.GetText End Function
So kann man auch aus anderen Anwendungen kopierte Informationen direkt mit VBA verarbeiten.
6. Den Mauszeiger positionieren
Diesen Code habe ich vor Jahren mal zusammengesucht. Ursprünglich für ein VB-Projekt gedacht, war er mit leichten Modifikationen auch mit VBA in Excel nutzbar.
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, _ ByVal y As Long) As Long Private Type POINTAPI x As Long y As Long End Type Public Sub MoveMouse(x As Long, y As Long) Dim udtP As POINTAPI udtP.x = CLng(x) udtP.y = CLng(y) SetCursorPos udtP.x, udtP.y End Sub
Mit Hilfe dieser Funktion lässt sich der Mauszeiger frei auf dem Bildschirm positionieren. Die Koordinaten beginnen in der linken, oberen Ecke und werden in Pixel angegeben. Die Positionierung ist somit abhängig von der genutzten Auflösung und nicht beliebig auf andere Rechner übertragbar.
Wie die Positionierung der Maus stammt auch die Funktion für Klicks eigentlich aus einem VP-Projekt. Hier waren ebenfalls leichte Modifikationen fällig, bevor sie die gewünschten Ergebnisse lieferte.
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, _ ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, _ ByVal dwExtraInfo As Long) Private Const MOUSE_LEFT = 0 Private Const MOUSE_MIDDLE = 1 Private Const MOUSE_RIGHT = 2 Public Sub SendClick(ByVal mButton As Long) Const MOUSEEVENTF_LEFTDOWN = &H2 Const MOUSEEVENTF_LEFTUP = &H4 Const MOUSEEVENTF_MIDDLEDOWN = &H20 Const MOUSEEVENTF_MIDDLEUP = &H40 Const MOUSEEVENTF_RIGHTDOWN = &H8 Const MOUSEEVENTF_RIGHTUP = &H10 If (mButton = MOUSE_LEFT) Then Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ElseIf (mButton = MOUSE_MIDDLE) Then Call mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0) Else Call mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0) End If End Sub
In diesem Code werden 3 Möglichkeiten genutzt: Einfacher Klick mit linker, rechter und mittlerer Maustaste. Einen Doppelklick erreicht man durch doppeltes Aufrufen der Funktion, muss daher nicht unbedingt berücksichtigt werden. Wer eine gedrückte Taste simulieren möchte, beispielsweise für Markierungen oder Selektierung von Elementen, muss sich die Funktion entsprechend anpassen.
Abschließende Worte & Download
Man kann von Excel halten, was man will, die Möglichkeiten dieses Programms sind schon beeindruckend. Ich hoffe, diese Tipps helfen dem einen oder anderen weiter und erleichtern die tägliche Arbeit ein wenig.
Hier nochmal eine einfache Beispiel-Datei, damit jeder das bisher vorgestellte auch nachvollziehen und nutzen kann.