我是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 。
答案 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,"\")))))
\
答案 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