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

VBA
スポンサーリンク

以下に、上の3つ(ファイル操作・日付処理・検索処理)+セル値変更+シート名変更+Range参照渡し を全部まとめて使った、
本物の業務マクロ(テンプレ付き)を作成します。


これが「実務テンプレ」

ファイル → データ読み込み → 日付処理 → 検索 → 結果書き込み → ログ書き込み → シート名変更
まで全部含めた フル業務マクロ です。

  • すべて ByRef(参照渡し) を要所に使用
  • エラー処理・ログ出力・処理開始時刻/終了時刻
  • Range オブジェクトを渡して中で加工
  • ファイル操作+検索処理+日付処理

想定シナリオ

総務部の Excel マクロ:

  • 指定フォルダにある CSV ファイルを読み込む
  • 「名前」列から検索ワードを探す
  • 今日の日付を付けて結果を書き込み
  • ログシートに記録
  • 最後に「処理完了_YYYYMMDD」の形式でシート名を変更

Excel 構成(推奨)

[Data]         ← 処理対象(CSV読み込み&検索結果書き込み)
[Log]          ← ログ記録
[Config]       ← 設定(検索ワード、フォルダパスなど)

Config シート例:

AB
folderC:\temp\in
keyword田中

完成版フル業務テンプレ

(そのまま標準モジュールへ貼り付けて動く)

Option Explicit

'===============================
' メイン処理(業務フロー全体)
'===============================
Sub MainProcess()

    On Error GoTo ERR_HANDLE

    Dim folder As String, keyword As String
    Dim filePath As String
    Dim startTime As Date, endTime As Date
    Dim rngWrite As Range
    
    startTime = Now
    
    ' 設定読み込み (ByRef)
    Call LoadConfig(ByRef folder, ByRef keyword)
    
    ' ファイル取得
    filePath = GetLatestCSV(folder)
    If filePath = "" Then
        Call WriteLog("CSVファイルが見つかりません")
        Exit Sub
    End If
    
    ' CSV 読み込み(Range を ByRef で渡す)
    Set rngWrite = Sheets("Data").Range("A1")
    Call ImportCSV(ByRef filePath, ByRef rngWrite)

    ' 検索処理(検索結果を ByRef で書き換える)
    Call ProcessSearch(ByRef keyword)

    ' シート名変更(ByRef)
    Dim newName As String
    newName = "処理完了_" & Format(Date, "yyyymmdd")
    Call RenameSheet(Sheets("Data"), ByRef newName)

    ' 終了ログ
    endTime = Now
    Call WriteLog("正常終了:" & startTime & " → " & endTime)

    MsgBox "完了しました!", vbInformation
    Exit Sub


'===============================
' エラー処理
'===============================
ERR_HANDLE:
    Call WriteLog("エラー発生:" & Err.Number & " - " & Err.Description)
    MsgBox "エラー発生:" & Err.Description, vbCritical

End Sub


'===============================
' 設定読み込み(ByRef)
'===============================
Sub LoadConfig(ByRef folder As String, ByRef keyword As String)
    With Sheets("Config")
        folder = .Range("B1").Value
        keyword = .Range("B2").Value
    End With
End Sub


'===============================
' 最新 CSV を1つ返す
'===============================
Function GetLatestCSV(ByVal folder As String) As String
    Dim f As String, newest As String
    Dim newestTime As Date

    f = Dir(folder & "\*.csv")

    Do While f <> ""
        If FileDateTime(folder & "\" & f) > newestTime Then
            newest = folder & "\" & f
            newestTime = FileDateTime(folder & "\" & f)
        End If
        f = Dir()
    Loop

    GetLatestCSV = newest
End Function


'===============================
' CSV 読み込み(Range を参照渡し)
'===============================
Sub ImportCSV(ByRef filePath As String, ByRef rng As Range)

    rng.CurrentRegion.Clear

    With rng.Parent.QueryTables.Add( _
        Connection:="TEXT;" & filePath, _
        Destination:=rng)
        .TextFileParseType = xlDelimited
        .TextFileCommaDelimiter = True
        .Refresh BackgroundQuery:=False
    End With

    Call WriteLog("CSV 読み込み完了:" & filePath)

End Sub


'===============================
' 検索処理(ByRef でセルを変更)
'===============================
Sub ProcessSearch(ByRef keyword As String)

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim hitCnt As Long
    
    Set ws = Sheets("Data")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow ' ヘッダー除外
        If InStr(ws.Cells(i, 1).Value, keyword) > 0 Then
            ws.Cells(i, 3).Value = "ヒット"
            ws.Cells(i, 4).Value = Date  ' ← 日付処理
            hitCnt = hitCnt + 1
        End If
    Next i

    Call WriteLog("検索完了:keyword=" & keyword & " / ヒット件数=" & hitCnt)

End Sub


'===============================
' シート名変更(ByRef)
'===============================
Sub RenameSheet(ByRef ws As Worksheet, ByRef newName As String)
    On Error Resume Next
    ws.Name = newName
    On Error GoTo 0
    Call WriteLog("シート名変更 → " & newName)
End Sub


'===============================
' ログ書き込み
'===============================
Sub WriteLog(ByVal msg As String)
    Dim ws As Worksheet
    Set ws = Sheets("Log")

    Dim r As Long
    r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ws.Cells(r, 1).Value = Now
    ws.Cells(r, 2).Value = msg
End Sub
VB

このテンプレのポイント

1. 「ByRef」を“実務で使う場所”をすべて網羅

  • 設定値読み込みで変数を書き換え
  • CSV 取り込みで Range を直接渡して操作
  • シート名変更で 参照渡し
  • 検索処理で セル値の書き換え処理を外部プロシージャに切り出す

実務コードの構造そのものが「参照渡しと相性が良い」例。


2. 業務システム的な構成

  • メイン処理
  • ログ
  • 設定読み込み
  • データ処理
  • ファイル読み込み
  • エラー処理

新人教育~社内マクロ開発まで使える形にしてあります。


3. 実際にコピペで動く

  • シート名
    • Data
    • Log
    • Config
      にすれば そのまま動きます
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました