【本日のミッション】
ファイルのフルパス「 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)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)