Как извлечь имя файла myfile.pdf
из C:\Documents\myfile.pdf
в VBA?
Как извлечь имя файла из пути?
Ответ 1
Это взято из 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
Ответ 2
Лучший способ работы с файлами и каталогами в 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 отлично. Он предлагает множество функций, таких как получение специальных папок (Мои документы и т.д.), Создание, перемещение, копирование, удаление файлов и каталогов объектно-ориентированным способом. Проверьте это.
Ответ 3
Dir("C:\Documents\myfile.pdf")
вернет имя файла, но только если оно существует.
Ответ 4
Я прочитал все ответы, и я хотел бы добавить еще один, который, я думаю, выигрывает из-за его простоты. В отличие от принятого ответа это не требует рекурсии. Он также не требует ссылки на 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/ имеет этот код плюс другие функции для разбора пути файла, расширения и даже имени файла без расширения.
Ответ 5
Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
Ответ 6
Я не могу поверить, насколько усложнены некоторые из этих ответов... (без обид!)
Вот однострочная функция, которая выполнит работу:
Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,"\")+1):End Function
Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,"\")):End Function
Примеры:
Ответ 7
Если вам требуется более надежное решение, которое даст вам полный путь к папке И имя файла, вот оно:
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
Вы передаете первый параметр с полным путем к файлу, и он будет установлен в путь к папке, а второй параметр будет установлен на имя файла.
Ответ 8
Здесь простое решение 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
Также см.: Википедия - Путь (вычисление)
Ответ 9
Чтобы получить имя файла в макросе excel:
filname = Mid(spth, InStrRev(spth, "\", Len(spth)) + 1, Len(spth))
MsgBox Mid(filname, 1, InStr(filname, ".") - 1)
Ответ 10
Самый простой подход, если вы уверены, что файл физически существует на диске:
Dim fileName, filePath As String
filePath = "C:\Documents\myfile.pdf"
fileName = Dir(filePath)
Если вы не уверены в существовании файла или просто хотите извлечь имя файла из заданного пути, тогда самый простой способ:
fileName = Mid(filePath, InStrRev(filePath, "\") + 1)
Ответ 11
Попробуйте использовать функцию split, чтобы получить имя файла из пути: Ссылка MSDN
Ответ 12
Здесь альтернативное решение без кода. Этот 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))))
Ответ 13
Мне нужен был путь, а не имя файла.
Итак, чтобы извлечь путь к файлу в коде:
JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "\")(UBound(Split(sFileP, "\")))))
Ответ 14
Это почерпнуто из 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
Ответ 15
Function file_name_only(file_path As String) As String Dim temp As Variant temp = Split(file_path, Application.PathSeparator) file_name_only = temp(UBound(temp)) End Function
- здесь вы даете имя вашего файла в качестве ввода функции
- функция разбиения VBA разделяет путь на разные части, используя "\" в качестве разделителя пути, и сохраняет их в массиве с именем "temp"
- UBound() находит максимальный номер элемента массива и, наконец, присваивает результат функции "file_name_only"
Надеюсь, это будет полезно.
Ответ 16
Я использую эту функцию... VBA Функция:
Function FunctionGetFileName(FullPath As String) As String
'Update 20140210
Dim splitList As Variant
splitList = VBA.Split(FullPath, "\")
FunctionGetFileName = splitList(UBound(splitList, 1))
End Function
Теперь введите
=FunctionGetFileName(A1) in youe required cell.
или вы можете использовать эти...
=MID(A1,FIND("*",SUBSTITUTE(A1,"\","*",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
Ответ 17
Dim nme As String = My.Computer.FileSystem.GetFileInfo(pathFicheiro).Name
Dim dirc As String = My.Computer.FileSystem.GetFileInfo(nomeFicheiro).Directory