如何在excel vba宏中拆分字符串忽略最后一部分

如何在excel vba宏中拆分字符串忽略最后一部分,vba,excel,Vba,Excel,我有一个包含路径值的单元格,如: C:/Videos/New/VideoName.mp4 我只想走那间牢房的路 所以我试过了 elementArray = Split(Cells(4, 2), "/") 这样我每次都可以连接数组中的字符串 但阵列仍具有完整路径 i、 e 如何可以忽略文件名而单独使用路径?请阅读对该问题的评论 我建议使用and函数而不是Split: Dim s As String, f As String s = "C:\Videos\New\VideoName.mp4"

我有一个包含路径值的单元格,如:

C:/Videos/New/VideoName.mp4
我只想走那间牢房的路

所以我试过了

elementArray = Split(Cells(4, 2), "/")
这样我每次都可以连接数组中的字符串

但阵列仍具有完整路径

i、 e

如何可以忽略文件名而单独使用路径?

请阅读对该问题的评论

我建议使用and函数而不是
Split

Dim s As String, f As String

s = "C:\Videos\New\VideoName.mp4"
f = StrReverse(s)
'FileName
'f = Left(f, InStr(1, f, "\") - 1)
'Path
f = Right(f, InStr(1, f, "\"))
f = StrReverse(f)
MsgBox f

'returns: VideoName.mp4 or path - read above comments

对于是否使用和/或需要正斜杠(例如
/
Chr(47)
)或反斜杠(例如
\
Chr(92)
),似乎存在一些混淆。试着这样做:

dim sPath as string, sFullPath as string
sFullPath = "C:/Videos/New/VideoName.mp4"   ' or C:\Videos\New\VideoName.mp4
if len(sFullPath) > len(replace(sFullPath, Chr(47), vbnullstring)) then
    sPath = replace(sFullPath, split(sFullPath, Chr(47))(ubound(split(sFullPath, Chr(47)))), vbnullstring)
    debug.print sPath & " with forward slashes"
elseif len(sFullPath) > len(replace(sFullPath, Chr(92), vbnullstring)) then
    sPath = replace(sFullPath, split(sFullPath, Chr(92))(ubound(split(sFullPath, Chr(92)))), vbnullstring)
    debug.print sPath & " with back-slashes"
else
    debug.print "unknown separator"
end if

查看VBE的即时窗口(Ctrl+G)以查看结果。

为了避免任何问题,我将使用
FileSystemObject
GetParentFolderName()
方法,通过添加引用
Microsoft脚本运行时
可以访问该方法

Dim fso As New FileSystemObject
parentFolder = fso.GetParentFolderName("your path")
或者在后期绑定中,正如@SOofWXLS所建议的那样(这样可以避免将库早期绑定到项目中):


我认为这是通过完整路径解析父文件夹的最简单、最健壮的方法:您可以避免复杂的字符串操作,这些操作可能会导致一些“不太常见”的情况分离(例如,Mac的路径不会通过“手动”方法解析)。

您可以使用
instrev()
函数:

With Cells(4, 2)
    MsgBox Mid(.Value, 1, InStrRev(.Value, "\") - 1)
End With

您的示例和拆分代码使用正斜杠(例如Chr(47))。通常,路径(本地和网络)使用反斜杠(例如Chr(92))。URL和URI使用前斜杠。@Jeeped极好的观察结果!:)不知道我是怎么错过的。在由内置方法管理的案例中,还存在使用正向斜杠和反向斜杠来分隔路径的错误。在我看来,如果可能的话,总是更喜欢内置的,它们不仅速度更快,而且特别依赖于开发团队的工作,他们肯定考虑了所有可能的情况。@mattero我在使用FileSystemObject时遇到一个错误,它说“用户类型未定义”@vignesh从VBE您需要转到工具/引用,然后添加库Microsoft Scripting Runtime,该类在其中定义是否也值得显示后期绑定方法?虽然这让我很难过,但我不认为很多vba用户在设计时使用早期绑定。我认为使用
InStrRev
更有意义;)。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
parentFolder = fso.GetParentFolderName("your path")
With Cells(4, 2)
    MsgBox Mid(.Value, 1, InStrRev(.Value, "\") - 1)
End With