¿Cómo puede Excel VBA abrir el archivo con la aplicación predeterminada?

Quiero una hoja de cálculo de Excel que tenga una ruta de archivo y un nombre en la columna A. Cuando se ejecuta una macro, digamos que el archivo especificado en A1 debe abrirse en la máquina del usuario. El archivo podría ser .doc, .xls, .txt, etc. … en lugar de que mi vba necesitara saber la ruta completa a la aplicación, ¿cómo podría hacer que la vba le diga a la máquina? Abra este archivo y use su aplicación asociado con la extensión “?

Ya he encontrado que esto funciona con la ruta completa:

dblShellReturned = Shell("C:\Windows\System32\notepad.exe myfile.txt, vbNormalFocus) 

¿Cómo puedo hacer que funcione con algo como esto?

 dblShellReturned = Shell("myfile.txt", vbNormalFocus) ' how do I get this to work 

¡Gracias de antemano!

Esto funciona para mí en Excel y Word

 Sub runit() Dim Shex As Object Set Shex = CreateObject("Shell.Application") tgtfile = "C:\Nax\dud.txt" Shex.Open (tgtfile) End Sub 

o … según el comentario de Expenzor a continuación

CreateObject("Shell.Application").Open("C:\Nax\dud.txt")

Microsoft tiene un útil tutorial aquí .

Parafraseando, algo como el siguiente código. Sin embargo, es posible que desee actualizar el directorio predeterminado (de trabajo) a la ubicación del archivo.

 Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpszOp As String, _ ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal LpszDir As String, ByVal FsShowCmd As Long) _ Function StartDoc(DocName As String) As Long Dim Scr_hDC As Long Scr_hDC = GetDesktopWindow() StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _ "", "C:\", SW_SHOWNORMAL) End Function 

El comando de Shell de VBA quiere un exe, así que he estado ejecutando el explorer.exe y pasando mi ruta de archivo como argumento. También parece funcionar con accesos directos * .lnk y direcciones web.

 Shell "explorer.exe C:\myfile.txt" 

Shell32.Shell objeto COM de Shell32.Shell también Shell.Application como Shell.Application se puede usar para Shell.Application la función ShellExecute Win32 API:

  • Agregue una referencia a la biblioteca de tipos de Microsoft Shell Controls And Automation al proyecto VBA a través de Tools->References... , luego

     Dim a As New Shell32.Shell Call a.ShellExecute("desktop.ini") 
  • Alternativamente, sin ninguna referencia:

     Call CreateObject("Shell.Application").ShellExecute("desktop.ini") 

Curiosamente, aquí (WinXP), al usar una variable tipeada (que proporciona autocompletar), ShellExecute falta en la lista de miembros (pero funciona de todos modos).