从VBA中的完整文件名提取路径

10

我是VBA的新手,以下是我的代码,但它没有运行,有谁可以帮忙吗?

Dim nPath1() As String
nPath1() = Split(nPath, "\")       

'Declare path as integer
 Dim path As Integer
'Getting array length
 path = UBound(nPath1())
 Dim lastname As String
 'For Loop
 For i = 0 To path-1
     lastname += nPath1(i)+"\"
 Next i

以上代码无法工作;我的路径字符串是Root\zTrash - No longer needed\NOC\NOC,我想要的是Root\zTrash - No longer needed\NOC

5个回答

21

如果你想从路径中仅移除最后一个项目,可以这样做:

Left(nPath, InStrRev(nPath, "\") - 1)
  • InStrRev 函数查找最后一个 \ 出现的位置

  • Left 函数截取该位置之前的字符串

  • 减去 -1 是因为您还想要删除最后一个 \


2
如果你喜欢冗长的公式,这是另一个选择:
left(nPath,len(nPath)-len(split(nPath,"\")(ubound(split(nPath,"\")))))
  • 想法是通过\进行拆分
  • 然后您可以获取数组中的最后一个值(使用ubound,但需要两次拆分)
  • 然后获取它与整个长度的差
  • 然后将此差作为参数传递到左侧

我喜欢它。但是如果npath="",它会出错,因为split对vbnullstring不友好。不知道它是否比ASH的解决方案更快。 - Patrick Lepelletier
1
喜欢它,也+ :) FYI 通过直接拆分项目删除(即没有vbnullstring问题)发布了对您帖子的后期替代方法 @Vityata - T.M.

2

或者你可以尝试:

Sub sTest1()
 Dim nPath1 As Variant, st As String
 st = "Root\zTrash - No longer needed\NOC\NOC"
 nPath1 = Split(st, "\")
 ReDim Preserve nPath1(UBound(nPath1) - 1)
 st = Join(nPath1, "\")
 Debug.Print st
End Sub

如果您想通过将 1 更改为 2 或 3 等来删除多个项目(而不仅仅是最后一个项目),则此方法非常有用:

Sub sTest2()
 Dim nPath1 As Variant, st As String, n As Long
 st = "Root\zTrash - No longer needed\NOC\NOC"

 For n = 1 To 3
    nPath1 = Split(st, "\")
    ReDim Preserve nPath1(UBound(nPath1) - n)
    Debug.Print Join(nPath1, "\")
 Next

结果:

Root\zTrash - No longer needed\NOC
Root\zTrash - No longer needed
Root

0

使用Filter()和一个Split()操作的方法

除了@Vityata的回答外,我展示了一个数组的替代方案,还可以接受vbNullString作为FullPath参数。

基于相同的思路,让最后一个分隔符消失,这种方法不计算项目长度,而是直接通过Filter(a, a(Ubound(a)), False)删除最后一个项目。

Function getPath(FullPath As String, Optional Delim As String = "\") As String
    Dim a: a = Split(FullPath & "$", Delim)
    getPath = Join(Filter(a, a(UBound(a)), False), Delim)
End Function

关于Split()的附注

在FullPath参数中添加& "$"是必要的,以使最后一个拆分项唯一, 否则它将删除所有NOC标记,而不仅仅是最后一个项目。因此,像这样的示例调用 Debug.Print getPath("Root\zTrash - No longer needed\NOC\NOC")返回所需的结果Root\zTrash - No longer needed\NOC

如果空字符串被拆分,那么不会出现错误,因为零数组边界(即1个项目)"join"到另一个vbNullString


-1

这个

For i = 0 To path-1

给你完整的nPath1数组。如果你想跳过最后一个元素(我不确定你具体想要什么),你应该使用path-2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接