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

时间:2017-02-25 22:59:09

标签: excel vba excel-vba

我是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 - 不再需要\ NOC \ NOC ,我想要的是 Root \ zTrash - 不再需要\ NOC

5 个答案:

答案 0 :(得分:12)

如果您只想删除路径中的最后一项,可以这样做:

Left(nPath, InStrRev(nPath, "\") - 1)
  • InStrRev找到最后一次出现\

    的位置
  • Left截断字符串直到该位置

  • -1是因为您还希望删除最后\

答案 1 :(得分: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

答案 2 :(得分:1)

如果你是长公式的粉丝,这是另一种选择:

left(nPath,len(nPath)-len(split(nPath,"\")(ubound(split(nPath,"\")))))
  • 您的想法是按\
  • 拆分
  • 然后你得到了最后一个值 数组(有ubound,但是你拆分了两次)
  • 然后你得到它和整个长度之间的差异
  • 然后将此差异作为参数
  • 传递给左侧

答案 3 :(得分: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

答案 4 :(得分:-1)

For i = 0 To path-1

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