2016-11-11 385 views
1

我遇到了問題。我已經完成了我的研究並發現可以使用InSTR函數來搜索字符串中的特定字符。InSTR或VBA中的查找功能

我想要做的是從文件路徑中提取文件名。

目前我有

InStr(StrFrom(pName), "\") 

這裏的問題,它返回斜線的第一次出現,在那裏,因爲我想要得到的斜線最後一次出現(這樣我可以用一個「正確」的功能包裹上面的代碼來捕獲文件名)

任何幫助讚賞如何獲得字符串中的最後一個斜槓!

謝謝!

+0

可能重複[檢查一個字符串是否包含另一個字符串](http://stackoverflow.com/questions/15585058/check-if-a-string-contains-another-string) – LimaNightHawk

回答

6

Instr從文本字符串開頭看,InstrRev從另一端開始尋找。

Public Function FileNameOnly(ByVal FileNameAndPath As String) As String 

    FileNameOnly = Mid(FileNameAndPath, InStrRev(FileNameAndPath, "\") + 1, Len(FileNameAndPath)) 

End Function 
+0

謝謝所有 - 我用過關於instrRev +以上邏輯的組合可以得到這個名字:) – Dingo

+0

打算添加'MsgBox CreateObject(「Scripting.FileSystemObject」)。GetFileName(CreateObject(「Scripting.FileSystemObject」)。GetAbsolutePathName(「」 ))作爲一個班輪 - 不是特別有用,但是(調用FileSystemObject兩次)。 :) –

+0

這兩個罰款解決方案,我會添加1)使用'Application.PathSeparator'而不是'「\」'並給它更通用性2)避免雙重FileSystemObject對象'用CreateObject「Scripting.FileSystemObject」)| FileNameOnly = .GetFileName(.GetAbsolutePathName(FileNameAndPath))| End With -' – user3598756

2

考慮:

Sub marine() 
    Dim s As String, ary 
    s = "C:\whatever\sub1\sub2\reallydeep\x.xlsm" 
    ary = Split(s, "\") 
    MsgBox ary(UBound(ary)) 
End Sub 

enter image description here

1

假設StrFrom是一些用戶定義的函數,下面會做你想要什麼:

Dim filename as String 
Dim path as String 

path = StrFrom(pName) 
filename = Mid$(path, InstrRev(path, "\") + 1) 

需要注意的是其更容易作爲InstrRe使用Mid $而不是Right $ v返回字符串左側的字符位置。省略Mid $的最後一個參數將從該位置返回字符串的其餘部分。