Mit Excel VBA Makro Anwendungen fernsteuern und Eingaben automatisieren

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.
 


Index

    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
 


Vorbereitungen

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.


1. Einfache Warteschleife

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 🙂


2. Programme öffnen

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.


4. Tastatureingaben mit VBA

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.


5. Zwischenablage nutzen

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.


7. Mausklicks ausführen

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.