VBA & System

Betriebssystem, Konsole und Umgebung

Wie jede andere Programmiersprache benötigt und bietet auch VBA Zugang zu Betriebssystem-Funktionen und -Daten. Auf dieser Seite finden sie dazu einige Möglichkeiten und Beispiele.
VBA Visual Basic for Applications
Environ Umgebungs-Daten mit VBA-Funktion Environ
SET Umgebungs-Daten mit Konsolen-Befehl SET
Registry Umgebungs-Daten mit ActiveX-Objekten
Shell Start von Programmen mit VBA-Funktion Shell
AppActivate Anzeige von Fenstern mit VBA-Funktion AppActivate
SendKeys Start von Programmen mit VBA-Funktion SendKeys
Perl Ausführung von Perl-Scripts
*.DLL Verwendung einer Windows-Bibliothek (DLL)
Verwandte Themen Win-Konsole (cmd.exe) - 'Eingabeaufforderung'
System-Umgebung (environment) bei Perl und PHP
System-Befehle mit verschiedenen Programmiersprachen

Umgebungs-Daten mit VBA-Funktion Environ

Jede gängige Programmiersprache bietet die Möglichkeit, die aktuell geltenden Umgebungs-Variablen des Betriebssystems mit einfachen Funktionen zu lesen. VBA bietet dazu die Standard-Funktion Environ. Environ erhält 1 Argument, und zwar entweder den Namen der Umgebungs-Variablen als String oder die fortlaufende Nummer der Variablen als Integer.

Environ (Name)

Das Beispiel rechts ermittelt den aktuellen Wert der Umgebungs-Variablen PATH (VBA unterscheidet nicht von path ).
Die Daten werden in einem Meldungsfenster ausgegeben und an das aufrufende Programm (z.B. Excel oder ein anderes VBA-Programm) zurückgegeben.
Auslösung: Die Funktion wird in dieser Form nur einmal berechnet.
Details zur Auslösung (Trigger) der Neu-Berechnung auf der Seite VBA-Functions.
Function get_env_path() As String
Dim e As String
e = Environ("path")
MsgBox (e)
get_env_path = e
End Sub

Environ (Zahl)

Das Beispiel rechts durchläuft in einer Schleife alle verfügbaren Umgebungs-Variablen und gibt deren Namen und Werte in je einem Meldungsfenster aus.
Die erste Variable ist mit Environ(1) bezeichnet, Environ(0) ergibt einen Fehler.

Dabei findet man je nach System 20..50 Einträge. Die Funktion kann auch mit größeren Zahlen verwendet werden (z.B. Environ(100) ) und liefert dann leere Strings. Daher wird die Länge der erhaltenen Strings zum Abbruch der Schleife verwendet.
Sub env_loop()
Dim i As Integer
Dim e As String
i = 1
While i > 0
e = Environ(i)
If Len(e) > 0 Then
MsgBox (i & ") " & e)
i = i + 1
Else
i = 0
End If
Wend
End Sub
Umgebungs-Variable in anderen Programmiersprachen: C/C++, Perl, PHP  

Umgebungs-Daten mit dem Konsolen-Befehl SET

SET

Der Konsolen-Befehl SET bietet die Möglichkeit, alle oder nur bestimmte aktuelle Umgebungs-Variablen anzuzeigen.
Ohne Argumente werden alle Umgebungs-Variablen angezeigt.
Mit einem Buchstaben als Argument werden alle Variablen angezeigt, deren Name so beginnt.
Mit einem Variablen-Namen als Argument wird nur diese angezeigt.

C:\> set
C:\> set c
C:\> set path

SET mit Ausgabe-Datei

Die Text-Ausgabe jedes Konsolen-Befehls kann mit dem Operator > in die bezeichnete Datei (hier env.txt) umgeleitet werden. Mit Befehl TYPE kann man danach die Ausgabe lesen. Diese Variante kann zur Automatisierung mit VBA verwendet werden.
C:\> set > c:\env.txt
C:\> set c > c:\env.txt
C:\> set path > c:\env.txt
C:\> type c:\env.txt
Funktion Shell
VBA bietet mit der Funktion Shell die Möglichkeit, Programme zu starten. Mit einigen Tricks kann man damit auch Konsolen-Befehle wie SET ausführen und auswerten.

