Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何从路径中提取文件名?_String_Vba - Fatal编程技术网

String 如何从路径中提取文件名?

String 如何从路径中提取文件名?,string,vba,String,Vba,如何从VBA中的C:\Documents\myfile.pdf中提取文件名myfile.pdf 函数GetFilenameFromPath(ByVal strPath作为字符串)作为字符串 '返回字符串最右边的字符,最多不包括最右边的'\' 例如,“c:\winnt\win.ini”返回“win.ini” 如果右$(strPath,1)“\”和Len(strPath)>0,则 GetFilenameFromPath=GetFilenameFromPath(左$(strPath,Len(strPa

如何从VBA中的
C:\Documents\myfile.pdf
中提取文件名
myfile.pdf

函数GetFilenameFromPath(ByVal strPath作为字符串)作为字符串
'返回字符串最右边的字符,最多不包括最右边的'\'
例如,“c:\winnt\win.ini”返回“win.ini”
如果右$(strPath,1)“\”和Len(strPath)>0,则
GetFilenameFromPath=GetFilenameFromPath(左$(strPath,Len(strPath)-1))+右$(strPath,1)
如果结束
端函数

在VBA for Office 2000/2003中处理文件和目录的最佳方法是使用脚本库

创建一个文件系统对象并使用它执行所有操作

早期绑定:

Function FunctionGetFileName(FullPath As String) As String
'Update 20140210
Dim splitList As Variant
splitList = VBA.Split(FullPath, "\")
FunctionGetFileName = splitList(UBound(splitList, 1))
End Function
添加对Microsoft脚本运行时的引用(IDE中的工具>引用)

(有关更多信息,请参阅评论)

FileSystemObject
很棒。它提供了许多功能,如获取特殊文件夹(我的文档等)、以面向对象的方式创建、移动、复制、删除文件和目录

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

将返回文件名,但仅当文件名存在时返回。

在excel宏中获取文件名的步骤是:

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

如果您想要一个更健壮的解决方案,该解决方案将为您提供完整文件夹的路径和文件名,请参阅:

Dim strFileName作为字符串,strFolderPath作为字符串
暗指数和长指数一样
Dim strPath()作为字符串
strPath()=Split(OpenArgs,“\”)将路径的部分放入数组中
lngIndex=UBound(strPath)
strFileName=strPath(lngIndex)'从数组中获取文件名
strPath(lngIndex)=''从数组中删除文件名
strFolderPath=Join(strPath,“\”)从数组重建路径
或作为子/功能:

Private Sub separatePantHandFile(ByRef io_strFolderPath作为字符串,ByRef o_strFileName作为字符串)
Dim strPath()作为字符串
暗指数和长指数一样
strPath()=Split(io\u strFolderPath,“\”)将路径的各个部分放入一个数组中
lngIndex=UBound(strPath)
o_strFileName=strPath(lngIndex)'从数组中获取文件名
strPath(lngIndex)=''从数组中删除文件名
io_strFolderPath=Join(strPath,“\”)从数组重建路径
端接头

将第一个参数与文件的完整路径一起传递,它将被设置为文件夹的路径,而第二个参数将被设置为文件的名称。

这里有一个没有代码的替代解决方案。此VBA在Excel公式栏中工作:

Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
要提取文件名,请执行以下操作:

=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))))

我需要的是路径,不是文件名

因此,要提取代码中的文件路径:

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

我已经通读了所有的答案,我想再添加一个我认为因为简单而胜出的答案。与公认的答案不同,这不需要递归。它也不需要引用FileSystemObject

Function FileNameFromPath(strFullPath As String) As String

    FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, "\"))

End Function

具有此代码和其他函数,用于解析文件路径、扩展名甚至不带扩展名的文件名。

下面是我编写的一个简单VBA解决方案,可用于Windows、Unix、Mac和URL路径。

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

sFolderName = Left(sPath, Len(sPath) - Len(sFileName))
=MID(A1,FIND("*",SUBSTITUTE(A1,"\","*",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
您可以使用以下代码测试输出:

'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

另请参见:

这是从Twiggy@和其他地方收集的:

'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 fileName, filePath As String
filePath = "C:\Documents\myfile.pdf"
fileName = Dir(filePath)
如果您不确定文件是否存在,或者只想从给定路径提取文件名,最简单的方法是:

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

我真不敢相信这些答案有多么复杂。。。(无意冒犯!)

这里有一个单行函数,可以完成任务:


x:\path\filename:**“>


x:\path\filename:**“>


示例:

函数文件\名称\仅(文件\路径为字符串)为字符串 变光温度 temp=Split(文件路径,Application.PathSeparator) 文件名仅=temp(UBound(temp)) 端函数
  • 在这里,您可以将文件名作为函数的输入
  • VBA的split函数使用“\”作为路径分隔符将路径拆分为不同的部分,并将其存储在名为“temp”的数组中
  • UBound()查找数组的最大项数,最后将结果分配给“file\u name\u only”函数

  • 希望这会有帮助。

    我正在使用此功能。。。 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.
    
    或者您可以使用这些…

    sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)
    
    sFolderName = Left(sPath, Len(sPath) - Len(sFileName))
    
    =MID(A1,FIND("*",SUBSTITUTE(A1,"\","*",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
    

    没错,但如果你在Mac电脑上呢?不幸的是,这不是一个跨平台的解决方案。那么它在windows上就坏了,对吗?我已经找到了使用
    Application.PathSeparator
    的方法,但不幸的是,在OSX上,VBA甚至以旧的
    -符号返回路径。我必须编写一个函数来转换这些路径。这是可行的,但不需要递归,特别是对于VBA(它不会自动将尾部递归转换为循环)。由Zen编写的IMHO是一个更好的答案。代码重用,没有递归,没有嵌入常量。@ThomasFankhauser这是一个老评论,但我很困惑:为什么你会期望一个跨平台的解决方案?(加上当前用户在Mac上)在Excel VBA中,
    Dim文件名作为字符串;以Dim-fso为对象;设置fso=CreateObject(“Scripting.FileSystemObject”);fileName=fso.GetFilename(路径)警告,如果出现“用户定义类型未定义”错误,则需要设置对VB脚本运行时库的引用。加载VB编辑器(ALT+F11),从下拉菜单中选择工具>引用,并从可用引用列表中勾选“Microsoft脚本运行时”旁边的复选框,然后单击确定。这不是一个好的解决方案:它需要VBA的依赖外部。代码不能在所有VBA环境下工作。@Skrol29世界上每个Windows框都包含该库。没什么好担心的。接受的答案在Mac上也不起作用。系统性地延迟绑定脚本运行时的人不知道他们在做什么
    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
    
    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))