Como o Excel pode abrir o arquivo VBA usando o aplicativo padrão

Eu quero uma planilha do Excel que tenha um caminho de arquivo e nome na coluna A. Quando uma macro é executada, digamos que o arquivo especificado em A1 deve ser aberto na máquina do usuário. O arquivo poderia ser .doc, .xls, .txt, etc …. ao invés de meu vba precisar saber o caminho completo para o aplicativo, como eu poderia ter o vba dizer à máquina “por favor abra este arquivo e use seu aplicativo associado à extensão “?

Eu já achei isso para trabalhar com o caminho completo:

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

como eu poderia fazê-lo funcionar com algo como:

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

Agradeço antecipadamente!

Isso funciona para mim no Excel e Word

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

ou … como por o comentário de Expenzor abaixo

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

A Microsoft tem um tutorial útil aqui .

Parafraseando, algo como o código abaixo. No entanto, você pode querer atualizar o diretório padrão (em funcionamento) para o local do arquivo.

 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 

O comando Shell do VBA quer um exe, então eu iniciei o explorer.exe e passei o caminho do meu arquivo como um argumento. Ele também parece funcionar com atalhos * .lnk e URLs da web.

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

Shell32.Shell object Shell32.Shell COM, também conhecido como Shell.Application pode ser usado para encapsular a function ShellExecute Win32 API:

  • Adicionar uma referência à biblioteca de tipos de Microsoft Shell Controls And Automation para o projeto do VBA por meio de Tools->References... , em seguida,

     Dim a As New Shell32.Shell Call a.ShellExecute("desktop.ini") 
  • Como alternativa, sem referências:

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

Curiosamente, aqui (WinXP), ao usar uma variável tipificada (que fornece autocomplete), ShellExecute está faltando na lista de membros (mas funciona, no entanto).