Für die praktische Anwendung muss man leider viele Probleme überwinden.
Details unter Funktion Shell auf dieser Seite.

Umgebungs-Daten aus der Registry-Datenbank

Registry

Win-Systeme verwalten wichtige Daten in der Registry-Datenbank, die leider für normale Programme nicht zugänglich ist. Man benötigt spezielle Programme ( regedit.exe ) oder Funktionen, um an die Daten heranzukommen.
Vorsicht - Eine unbedachte Änderung der Registry-Daten kann irreparable Schäden an Betriebssystem ,Software und Daten anrichten !
Für jeden User ist in der Registry ein eigener Satz von Umgebungs-Variablen vorgesehen:
HKEY_LOCAL_MACHINE | System | ControlSet001 | Session Manager | Environment
Die weiteren Sätze finden sie durch Austausch von ControlSet001 durch ControlSet002, usw.
Bei Anmeldung (Login) wird der Variablen-Satz des betreffenden Users in den Satz CurrentControlSet kopiert. Nur dieser aktuelle Satz enthält daher die aktuell wirksamen Umgebungs-Daten.
VBA ist in der Lage, mit Hilfe von ActiveX auf alle Daten der Registry-Datenbank zuzugreifen.
Dazu wird ein Object der Type WScript.Shell erzeugt, und anschließend der Registry-Schlüssel (key) als String an das Object übergeben.
Die Demo-Funktion registry_read gibt die aus der Registry gelesenen Daten zurück.
VBA-Funktion zum Lesen von Registry-Daten:
Function registry_read(key As String)
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
registry_read = wsh.RegRead(key)
End Function
Die Umgebungs-Daten befinden sich in diesem Schlüssel:
HKEY_LOCAL_MACHINE | System | CurrentControlSet | Session Manager | Environment | Path
Ersetzen sie Path durch die Namen beliebiger anderer Umgebungs-Variablen

Die Registry enthält darüber hinaus noch wesentlich mehr Daten. Das Beispiel get_current_tzoh zeigt, wie man den aktuellen Zeit-Unterschied zwischen der am PC eingestellten Lokalzeit (Zeitzone + Sommerzeit) und der Weltzeit UTC ermitteln kann (hier in Stunden).
Anwendung der Funktion registry_read zum Lesen eines bestimmten Registry-Schlüssels:
Function get_current_tzoh() As Integer
Dim rk As String
rk = "HKEY_LOCAL_MACHINE\SYSTEM\"
rk = rk & "CurrentControlSet\Control\"
rk = rk & "TimeZoneInformation\ActiveTimeBias"
get_current_tzoh = -registry_read(rk) / 60
End Function
Leider gibt es offenbar keine standardisierten Regeln, wo sich bestimmte Registry-Daten zu befinden haben. Die Dokumentation dazu ist eher chaotisch. Viele Hersteller versuchen darüber hinaus, die von ihnen eingetragenen Registry-Daten zu verstecken, zu verschlüsseln, etc.
Das Programm regedit.exe bietet eine Such-Funktion, mit der man seine Registry nach bestimmten Begriffen durchforsten kann.
Im Internet finden sie auf Anfrage tausende Hinweise zu bestimmten Registry-Daten. Kombinieren sie z.B. das Stichwort registry mit ihrem Such-Begriff. Mit geduldiger Suche und etwas Phantasie findet man meist die Namen der gesuchten Registry-Schlüssel.
Allerdings gibt es keine Garantie, dass bestimmte Daten auch in zukünftigen Win-Versionen im gleichen Schlüssel zu finden sind . .
Mit Javascript + VBScript kann man auf ähnliche Weise auf Registry-Daten zugreifen. Das ist allerdings problematisch, da aus Webseiten jeder Zugriff auf Daten des eigenen PC verboten ist.
Wenn sie trotzdem die Ausführung von ActiveX-Objekten durch Webseiten erlauben, dann haben sie damit Zugriff auf ihre gesamten Registry-Daten.

Live-Beispiele dazu finden sie auf der Seite Anwendung von ActiveX.
function registry_read(key) {
var x="";
try{
var axo = new ActiveXObject("WScript.Shell");
var x = axo.RegRead(key);
}
catch(e) {}
return x;
}

VBA-Function Shell

Start eines Programms
Diese Funktion ruft ein beliebiges ausführbares Programm auf.
Dazu zählen Konsolen Script-Programme (*.cmd,*.bat), Script-Programme von Programmiersprachen wie Perl oder PHP (*.pl,*.php), sowie alle binären Programme (*.com,*.exe).
Start des Taschenrechners mit VBA:
Sub start_calc()
Dim pid As Long
pid = Shell("calc.exe", 1)
End Sub
Die Funktion Shell erhält 1-2 Argumente
Pfad zum ausführbaren Programm als String, z.B. c:\test.cmd
Wenn sich ein Programm in einem durch die Umgebungs-Variable PATH bezeichneten Pfad befindet, dann kann die Angabe des Pfades wegfallen, z.B. calc.exe
Fenster-Stil (optional). Details dazu in der Original VBA-Hilfe.
Die Funktion gibt die Prozess-Nummer (PID) des ausgeführten Programms zurück. Diese wird allerdings auf Windows-Systemen nur selten verwendet.

Die VBA Funktion Shell ist ähnlichen Funktionen moderner Programmiersprachen wie Perl oder PHP sowie von Cygwin weit unterlegen. Verwenden sie Shell daher nur in Hilfsprogrammen für Access, Excel oder Word.
Details zur Ausführung von Konsolen-Befehlen mit Programmiersprachen.

Übergabe von Argumenten

An das aufgerufene Programm lassen sich auch Argumente übergeben.
Im Beispiel wird der Pfad zu einer Text-Datei an den Editor übergeben, der die Datei öffnet und anzeigt.
Anzeige einer Text-Datei mit dem Editor:
Sub start_editor()
Dim pid As Long
Dim arg As String
arg = "notepad.exe"
arg = arg & " C:\demo.txt"
pid = Shell(arg, 1)
End Sub

Ausführung von System-Befehlen und Auswertung der Text-Ausgabe

Die VBA Funktion Shell arbeitet nur dann problemlos, wenn man das Ergebnis (Ausgabe-Text) nicht benötigt.
Für die Anwendung von Konsolen-Befehlen (dir, ipconfig, ping, qprocess ...) ist das jedoch fast immer notwendig.
In diesem Fall müssen einige Tricks angewendet werden.

Details zu Windows Konsolen-Script-Programmen.

Einschränkungen

Leider sind offenbar einige Tricks notwendig, um die Ausgabe von Konsolen-Befehlen mit VBA auszuwerten:
Die Ausgabe kann nicht an VBA weitergeleitet werden.
Shell kann nur ausführbare Programme (*.com,*.exe) starten. Core-Befehle wie DIR können nicht verwendet werden.
Die Shell-Funktion kann die Ausgabe nicht umleiten.
Shell arbeitet asynchron: Das VBA Programm wird fortgesetzt, ohne das Ergebnis des Konsolen-Befehls abzuwarten. Das VBA-Programm muss daher vor dem Lesen der Ausgabe Text-Datei prüfen, ob diese bereits erstellt und gespeichert wurde.
Im Ausgabe-Text sind die Sonderzeichen (Umlaute) DOS-codiert. Zur Anzeige in einem Windows-Programm müssen diese Zeichen in ANSI-Code übersetzt werden.
Hilfsprogramm cmd.exe
Das Programm cmd.exe ("Eingabeaufforderung") ist ein ausführbares Programm, das keinen Einschränkungen unterliegt: Es kann auch Core-Befehle ausführen und seinen Ausgabe-Text an eine Datei umleiten.
Bei Verwendung durch VBA muss die Option /C gesetzt werden.
Der gewünschte Konsolen-Befehl wird zusammen mit allfälligen Argumenten an das Programm cmd.exe zur Ausführung übergeben. Zusätzlich wird der Ausgabe-Text mit dem Operator > in eine Text-Datei umgeleitet.
Der gesamte an cmd.exe zu übergebende Befehlstext muss in "" gesetzt werden. Nur so werden die enthaltenen Leerzeichen richtig interpretiert.

