Como extrair o nome do arquivo do caminho?

Como faço para extrair o nome do arquivo myfile.pdf de C:\Documents\myfile.pdf no VBA?

Isto é retirado do snippets.dzone.com :

 Function GetFilenameFromPath(ByVal strPath As String) As String ' Returns the rightmost characters of a string upto but not including the rightmost '\' ' eg 'c:\winnt\win.ini' returns 'win.ini' If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1) End If End Function 

A melhor maneira de trabalhar com arquivos e diretórios no VBA para o Office 2000/2003 é usar a biblioteca de scripts. Adicione uma referência ao Microsoft Scripting Runtime (Ferramentas> Referências no IDE).

Crie um object do sistema de arquivos e faça todas as operações usando isso.

 Dim fso as new FileSystemObject Dim fileName As String fileName = fso.GetFileName("c:\any path\file.txt") 

O FileSystemObject é ótimo. Ele oferece vários resources, como obter pastas especiais (Meus documentos, etc), criar, mover, copiar, excluir arquivos e diretórios de uma maneira orientada a objects. Confira.

 Dir("C:\Documents\myfile.pdf") 

retornará o nome do arquivo, mas somente se existir.

Eu li todas as respostas e gostaria de adicionar mais uma que eu acho que ganha por causa de sua simplicidade. Ao contrário da resposta aceita, isso não requer recursion. Também não requer referência a um FileSystemObject.

 Function FileNameFromPath(strFullPath As String) As String FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, "\")) End Function 

http://vba-tutorial.com/parsing-a-file-string-into-path-filename-and-extension/ tem este código mais outras funções para analisar o caminho do arquivo, a extensão e até mesmo o nome do arquivo sem a extensão.

 Dim sFilePath$, sFileName$ sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\"))) 

Se você quer uma solução mais robusta que lhe dará o caminho completo da pasta E o nome do arquivo, aqui está:

 Dim strFileName As String, strFolderPath As String Dim lngIndex As Long Dim strPath() As String strPath() = Split(OpenArgs, "\") 'Put the Parts of our path into an array lngIndex = UBound(strPath) strFileName = strPath(lngIndex) 'Get the File Name from our array strPath(lngIndex) = "" 'Remove the File Name from our array strFolderPath = Join(strPath, "\") 'Rebuild our path from our array 

Ou como sub / function:

 Private Sub SeparatePathAndFile(ByRef io_strFolderPath As String, ByRef o_strFileName As String) Dim strPath() As String Dim lngIndex As Long strPath() = Split(io_strFolderPath, "\") 'Put the Parts of our path into an array lngIndex = UBound(strPath) o_strFileName = strPath(lngIndex) 'Get the File Name from our array strPath(lngIndex) = "" 'Remove the File Name from our array io_strFolderPath = Join(strPath, "\") 'Rebuild our path from our array End Sub 

Você passa o primeiro parâmetro com o caminho completo do arquivo e ele será definido para o caminho da pasta, enquanto o segundo parâmetro será definido para o nome do arquivo.

Para obter o nome do arquivo em uma macro do Excel é:

 filname = Mid(spth, InStrRev(spth, "\", Len(spth)) + 1, Len(spth)) MsgBox Mid(filname, 1, InStr(filname, ".") - 1) 

Aqui está uma solução VBA simples que eu escrevi que funciona com caminhos Windows, Unix, Mac e URL.

 sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1) sFolderName = Left(sPath, Len(sPath) - Len(sFileName)) 

Você pode testar a saída usando este código:

 'Visual Basic for Applications http = "https://www.server.com/docs/Letter.txt" unix = "/home/user/docs/Letter.txt" dos = "C:\user\docs\Letter.txt" win = "\\Server01\user\docs\Letter.txt" blank = "" sPath = unix sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1) sFolderName = Left(sPath, Len(sPath) - Len(sFileName)) Debug.print "Folder: " & sFolderName & " File: " & sFileName 

Veja também: Wikipedia – Path (computação)

A abordagem mais simples se você tiver certeza de que o arquivo existe fisicamente no disco:

 Dim fileName, filePath As String filePath = "C:\Documents\myfile.pdf" fileName = Dir(filePath) 

Se você não tem certeza sobre a existência de um arquivo ou apenas deseja extrair um nome de arquivo de um determinado caminho, a abordagem mais simples é:

 fileName = Mid(filePath, InStrRev(filePath, "\") + 1) 

Eu não posso acreditar o quão complicadas algumas dessas respostas são … (sem ofensa!)

Aqui está uma function de linha única que fará o trabalho:


** Extrair nome de arquivo de <code/> x: \ path \ filename : **”></p>
<pre> <code>Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,


** Extraia o caminho de <code/> x: \ path \ filename : **”></p>
<pre> <code>Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,


Exemplos:

exemplos

Aqui está uma solução alternativa sem código. Este VBA funciona na barra de fórmulas do Excel:

Para extrair o nome do arquivo:

 =RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"\","~",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))) 

Para extrair o caminho do arquivo:

 =MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1)))) 

Eu precisava do caminho, não do nome do arquivo.

Então, para extrair o caminho do arquivo no código:

 JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "\")(UBound(Split(sFileP, "\"))))) 

Este recolhido de Twiggy @ http://archive.atomicmpc.com.au e outros lugares:

 'since the file name and path were used several times in code 'variables were made public Public FName As Variant, Filename As String, Path As String Sub xxx() ... If Not GetFileName = 1 Then Exit Sub ' ... End Sub Private Function GetFileName() GetFileName = 0 'used for error handling at call point in case user cancels FName = Application.GetOpenFilename("Ramp log file (*.txt), *.txt") If Not VarType(FName) = vbBoolean Then GetFileName = 1 'to assure selection was made Filename = Split(FName, "\")(UBound(Split(FName, "\"))) 'results in file name Path = Left(FName, InStrRev(FName, "\")) 'results in path End Function 
 Dim nme As String = My.Computer.FileSystem.GetFileInfo(pathFicheiro).Name Dim dirc As String = My.Computer.FileSystem.GetFileInfo(nomeFicheiro).Directory