【VBAリファレンス】エクセル練習問題URLからファイル名を取得(一番右の指定文字以降を抽出)

スポンサーリンク

### 概要

Excel VBAを活用することで、Web上のURL文字列から特定のファイル名部分を効率的に抽出することが可能です。特に、URLの末尾に位置するファイル名(例: `example.pdf` や `document.xlsx`)は、そのURLの構造を理解し、適切な文字列操作関数を組み合わせることで、VBAプログラムから容易に取得できます。本記事では、「一番右の指定文字以降を抽出」という具体的な要件に基づき、URLからファイル名を取得するVBAコードの作成方法を、実務で役立つアドバイスと共に詳細に解説します。この技術を習得することで、WebスクレイピングやURLリストの管理など、様々な業務の自動化に繋げることができます。

### 詳細解説

URLからファイル名を取得する際、「一番右の指定文字以降を抽出」という要件は、URLの構造を分析することで明確になります。一般的に、Web上のリソースを示すURLは、プロトコル(`http://` や `https://`)、ドメイン名、パス、そしてファイル名といった要素で構成されています。ファイル名は、通常、URLのパスの最後の部分に位置し、その直前にはスラッシュ (`/`) が存在します。したがって、このスラッシュを「指定文字」として捉え、そのスラッシュ以降の文字列を抽出することが、ファイル名を取得する基本的なアプローチとなります。

VBAで文字列操作を行う際には、主に以下の関数が利用されます。

1. **`InStrRev` 関数**: 文字列内で、指定した部分文字列が最後に出現する位置を返します。この関数は、URLのような文字列の末尾から検索したい場合に非常に強力です。例えば、URL文字列 `https://www.example.com/documents/report.pdf` において、スラッシュ (`/`) が最後に出現する位置を `InStrRev` で特定できます。

2. **`Mid` 関数**: 文字列の一部を抽出します。`Mid(文字列, 開始位置, [文字数])` という形式で、指定した開始位置から指定した文字数だけ文字列を取り出します。ファイル名を取得するには、`InStrRev` で見つけたスラッシュの位置の「次」から、文字列の最後までを抽出する必要があります。

3. **`Len` 関数**: 文字列の長さを返します。`Mid` 関数で文字列の最後までを抽出したい場合、`Len` 関数を使って文字列全体の長さを取得し、そこから開始位置までの文字数を計算して指定することができます。

これらの関数を組み合わせることで、目的のファイル名を取得するロジックを構築します。

具体的な手順は以下のようになります。

1. **URL文字列の準備**: 対象となるURLが格納されているセルや変数を用意します。
2. **指定文字(スラッシュ)の位置特定**: `InStrRev` 関数を使用して、URL文字列の末尾から最初に出現するスラッシュ (`/`) の位置を特定します。
3. **ファイル名部分の抽出**: `Mid` 関数を使用して、スラッシュの位置の次の文字から、文字列の末尾までの部分を抽出します。

例えば、URLが `https://www.example.com/images/photo.jpg` である場合を考えます。

* `InStrRev(url, “/”)` は、スラッシュの位置を返します。この例では、`31` が返されるとします(0から始まるインデックスではなく、1から始まる位置を返します)。
* ファイル名を開始する位置は、スラッシュの位置の次、つまり `31 + 1 = 32` となります。
* 文字列の長さは `Len(url)` で取得できます。
* `Mid(url, InStrRev(url, “/”) + 1)` とすることで、スラッシュの次の文字から末尾までが抽出され、`photo.jpg` が得られます。

もし、URLの末尾にスラッシュが存在しない場合(例: `https://www.example.com/documents/`)、`InStrRev` はスラッシュの位置を返しますが、その次の文字から抽出すると空文字列や意図しない結果になる可能性があります。この場合、URLの末尾にスラッシュがないことを確認し、必要に応じて末尾のスラッシュを削除する処理を追加することも検討できます。しかし、一般的にファイル名を取得する目的であれば、末尾のスラッシュはないと仮定して問題ないことが多いです。