Nachteil: Dieses umständliche Verfahren dauert ziemlich lange (je nach Befehl einige 1/10 Sekunden). Außerdem muss das VBA Programm danach noch die erzeugte Text-Datei lesen, um den Ausgabe-Text auszuwerten.
Anwendung des Hilfsprogramms mit der VBA Funktion Shell:
Der eigentlich auszuführende Befehl (z.B. DIR) wird "verpackt"
Vor dem Befehl kommt der Pfad zum Hilfsprogramm (und seine Option /C). Dieses ist daher das "ausführbare Programm" des Shell-Befehls
Nach dem Befehl kommen allfällige Argumente, die an den Befehl übergeben werden sollen (genauso wie in der Kommandozeile bei manueller Ausführung)
Zuletzt kommt der Umleitungs-Operator > und die Angabe des Pfades zu jener Text-Datei, welche den Ausgabe-Text speichern soll.
Beispiel für die Anwendung:
C:\> cmd.exe /C "dir > c:\tmp.dat"
Diese Variante arbeitet gleich wie der Befehl
C:> dir > c:\tmp.dat
Das Ergebnis wird in beiden Fällen so angezeigt:
C:> type c:\tmp.dat
Unterschied:
Nur die erste Variante (Umweg über das ausführbare Programm) funktioniert auch mit der VBA Shell-Funktion.

Details zur komplizierten Syntax des Programms erhalten sie mit
C:\> cmd.exe /?

Beispiel

