ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)

【本日のミッション】

ファイルのフルパス

「C:\VBA\第1階層\第2階層1\第3階層1\File31_1.xlsx

から InStrRev関数 を使用して、ファイル名部分の「File31_1.xlsx」のみを取得せよ。

色々なデータを扱っていると、こういう場面によく出くわします。

パス名・・・長いねん!!

どんだけ深い階層までフォルダ作っちゃってるの!!

ここでは、「InStrRev関数」という関数を使用してファイル名を取り出す方法をご紹介します。

(Split関数を使用する場合:ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA))

長いパス、頭から見ると長くてややこしいテキストですが、おしりから見てください。

C:\VBA\第1階層\第2階層1\第3階層1\File31_1.xlsx

ファイル名の前には、必ず「\」が入っています。

パスの中で一番最後に出現する「\」を利用してファイル名を取得しましょう!!

Sub フルパスからファイル名のみ取得()
    '【変数】
    Dim Pt As String  'ファイルパス
    Dim fn As String  'ファイル名
    Dim Pos As Long         '「¥」の位置
    
    '■ファイル名の取得
    Pt = "C:¥VBA¥第1階層¥第2階層1¥第3階層1¥File31_1.xlsx"     'ファイルパス指定
    Pos = InStrRev(Pt, "¥")       '最後尾の「¥」の前からの文字数「24」
    fn = Mid(Pt, Pos + 1)   'ファイル名
    MsgBox fn

End Sub

「フルパスからファイル名のみ取得」プロシージャのどこかにカーソルを置いてF5キーをクリックしてください。

ファイル名だけが取得できましたね♪

■InStrRev関数

InstrRev関数は、検索対象となる文字列(String1)の中から検索する文字列(String2)を最後から検索し、 最初に見つかった文字位置(先頭からの文字数)を返します。

InstrRev (String1, String2 [, Start] [, Compare])

引数名 説明 省略
String1 検索対象となる文字列を指定します。 ×
String2 引数 String1 内で検索する文字列を指定します。 ×
Start 文字列の検索を開始する位置を指定します。
省略した場合は、文字列の最後から検索を開始します。
Compare 文字列比較の比較モードを指定する数値を設定します。

InStrRev(Pt, “¥”)

検索対象となる文字列(String1)は変数「Pt」にセットした

C:¥VBA¥第1階層¥第2階層1¥第3階層1¥File31_1.xlsx

検索する文字列(String2)は

¥

です。

引数「START」は省略して、上記の説明の通り文字列の最後から検索を開始しています。

文字列の最後から検索して、一番最初に見つかった「\」は、下記赤字部分になります。

C:¥VBA¥第1階層¥第2階層1¥第3階層1¥File31_1.xlsx

↑フルパス名の頭の「C」から数えて「\」は24文字目。

その「24」が変数「Pos」に入ります。

■Mid関数

Mid関数は、ある文字列(String)の任意の位置(Start)から指定した文字数分(Length)の文字列を返します。

Mid (String , Start [, Length])

引数名 説明 省略
String 文字列を取り出す、元の文字列式を指定します。 ×
Start 引数 String の先頭の位置を 1 として、どの位置から文字列を取り出すかを先頭からの文字数で指定します。 Start が String の文字数を超える場合、Mid 関数は長さ 0 の文字列 (“”) を返します。 ×
Length 取り出す文字数を指定します。
省略した場合、または文字列内に Length より短い文字数しかない場合には、Start から後の全ての文字を返します。

Mid(Pt, Pos + 1)

引数「String」には、ファイルのフルパスを入れた変数「Pt」を入れます。

引数「Start」には・・・

C:¥VBA¥第1階層¥第2階層1¥第3階層1¥File31_1.xlsx

ファイル名となる「File31_1.xlsx」の「F」の文字位置が「¥」の1つ右側なので

Pos + 1

とします。

引数「Length」は省略して、引数「Start」から後ろの文字を全部取得しましょう。

これでファイル名「File31_1.xlsx」のみ取り出すことができます(#^.^#)

【参考】
指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
Callステートメントとは
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)

■スポンサーリンク

■ランキングに参加しています。
↓このブログを気に入っていただけましたら、ポチッとお願いします。
にほんブログ村 IT技術ブログへ
にほんブログ村