以下に、上の3つ(ファイル操作・日付処理・検索処理)+セル値変更+シート名変更+Range参照渡し を全部まとめて使った、
本物の業務マクロ(テンプレ付き)を作成します。
これが「実務テンプレ」
ファイル → データ読み込み → 日付処理 → 検索 → 結果書き込み → ログ書き込み → シート名変更
まで全部含めた フル業務マクロ です。
- すべて ByRef(参照渡し) を要所に使用
- エラー処理・ログ出力・処理開始時刻/終了時刻
- Range オブジェクトを渡して中で加工
- ファイル操作+検索処理+日付処理
想定シナリオ
総務部の Excel マクロ:
- 指定フォルダにある CSV ファイルを読み込む
- 「名前」列から検索ワードを探す
- 今日の日付を付けて結果を書き込み
- ログシートに記録
- 最後に「処理完了_YYYYMMDD」の形式でシート名を変更
Excel 構成(推奨)
[Data] ← 処理対象(CSV読み込み&検索結果書き込み)
[Log] ← ログ記録
[Config] ← 設定(検索ワード、フォルダパスなど)
Config シート例:
| A | B |
|---|---|
| folder | C:\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
にすれば そのまま動きます。