また、URLによっては、クエリパラメータ(`?key=value`)やフラグメント識別子(`#section`)が含まれている場合があります。これらの場合、ファイル名はその手前で終わることもあります。例えば、`https://www.example.com/api/data.json?version=1.0` の場合、ファイル名は `data.json` です。このようなケースにも対応するには、スラッシュだけでなく、`?` や `#` といった文字も考慮し、それらの文字が出現する位置も特定した上で、最も右側にある区切り文字(スラッシュ、`?`、`#`)を基点とする必要があります。

それを踏まえた、より堅牢なロジックは以下のようになります。

1. URL文字列を取得します。
2. まず、URLの末尾にスラッシュ (`/`) があるかどうかを確認します。もしあれば、そのスラッシュ以降はファイル名ではないと判断し、そのスラッシュを削除するか、あるいはそのスラッシュの位置を基点としないようにします。
3. 次に、URL文字列の中から、スラッシュ (`/`)、疑問符 (`?`)、ハッシュ記号 (`#`) が最後に出現する位置をそれぞれ `InStrRev` で特定します。
4. これらの位置のうち、最も大きい値(つまり、文字列の末尾に最も近い位置)を「区切り文字の位置」とします。
5. もし、これらの区切り文字が一つも見つからなかった場合(例えば、URLが `example.com` のような形式の場合)、URL全体がファイル名とみなせるか、あるいはエラー処理を行います。
6. 区切り文字が見つかった場合、その区切り文字の位置の次の文字から、文字列の末尾までを `Mid` 関数で抽出します。これがファイル名となります。

この拡張されたロジックを実装することで、より多様なURL形式に対応できるようになります。

### サンプルコード

以下のVBAコードは、指定されたURL文字列から、一番右のスラッシュ (`/`) 以降の文字列(ファイル名と想定される部分)を抽出する例です。

Sub GetFileNameFromUrl()

Dim url As String
Dim fileName As String
Dim lastSlashPos As Long
Dim targetCell As Range

‘ — 設定 —
‘ 処理対象のURLが入力されているセルを指定します。
‘ 例: Sheet1のA1セル
Set targetCell = ThisWorkbook.Sheets(“Sheet1”).Range(“A1”)
‘ —————-

‘ セルからURLを取得
url = Trim(targetCell.Value) ‘ Trim関数で前後の空白を除去

‘ URLが空でないかチェック
If url = “” Then
MsgBox “指定されたセルにURLが入力されていません。”, vbExclamation
Exit Sub
End If

‘ 一番右のスラッシュの位置を検索
‘ InStrRev関数は、文字列の末尾から指定した文字を検索し、その位置を返します。
‘ 1から始まる位置を返します。見つからない場合は0を返します。
lastSlashPos = InStrRev(url, “/”)

‘ スラッシュが見つかった場合
If lastSlashPos > 0 Then
‘ スラッシュの位置の次の文字から、文字列の最後までを抽出します。
‘ Mid関数: Mid(文字列, 開始位置, [文字数])
‘ 文字数を指定しない場合、開始位置から文字列の最後までを抽出します。
fileName = Mid(url, lastSlashPos + 1)
Else
‘ スラッシュが見つからなかった場合(例: “example.com”)
‘ URL全体をファイル名とみなすか、あるいはエラー処理を行うか判断します。
‘ ここでは、URL全体をファイル名として扱います。
fileName = url
End If

‘ 抽出したファイル名を表示(例としてメッセージボックスを使用)
‘ 実際には、別のセルに書き込んだり、変数に格納して利用したりします。
MsgBox “元のURL: ” & url & vbCrLf & “抽出されたファイル名: ” & fileName, vbInformation

‘ 抽出したファイル名を指定したセル(例: B1セル)に書き込む場合
targetCell.Offset(0, 1).Value = fileName ‘ 元のセルの右隣に書き込み

