Как извлечь имя файла из пути?

38

Как извлечь имя файла myfile.pdf из C:\Documents\myfile.pdf в VBA?

  • 0
    Попробуйте использовать функцию split, чтобы получить имя файла по пути: ссылка на MSDN
Теги:
string

14 ответов

34
Лучший ответ

Это взято из snippets.dzone.com:

Function GetFilenameFromPath(ByVal strPath As String) As String
' Returns the rightmost characters of a string upto but not including the rightmost '\'
' e.g. '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
  • 1
    Правильно, но что если вы на Mac? К сожалению, это не кроссплатформенное решение.
  • 3
    Просто замените \ в коде на /.
Показать ещё 5 комментариев
92

Лучший способ работы с файлами и каталогами в VBA для Office 2000/2003 - использовать библиотеку скриптов. Добавьте ссылку на Microsoft Scripting Runtime (Инструменты > Ссылки в среде IDE).

Создайте объект файловой системы и выполните все операции с этим.

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

FileSystemObject отлично. Он предлагает множество функций, таких как получение специальных папок (Мои документы и т.д.), Создание, перемещение, копирование, удаление файлов и каталогов объектно-ориентированным способом. Проверьте это.

  • 15
    Этот ответ превосходит принятый ответ на милю.
  • 7
    В Excel VBA Dim fileName As String; Dim fso as Object; Set fso = CreateObject("Scripting.FileSystemObject"); fileName = fso.GetFilename(path);
Показать ещё 5 комментариев
36
Dir("C:\Documents\myfile.pdf")

вернет имя файла, но только если оно существует.

  • 1
    +1 за "очень короткий"
  • 3
    Плохо, потому что предполагает, что путь указан для физического файла, который может прочитать программа.
Показать ещё 4 комментария
19

Я прочитал все ответы, и я хотел бы добавить еще один, который, я думаю, выигрывает из-за его простоты. В отличие от принятого ответа это не требует рекурсии. Он также не требует ссылки на 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/ имеет этот код плюс другие функции для разбора пути файла, расширения и даже имени файла без расширения.

  • 1
    Лучшее для меня: умное, короткое и делает для бездорожья.
  • 2
    +1 для простоты - может даже отказаться от функции и использовать строку "=" как есть или в цикле для нескольких файлов.
Показать ещё 1 комментарий
9
Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
  • 0
    Не такой умный, потому что он запускается дважды Split(sFilePath, "\") .
3

Чтобы получить имя файла в макросе excel:

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

Самый простой подход, если вы уверены, что файл физически существует на диске:

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

Если вы не уверены в существовании файла или просто хотите извлечь имя файла из заданного пути, тогда самый простой способ:

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

Здесь простое решение VBA, которое я написал, работает с путями Windows, Unix, Mac и URL.

sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)

sFolderName = Left(sPath, Len(sPath) - Len(sFileName))

Вы можете проверить результат с помощью этого кода:

'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

Также см.: Википедия - Путь (вычисление)

2

Если вам требуется более надежное решение, которое даст вам полный путь к папке И имя файла, вот оно:

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

Или как суб/функция:

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

Вы передаете первый параметр с полным путем к файлу, и он будет установлен в путь к папке, а второй параметр будет установлен на имя файла.

2

Попробуйте использовать функцию split, чтобы получить имя файла из пути: Ссылка MSDN

1
Dim nme As String = My.Computer.FileSystem.GetFileInfo(pathFicheiro).Name
Dim dirc As String = My.Computer.FileSystem.GetFileInfo(nomeFicheiro).Directory
  • 0
    Хотя ваш ответ может сработать на вопрос, не могли бы вы добавить объяснение того, что делает?
  • 0
    Это лучшее решение. Он извлекает имя файла и каталог из указанного пути pathFicheiro. Нет необходимости в nomeFicheiro, так как вы можете просто использовать pathFicheiro. переменная pathFicheiro = FILENAME
Показать ещё 1 комментарий
1

Здесь альтернативное решение без кода. Этот VBA работает в строке формул Excel:

Чтобы извлечь имя файла:

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

Чтобы извлечь путь к файлу:

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

Это почерпнуто из Twiggy @http://archive.atomicmpc.com.au и других мест:

'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
0

Мне нужен был путь, а не имя файла.

Итак, чтобы извлечь путь к файлу в коде:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню