Excel VBA | 「実務で本当に使う」レベルの ByRef 活用サンプル

VBA
スポンサーリンク

ここでは 「実務で本当に使う」レベルの 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 はそのための強力な手段です。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました