web-dev-qa-db-ja.com

パスからファイル名を抽出する方法は?

VBAでmyfile.pdfからファイル名C:\Documents\myfile.pdfを抽出するにはどうすればよいですか?

52
Johan

これは snippets.dzone.com から取得されます。

Function GetFilenameFromPath(ByVal strPath As String) As String
' Returns the rightmost characters of a string upto but not including the rightmost '\'
' e.g. 'c:\winnt\win.ini' returns 'win.ini'

    If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
        GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
    End If
End Function
39
Gonzalo

Office 2000/2003のVBAでファイルとディレクトリを操作する最良の方法は、スクリプトライブラリを使用することです。 Microsoft Scripting Runtimeへの参照を追加します(IDEの[ツール]> [参照])。

ファイルシステムオブジェクトを作成し、それを使用してすべての操作を実行します。

Dim fso as new FileSystemObject
Dim fileName As String
fileName = fso.GetFileName("c:\any path\file.txt")

FileSystemObjectは素晴らしいです。特別なフォルダー(マイドキュメントなど)の取得、オブジェクト指向の方法でのファイルとディレクトリの作成、移動、コピー、削除など、多くの機能を提供します。見てみな。

120
Zen
Dir("C:\Documents\myfile.pdf")

ファイル名が返されますが、存在する場合のみです。

45
Dick Kusleika

私はすべての答えを読んだので、もう1つ追加したいと思います。その単純さのために、私は勝つと思います。受け入れられた答えとは異なり、これは再帰を必要としません。また、FileSystemObjectを参照する必要もありません。

Function FileNameFromPath(strFullPath As String) As String

    FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, "\"))

End Function

http://vba-tutorial.com/parsing-a-file-string-into-path-filename-and-extension/ には、このコードに加えて、ファイルのパス、拡張子、拡張子のないファイル名でも。

27
user2780436
Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
8
Artur Piwkowski

これらの答えのいくつかがどれほど複雑すぎるか信じられません...(違反はありません!)

これが1行関数です。


**Extract Filename from <code>x:\path\filename</code>:**

Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,"\")+1):End Function

**Extract Path from <code>x:\path\filename</code>:**

Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,"\")):End Function

例:

examples

6
ashleedawg

完全なフォルダーのパスとファイル名の両方を提供するより堅牢なソリューションが必要な場合は、次のとおりです。

Dim strFileName As String, strFolderPath As String
Dim lngIndex As Long
Dim strPath() As String

strPath() = Split(OpenArgs, "\")   'Put the Parts of our path into an array
lngIndex = UBound(strPath)
strFileName = strPath(lngIndex)    'Get the File Name from our array
strPath(lngIndex) = ""             'Remove the File Name from our array
strFolderPath = Join(strPath, "\") 'Rebuild our path from our array

またはサブ/機能として:

Private Sub SeparatePathAndFile(ByRef io_strFolderPath As String, ByRef o_strFileName As String)    
    Dim strPath() As String
    Dim lngIndex As Long

    strPath() = Split(io_strFolderPath, "\")  'Put the Parts of our path into an array
    lngIndex = UBound(strPath)
    o_strFileName = strPath(lngIndex)   'Get the File Name from our array
    strPath(lngIndex) = ""              'Remove the File Name from our array
    io_strFolderPath = Join(strPath, "\")     'Rebuild our path from our array  
End Sub

最初のパラメーターにファイルのフルパスを渡すと、フォルダーのパスに設定され、2番目のパラメーターにはファイルの名前が設定されます。

4
dnLL

これは、Windows、Unix、Mac、およびURLパスで動作する簡単なVBAソリューションです

sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)

sFolderName = Left(sPath, Len(sPath) - Len(sFileName))

次のコードを使用して出力をテストできます。

'Visual Basic for Applications 
http = "https://www.server.com/docs/Letter.txt"
unix = "/home/user/docs/Letter.txt"
dos = "C:\user\docs\Letter.txt"
win = "\\Server01\user\docs\Letter.txt"
blank = ""

sPath = unix 
sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)
sFolderName = Left(sPath, Len(sPath) - Len(sFileName))

Debug.print "Folder: " & sFolderName & " File: " & sFileName

参照: Wikipedia-Path(computing)

4
Roberto

Excelマクロでファイル名を取得するには:

filname = Mid(spth, InStrRev(spth, "\", Len(spth)) + 1, Len(spth))
MsgBox Mid(filname, 1, InStr(filname, ".") - 1)
3
niki

ファイルがディスク上に物理的に存在することが確実な場合の最も簡単なアプローチ:

Dim fileName, filePath As String
filePath = "C:\Documents\myfile.pdf"
fileName = Dir(filePath)

ファイルの存在が不明な場合、または指定されたパスからファイル名を抽出したい場合、最も簡単なアプローチは次のとおりです。

fileName = Mid(filePath, InStrRev(filePath, "\") + 1)
3
ePandit

コードなしの代替ソリューションを次に示します。このVBAはExcelの数式バーで機能します。

ファイル名を抽出するには:

=RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"\","~",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

ファイルパスを抽出するには:

=MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))))
1
live-love

この関数を使用しています... VBA Function:

Function FunctionGetFileName(FullPath As String) As String
'Update 20140210
Dim splitList As Variant
splitList = VBA.Split(FullPath, "\")
FunctionGetFileName = splitList(UBound(splitList, 1))
End Function

今入る

=FunctionGetFileName(A1) in youe required cell.

またはこれらを使用できます...

=MID(A1,FIND("*",SUBSTITUTE(A1,"\","*",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
0
Yasir Majeed

これはTwiggy @ http://archive.atomicmpc.com.a および他の場所から収集したものです。

'since the file name and path were used several times in code
'variables were made public

Public FName As Variant, Filename As String, Path As String

Sub xxx()
   ...
   If Not GetFileName = 1 Then Exit Sub '
   ...
End Sub

Private Function GetFileName()
   GetFileName = 0 'used for error handling at call point in case user cancels
   FName = Application.GetOpenFilename("Ramp log file (*.txt), *.txt")
   If Not VarType(FName) = vbBoolean Then GetFileName = 1 'to assure selection was made
   Filename = Split(FName, "\")(UBound(Split(FName, "\"))) 'results in file name
   Path = Left(FName, InStrRev(FName, "\")) 'results in path
End Function
0
Dan

ファイル名ではなくパスが必要でした。

そのため、コードでファイルパスを抽出するには:

JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "\")(UBound(Split(sFileP, "\"))))) 
0
Doug
 Function file_name_only(file_path As String)As String 
 
 Dim temp As Variant 
 
 temp = Split(file_path、Application.PathSeparator)
 
 file_name_only = temp(UBound(temp))
 
 End Function 
  1. ここで、関数の入力としてファイル名を指定します
  2. vBAのsplit関数は、パス区切り文字として「\」を使用してパスを異なる部分に分割し、「temp」という名前の配列に保存します
  3. uBound()は配列の最大アイテム番号を見つけ、最終的に「file_name_only」関数に結果を割り当てます

これが役に立てば幸いです。

0
mishu36