End Sub

‘ — 複数のURLからファイル名を抽出する例 —
Sub GetFileNamesFromUrlList()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim url As String
Dim fileName As String
Dim lastSlashPos As Long

‘ — 設定 —
‘ URLリストが入力されているシートを指定します。
Set ws = ThisWorkbook.Sheets(“Sheet1”)
‘ URLリストの開始行と列を指定します。
Const START_ROW As Long = 1
Const URL_COLUMN As String = “A” ‘ URLがA列にある場合
‘ ファイル名を出力する列を指定します。
Const FILENAME_COLUMN As String = “B” ‘ ファイル名をB列に出力する場合
‘ —————-

‘ URLリストの最終行を取得
lastRow = ws.Cells(ws.Rows.Count, URL_COLUMN).End(xlUp).Row

‘ 最終行が開始行より小さい場合は、データがないと判断
If lastRow < START_ROW Then MsgBox "URLリストが見つかりません。", vbExclamation Exit Sub End If ' ヘッダー行をスキップする場合(必要に応じてSTART_ROWを調整) ' For i = START_ROW + 1 To lastRow ' 各行のURLを処理 For i = START_ROW To lastRow url = Trim(ws.Cells(i, URL_COLUMN).Value) ' 前後の空白を除去 ' URLが空でないかチェック If url <> “” Then
lastSlashPos = InStrRev(url, “/”)

If lastSlashPos > 0 Then
fileName = Mid(url, lastSlashPos + 1)
Else
fileName = url ‘ スラッシュがない場合はURL全体をファイル名とする
End If

‘ 抽出したファイル名を指定列に書き込み
ws.Cells(i, FILENAME_COLUMN).Value = fileName
Else
‘ URLが空の場合は、対応するファイル名セルもクリアする
ws.Cells(i, FILENAME_COLUMN).ClearContents
End If
Next i

MsgBox “ファイル名の抽出が完了しました。”, vbInformation

End Sub

‘ — クエリパラメータやフラグメント識別子を考慮した、より堅牢な例 —
Sub GetFileNameRobust()

Dim url As String
Dim fileName As String
Dim lastSlashPos As Long
Dim lastQueryPos As Long
Dim lastFragmentPos As Long
Dim delimiterPos As Long
Dim targetCell As Range

‘ — 設定 —
Set targetCell = ThisWorkbook.Sheets(“Sheet1”).Range(“A1”)
‘ —————-

url = Trim(targetCell.Value)

If url = “” Then
MsgBox “指定されたセルにURLが入力されていません。”, vbExclamation
Exit Sub
End If

‘ まず、URLの末尾にスラッシュがないか確認し、あればそれを無視する(ファイル名ではないため)
‘ ただし、URLが”/”のみの場合は例外とする
If Right(url, 1) = “/” And Len(url) > 1 Then
url = Left(url, Len(url) – 1)
End If

