También hay otro sistema de llamar archivos de programas instalados, acá hay un ejemplo llamando Word:
Public Const MAX_FILENAME_LEN = 260
Public Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
Public Function Encuentra_Ejecutable(sfile As String) As String
Dim i As Integer, s2 As String
'Check if the file exists
If sfile = "" Then
Encuentra_Ejecutable = ""
Exit Function
End If
'Create a buffer
s2 = String(MAX_FILENAME_LEN, 32)
'MsgBox s2
'Retrieve the name and handle of the executable, associated with this file
'MsgBox sfile
i = FindExecutable(sfile, vbNullString, s2)
'MsgBox i
If i > 32 Then
Encuentra_Ejecutable = Left$(s2, InStr(s2, Chr$(0)) - 1)
Else
Encuentra_Ejecutable = ""
End If
End Function
Lo único que debes hacer es realizar la llamada:
ruta = Encuentra_Ejecutable(<fichero a ejecutar>)