Rechts ein einfaches "quick & dirty" Beispiel für die Verwendung eines Konsolen-Befehls mit VBA.
Voraussetzungen:
Sie sind berechtigt, eine Datei in jenem Pfad zu speichern, der in tmp angegeben ist.
Das VBA-Sub TmpFileRead (nächster Absatz) ist im gleichen VBA-Modul verfügbar.
Befehl: Ersetzen sie den Befehl in cmd durch beliebige andere Befehle, z.B. fsutil fsinfo drives
Der gesamte Befehlstext wird in "" gesetzt. Jedes " Zeichen (hier: rot markiert) wird in einem VBA String durch 2 aufeinander folgende "" Zeichen definiert.
Wartezeit: Das Programm wartet 1 Sekunde vor dem Versuch, die Text-Datei mit der Ausgabe zu lesen. Das genügt für einfache Befehle, ist jedoch für Befehle wie ping zu kurz !
Details zu VBA @ Datum & Zeit
Ausführung eines Konsolen-Befehls mit VBA-Funktion Shell und einigen Tricks:
Sub shell_demo()
Dim pid As Long
Dim tim As Double
Dim cmd, scmd, tmp As String
tmp = "c:\temp.dat"
cmd = "dir"
scmd = "cmd.exe /C """ & cmd
scmd = scmd & " > " & tmp & """"
' erzeugt in scmd diesen Wert:
' cmd.exe /C "dir > c:\temp.dat"
pid = Shell(scmd, 0)
tim = Now + TimeValue("00:00:01")
Application.OnTime tim, "TmpFileRead"
End Sub
Rechts das stark vereinfachte Beispiel eines VBA-Programms zum Lesen jener temporären Text-Datei, die durch das Beispiel oben erzeugt wurde.

Das VBA Programm liest den Inhalt der mit tmp angegebenen Text-Datei zeilenweise und gibt ihn in einem Alarmfenster aus.

Löschen sie die temporäre Text-Datei vor jeder neuen Anwendung, damit nicht unabsichtlich eine bereits vorher vorhandene Version der Datei gelesen wird.

Erweitern sie das Programm mit einem ErrorHandler, (On Error) der ausgeführt wird, wenn beim Lesen der Datei ein Fehler auftritt.
Sub TmpFileRead()
Dim fn As Integer
Dim strin, strout, tmp As String
tmp = "c:\temp.dat"
strout = ""
fn = FreeFile
Open tmp For Input As #fn
While (Not EOF(fn))
Line Input #fn, strin
strout = strout& strin & vbCrLf
Wend
MsgBox strout
Close #fn
End Sub

Leave No Trace !

Dieses Motto verlangt, bei Besuchen in der Natur keine Spuren zu hinterlassen.
Es lässt sich auch für den Gebrauch der Konsole cmd.exe anwenden: Jede mit Funktion Shell geöffnete Instanz des Programms wird bei korrekter Anwendung (Option /C) wieder geschlossen.
Kontrolle
der laufenden Prozesse:
C:\> qprocess
In der Liste sollte cmd.exe nur 1-2mal vorkommen. Wenn das Programm unsauber verwendet wurde, dann häufen sich hier dutzende inaktive Einträge von cmd.exe an, die den Speicher ihres PC langsam verstopfen.
Beenden sie die überflüssigen Programmmit dem TaskManager taskmgr.exe oder mit einem System-Neustart.

VBA-Anweisung AppActivate

Diese Anweisung aktiviert ein Fenster, d.h. dieses Fenster erhält den 'Fokus', es wird 'ganz nach vorne' gebracht.
Sie hat jedoch keinen Einfluss darauf, wie das adressierte Fenster dargestellt wird - dieses kann daher auch minimiert und daher nicht direkt sichtbar sein.
Das 'aktivierte Fenster' wird unter den geöffneten Fenstern gesucht, ansonsten neu geöffnet. Zur Suche dient die Beschriftung am oberen Fenster-Rand. Sie enthält meistens den Datei-Namen und / oder den Programm-Namen, bei dieser Webseite vermutlich den Status-Text 'PS-Trainer'.
Beispiel 1:
Erzeugen sie eine Text-Datei und speichern sie die Datei, z.B. mit dem Namen test.txt
Öffnen sie die Datei mit dem Editor - Das Fenster sollte oben sowohl mit dem Datei-Namen als auch mit dem Programm-Namen beschriftet sein.
Starten sie das VBA-Beispiel - Das Text-Fenster wird angezeigt, d.h. nach vorne gebracht.
Anzeige eines Fensters, dessen Titel test.txt enthält.
Sub aa_test_1()
Dim t As String
t = "test.txt"
AppActivate (t)
End Sub
Das funktioniert mit jedem Fenster dieses Namens, d.h. unabhängig davon, mit welchem Programm die Datei geöffnet wurde. Der Datei-Name wird unbedingt benötigt. Wenn ihn ein Programm nicht in der obersten Titelzeile des Fensters anzeigt, funktioniert AppActivate nicht.
Beispiel 2:
Dieses Beispiel orientiert sich am Programm-Namen und arbeitet unabhängig von der gerade damit geöffneten Datei.

Wenn mehrere zutreffende Fenster geöffnet sind, dann sollten sie diese Anweisung besser nicht verwenden.
Anzeige eines Fensters, dessen Titel Editor enthält.
Sub aa_test_2()
Dim t As String
t = "Editor"
AppActivate (t)
End Sub

PID als Argument

Jedes laufende Programm erhält vom Betriebssystem eine laufende Nummer, die PID.
AppActivate verwendet wahlweise an Stelle eines Textes die PID als Argument
Diese Methode hat gegenüber dem Fenster-Text den Vorteil der Eindeutigkeit.
Man kann AppActivate vorteilhaft mit VBA-Funktion Shell vebinden, da diese Funktion die PID zurückgibt.
Anzeige eines Fensters, das mit Funktion Shell geöffnet wurde:
Sub aa_test3()
Dim pid As Long
pid = Shell("notepad.exe c:test.txt", 1)
AppActivate pid
End Sub

VBA-Anweisung SendKeys

Diese Anweisung sendet 'Tastatur-Zeichen' an ein geöffnetes Fenster. Das ist langsam, meist auch recht unsicher, aber in manchen Fällen die einzige Möglichkeit, ein (anderes) Programm mit VBA zu steuern. Die Methode wird selten dazu verwendet, richtige Texte zu senden, meistens werden 'Tastaturkürzel' und Funktionstasten simuliert.

Testen sie zuerst durch manuelle Bedienung der Tastatur, ob sich ein Programm so steuern lässt wie gewünscht.
Dabei darf die Maus nicht verwendet werden. Notieren sie alle erforderlichen Zeichen, Kontrollzeichen, Funktionstasten etc.
Die Pfeil-Tasten können zwar verwendet werden, darauf sollte jedoch möglichst verzichtet werden: Solche Lösungen müssen bei jeder (Versions)-Änderung des Ziel-Programms erneut getestet werden, da Änderungen in der Anordnung von Menüpunkten, Optionslisten etc. relativ häufig erfolgen.
Jede manuell eingegebene Tasten-Folge kann durch SendKeys ersetzt werden. Das Ziel-Programm kann zwischen manuell auf der Tastatur eingetippten Befehlen und mit SendKeys erzeugten nicht unterscheiden.

Tastatur-Zeichen werden in jedem Fall (!) nur an das oberste geöffnete Fenster gesendet ( = das Fenster mit dem 'Fokus'). Daher ist es besonders wichtig, das richtige Fenster zu aktivieren, bevor mit SendKeys Anweisungen erteilt werden.
Details dazu auf dieser Seite im Kapitel AppActivate.

Die relativ aufwändige Syntax (Codierung der verschiedenen Tasten und -Kombinationen) finden sie in der VBA-Hilfe zu SendKeys
Beispiel:
Hier wird das Editor-Programm notepad.exe gesteuert:
Zunächst wird damit eine bestehende Datei c:\test.txt mit Shell geöffnet und mit AppActivate nach vorne gebracht.

In die offene Datei wird die aktuelle Zeit als String im Standard-Format ISO-8601 geschrieben Da die Einfüge-Marke nach dem Öffnen am Anfang der Datei steht, wird die neueste Zeit immer in die erste Zeile geschrieben.

Danach wird die Datei mit Strg+S gespeichert und das Fenster mit Alt+F4 geschlossen.

Der gesamte Vorgang läuft auf üblichen PC so rasch ab, dass man am PC-Monitor nur ein Zucken bemerkt, aber keine Details verfolgen kann.

Funktion time_iso erzeugt einen String der aktuellen System-Zeit und dient hier nur zur Demonstration des Beispiels.
Details zu Datum & Zeit in VBA und zum Standard ISO-8601

Sub sk_test()
Dim pid As Long
Dim iso As String
pid = Shell("notepad.exe c:\test.txt", 1)
AppActivate pid
iso = time_iso()
SendKeys iso & "{ENTER}", True
' Strg+S -> Speichern
SendKeys "^s", True
' Alt+F4 -> Schließen
SendKeys "%{F4}", True
End Sub

Function time_iso() As String
Dim t As Double
Dim iso As String
t = Time
iso = Right("00" & Hour(t), 2)
iso = iso & ":" & Right("00" & Minute(t), 2)
iso = iso & ":" & Right("00" & Second(t), 2)
time_iso = iso
End Function

Verwendung von Perl- oder PHP-Scripts

Perl und PHP sind Script-Programmiersprachen. Beide sind u.a. zur professionellen System-Verwaltung hervorragend geeignet. Perl und PHP sind nicht an eine Plattform gebunden und arbeiten mit allen gängigen Betriebssystemen.
In der Folge werden nur mehr Perl-Scripts erwähnt, weil sie häufiger als Konsolen-Scripts werden. Unabhängig davon bietet PHP unegfähr die gleichen Möglichkeiten.
Beide Programmiersprachen sind kostenlos aus dem Internet erhältlich, und Standard-Bestandteil jeder Linux-Distribution.
Details zu Perl auf Win-Systemen, Entwicklung von Perl-Scripts, PHP als Commandline Interpreter (CLI)
Perl und PHP haben als moderne Programmiersprachen ungleich mehr Möglichkeiten als z.B. der völlig veraltete Commandline-Interpreter cmd.exe
Die Kommunikation der Scripts untereinander und mit anderen Programmen erfolgt am besten durch Daten in gewöhnlichen Text-Dateien - Das ist z.B. in Linux üblich.
Bei Verwendung von Perl- oder PHP-Scripts sind VBA-Programme zur System-Verwaltung eigentlich überflüssig. Sie lassen sich darüber hinaus weitgehend System-unabhängig programmieren, sie können daher meistens mit wenigen Änderungen sowohl auf Linux als auch auf Windows eingesetzt werden. Perl bietet zusätzlich einige ausschließlich Win-spezifische Funktionen (z.B. Zugang zur Registry-Datenbank). Die dafür notwendigen Bibliotheken sind in jeder Perl-Version für Windows enthalten bzw. können für PHP kostenlos aus dem Internet geladen werden.

Start von Perl-Scripts

Voraussetzung: Perl installiert und getestet (Perl auf Windows). Auf allen gängigen Linux-Systemen ist Perl bereits fertig instralliert.

Perl-Scripts werden vom Perl-Interpreter Programm (auf Win perl.exe ) ausgeführt.
Erstellen sie z.B. ein winziges Perl-Script in der Datei C:\test.pl und tragen sie diesen Text ein (vergessen sie nicht auf den abschließenden Strichpunkt)
print "Hier ist Perl\n";

Öffnen sie eine Windows-Konsole cmd.exe und tragen sie ein
perl c:\test.pl
Wenn Perl nicht ganz korrekt installiert wurde, müssen sie evtl. den Pfad zu Perl genau angeben, z.B.
c:\programme\perl\bin\perl.exe c:\test.pl
Sie sollte eine Ausgabe des Begrüßungs-Textes erhalten.

Wenn das funktioniert, dann kann jedes Perl-Script auch von einem VBA-Programm gestartet werden, z.B. mit der VBA-Funktion Shell:
Sub perl_test()
Dim p As String
Dim pid As Long
p = "perl.exe c:\tree_processor.pl"
pid = Shell(p, 1)
AppActivate pid
End Sub
Das angeführte Demo-Beispiel tree_processor.pl finden sie auf der Seite Verzeichnis-Baum @ Perl dieses Webs. Es summiert Anzahl und Dateigröße ausgewählter Dateien.

Daten-Austausch mit Perl-Scripts

Verschiedene Methoden stehen zur Verfügung: Hier werden nur jene angeführt, die auf allen Betriebssystemen funktionieren, und damit auch in 'gemischten' Netzwerken (Linux + Windows) und über das Internet.

Argumente

Perl-Scripts können bei ihrem Aufruf beliebig viele Argumente erhalten, so ähnlich wie Functions oder Subs in VBA. Verwenden sie diese Methode, wenn nur wenige (<10) Argumente zu übergeben sind.
Übergabe von Argumenten an Perl-Scripts

Text-Dateien

sind ideal zum Austausch und zum (temporären) Speichern von Daten geeignet. Jede Programmiersprache und darüber hinaus viele andere Programme können Text-Dateien lesen und schreiben. Verwenden sie diese Methode, wenn die Daten von mehreren Programmen verwendet werden sollen, oder wenn die Anzahl der Daten größer ist (<1MB).
Zugriff auf Text-Dateien mit Perl, PHP und VBA

Datenbanken

sind geeignet, besonders große Daten-Mengen flexibel zu verwalten. Alle modernen Programmiersprachen können mit SQL-Datenbank-Servern arbeiten, natürlich auch Perl oder PHP.
MySQL Datenbank Server auf Windows (WAMP)

Dynamische Bibliotheken *.dll

Man findet im Internet zahlreiche VBA-Lösungen mit Hilfe von dynamischen Bibliotheken wie z.B. advapi32.dll
Sie befinden sich meistens hier
C:\Windows\System32\*.dll
Allen bisher gefundenen Beispielen dieser Art ist gemeinsam, dass sie
- vergleichsweise aufwändig zu programmieren sind
- meist schlecht dokumentiert sind
- stark abhängig von der jeweiligen Version des Systems und der DLL sind.
Daher wird auf die Vorstellung solcher Beispiele in diesem Rahmen verzichtet.
Sie finden Programme und Hinweise durch Kombination von Stichworten wie vba, registry, advapi32 usw.