‘ 各区切り文字の位置を特定
lastSlashPos = InStrRev(url, “/”)
lastQueryPos = InStrRev(url, “?”)
lastFragmentPos = InStrRev(url, “#”)

‘ 最も右側にある区切り文字の位置を決定
delimiterPos = 0
If lastSlashPos > delimiterPos Then delimiterPos = lastSlashPos
If lastQueryPos > delimiterPos Then delimiterPos = lastQueryPos
If lastFragmentPos > delimiterPos Then delimiterPos = lastFragmentPos

‘ 区切り文字が見つかった場合
If delimiterPos > 0 Then
fileName = Mid(url, delimiterPos + 1)
Else
‘ 区切り文字が見つからなかった場合(例: “example.com”)
fileName = url
End If

MsgBox “元のURL: ” & url & vbCrLf & “抽出されたファイル名 (堅牢版): ” & fileName, vbInformation

‘ 抽出したファイル名を指定したセル(例: C1セル)に書き込む場合
targetCell.Offset(0, 2).Value = fileName

End Sub

### 実務アドバイス

1. **エラーハンドリングの重要性**:
実際の業務では、URLの形式は統一されておらず、予期せぬエラーが発生する可能性があります。例えば、URLが空文字列だったり、不正な形式だったりする場合です。`If url = “”` のような基本的なチェックだけでなく、`On Error Resume Next` や `On Error GoTo ErrorHandler` を使用して、例外処理を適切に実装することが推奨されます。これにより、プログラムが途中で停止するのを防ぎ、問題発生時の原因特定を容易にします。

2. **URLの正規化**:
URLには、大文字・小文字の区別、パーセントエンコーディング(例: `%20` はスペース)、末尾のスラッシュの有無など、様々なバリエーションが存在します。ファイル名抽出の前に、URLを一定のルールで正規化することで、より安定した抽出が可能になります。例えば、URLを小文字に統一する、末尾のスラッシュを削除するといった処理です。ただし、ファイル名自体に大文字・小文字が含まれる場合もあるため、正規化の範囲は目的に応じて慎重に決定する必要があります。

3. **区切り文字の多様性への対応**:
前述の通り、URLにはファイル名の後にクエリパラメータ (`?`) やフラグメント識別子 (`#`) が続くことがあります。これらの記号もファイル名を区切るものと見なすべきです。`InStrRev` 関数で `/` だけでなく、`?` や `#` の位置も取得し、その中で最も右側にあるもの(=ファイル名に最も近いもの)を基準として抽出するロジックを実装すると、より多くのケースに対応できます。サンプルコードの `GetFileNameRobust` サブルーチンはこの対応例です。

4. **パフォーマンスの考慮**:
大量のURLリストを処理する場合、ループ処理のパフォーマンスが重要になります。
* **`ScreenUpdating` と `Calculation`**: VBAコードの実行中は、画面の更新やExcelの自動計算を一時的に無効にすることで、処理速度を大幅に向上させることができます。コードの先頭で `Application.ScreenUpdating = False` および `Application.Calculation = xlCalculationManual` を設定し、コードの最後に元に戻す(`True` および `xlCalculationAutomatic`)ことを忘れないでください。
* **配列処理**: 非常に大規模なデータセットを扱う場合、Excelのシート上で直接処理するのではなく、一度データを配列に読み込み、配列上で処理してから結果をシートに戻す方が高速になることがあります。

5. **抽出結果の検証**:
抽出されたファイル名が本当に意図したものであるか、目視または自動チェックで検証するプロセスも重要です。特に、URLの構造が複雑な場合や、ファイル名に特殊文字が含まれる場合など、予期せぬ結果が出力される可能性を考慮し、テストデータを作成してコードの動作を確認することが不可欠です。

6. **コメントと変数名の明確化**:
VBAコードは、後から自分自身や他の人が見たときに理解しやすいように、適切なコメントを記述し、変数名も意味が分かるように命名することがプロフェッショナルな開発の基本です。例えば、`lastSlashPos` のように、その変数が何を表しているのかを明確に示します。

### まとめ

Excel VBAを用いてURLからファイル名を抽出する技術は、Web上のデータを効率的に扱う上で非常に有用です。本記事では、「一番右の指定文字以降を抽出」という具体的な要件に基づき、`InStrRev` 関数と `Mid` 関数を組み合わせた基本的なアプローチから、クエリパラメータなどを考慮したより堅牢な実装方法までを解説しました。

この技術を習得することで、以下のような場面で活用できます。

* Webサイトからダウンロードしたファイルリストの整理
* Web APIからのレスポンスに含まれるリソースURLからのファイル名取得
* URLリストの自動検証や前処理

実務においては、エラーハンドリング、URLの正規化、パフォーマンス向上策などを考慮することで、より信頼性の高い自動化ツールを構築することができます。Excel VBAの強力な文字列操作機能を駆使し、日々の業務効率化に繋げていきましょう。

タイトルとURLをコピーしました