ここでは 「実務で本当に使う」レベルの ByRef 活用サンプルとして
次の 3 種を用意します。
① ファイル操作 × ByRef
「フォルダ内の最新ファイルパスを取得し、呼び出し元に返す」
レポート・ログ・バックアップなどで 「最新ファイルを探してパスを使う」のは超よくあります。
ByRef を使うと、
プロシージャ側で見つけた最新ファイルパスを、呼び出し元の変数へ直接反映できます。
コード
Sub Sample_File_ByRef()
Dim latestPath As String
latestPath = "" ' 初期は空
' フォルダを指定(必要に応じて変更)
Dim folderPath As String
folderPath = "C:\TestFolder"
Call GetLatestFilePath(folderPath, latestPath)
Range("A1").Value = "最新ファイル:"
Range("A2").Value = latestPath
End Sub
' --- 指定フォルダ内の最新ファイルパスを返す ---
Sub GetLatestFilePath(ByVal folder As String, ByRef resultPath As String)
Dim f As String
Dim fullPath As String
Dim latestDate As Date
f = Dir(folder & "\*.*")
latestDate = 0
resultPath = ""
Do While f <> ""
fullPath = folder & "\" & f
If FileDateTime(fullPath) > latestDate Then
latestDate = FileDateTime(fullPath)
resultPath = fullPath ' ← ByRef なので呼び出し元に反映
End If
f = Dir()
Loop
End Sub
VB実務での用途
- 最新バックアップファイルの自動検索
- 最新の CSV / Excel / レポートを自動で開く
- 最新ログファイルを読み込む
- ファイル名に日付が入っていなくても時刻で判定できて便利
② 日付処理 × ByRef
「締め日から“前月の期間”を計算し、開始日・終了日を返す」
経理・勤怠・売上レポートなどで
「前月の開始日・終了日を計算する」のは非常に多い処理です。
ここでは
- 前月の 1 日
- 前月の末日
を計算し、ByRef で呼び出し元に返します。
コード
Sub Sample_Date_ByRef()
Dim startDate As Date
Dim endDate As Date
Call GetLastMonthPeriod(startDate, endDate)
Range("A4").Value = "前月開始日:"
Range("B4").Value = startDate
Range("A5").Value = "前月終了日:"
Range("B5").Value = endDate
End Sub
' --- 前月の1日と末日をByRefで返す ---
Sub GetLastMonthPeriod(ByRef sDate As Date, ByRef eDate As Date)
Dim today As Date
today = Date
' 前月末日
eDate = DateSerial(Year(today), Month(today), 1) - 1
' 前月1日
sDate = DateSerial(Year(eDate), Month(eDate), 1)
End Sub
VB実務での用途
- 前月レポート自動作成
- 売上・勤怠の締め月処理
- 日付を大量に扱うので共通モジュール化しやすい
ByRef なら “複数の戻り値を返せる” ので超便利。
③ 検索処理 × ByRef
「指定値をシートで検索し、見つかったセル位置(Range)を返す」
検索結果=見つかったセルの Range オブジェクト
これを ByRef で返すことで、呼び出し元から直接 .Value や .Offset で操作できます。
コード
Sub Sample_Search_ByRef()
Dim resultCell As Range
Dim keyword As String
keyword = "田中"
Call FindCellByValue(keyword, resultCell)
If resultCell Is Nothing Then
Range("A7").Value = "見つかりませんでした"
Else
Range("A7").Value = "見つかったセル: " & resultCell.Address
Range("A8").Value = "値: " & resultCell.Value
End If
End Sub
' --- 値を検索し、見つかったセル(Range)を ByRef で返す ---
Sub FindCellByValue(ByVal kw As String, ByRef found As Range)
Dim c As Range
found = Nothing
For Each c In Range("A1:D50")
If c.Value = kw Then
Set found = c ' ← 呼び出し元へ返る
Exit Sub
End If
Next c
End Sub
VB実務での用途
- 氏名/ID/商品コードなどの検索
- 検索後に「隣の列の情報」も取りたい場合
- 見つかった行全体を処理する場合
- Range を返すので
.Offsetや.EntireRowをそのまま使える
例
resultCell.Offset(0, 1).Value = "OK"
VBまとめ:実務で使える ByRef の強み
| 分野 | ByRef のメリット |
|---|---|
| ファイル操作 | 最新ファイルパスなど「結果」を変数に直接返せる |
| 日付処理 | 開始日・終了日のような複数値の返却が簡単 |
| 検索処理 | Range を返すことで後続処理がシンプル |
特に業務では “複数の値を返す”“検索した Range を返す”“可変の結果を戻す” ことが多く、
ByRef はそのための強力な手段です。
