Symptoom

  • U wilt vanuit een Office-programma een ander programma kunnen aanroepen, eventueel met daarin een bestand getoond.

Remedie

Een oplossing is opdracht ShellExecute. Dit is een opdracht uit de Windows SDK, opgenomen in Shell32.dll, die u in VBA kunt gebruiken. Maak een macro in de VBA-editor waarin u de opdracht definieert. Gebruik de macro bijvoorbeeld in een knop in een Access-database of in een dia in een PowerPoint-presentatie.

Verdieping

ShellExecute kent meerdere parameters en het geeft een waarde terug, die kan worden afgevangen om eventuele fouten op te sporen.

De syntaxis van de opdracht is
RetVal = ShellExecute(<startvenster>, “open | print”, “<volledig pad naar programma>”, “<argumenten>”, “<uitvoeren in map>”, <uitvoer>)

Gebruik voor de waarde startvenster 0 om een programma vanuit het actuele venster aan te roepen. Met de tweede waarde geeft u aan of u een bestand wilt openen of afdrukken.
Let op dat de volgende drie parameters altijd tussen dubbele aanhalingstekens moeten staan. Op die manier kunt u ook spaties in pad- of bestandnamen opnemen.
Met de laatste parameter geeft u aan hoe het programmavenster wordt getoond:

0 verberg het venster en geef de activering aan een ander venster door.
1 activeer en toon een venster. Als het venster is geminimaliseerd of gemaximaliseerd, herstelt Windows de oorspronkelijke grootte en positie (gelijk aan 9).
2 activeer een venster en geef dit als pictogram weer.
3 activeer een venster en maximaliseer dit.
4 toon de meest recente grootte en positie van het venster. Het venster dat op dit moment actief is, blijft actief.
5 activeer een venster en toon de actuele grootte en positie.
6 minimaliseer het opgegeven venster en activeer het bovenste venster in de systeemlijst.
7 toont een venster als pictogram. Het actieve venster blijft actief.
8 toont de actuele staat van een venster. Het actieve venster blijft actief.
9 gelijk aan 1.

Ga als volgt te werk om een macro met ShellExecute te maken:

  1. Druk op [Alt]+[F11] om het venster van Visual Basic Editor te tonen.
  2. Open het menu Invoegen en kies Module. Een leeg modulevenster verschijnt.
  3. Voeg de declaraties toe voor de verschillende parameters en de code om ShellExecute uit te voeren. In het onderstaande voorbeeld wordt Kladblok gemaximaliseerd weergegeven met daarin de inhoud van een tekst die in de map Temp op schijf C: staat (deze tekst moet al bestaan, anders vraagt het programma de eerste keer of het een tekst in de betreffende map met de betreffende naam moet maken):
Const SW_SHOWMAXIMIZED = 3

    Public Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _
      (ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long

    Sub ProgUitvoeren()
      Dim RetVal As Long
      On Error Resume Next
      RetVal = ShellExecute(0, "open", "C:\Windows\System32\notepad.exe", "C:\temp\demo.txt", _
                            "", SW_SHOWMAXIMIZED)
    End Sub

Test de macro door op [F5] te drukken. Als u de module al gesloten hebt, verschijnt een venster met macro’s waarin u de nieuwe macro selecteert. Als resultaat moet Kladblok verschijnen.