業務テンプレ:「チェック済みレポートを自動生成し、内容を整形して別シートへ出力する」
では 「セル加工」+「シート名生成」+「書き込み位置管理(Range)」 をすべて組み合わせた、
実務でそのまま使える “mini 業務テンプレマクロ” を作ります。
このテンプレートは以下をすべて含みます:
- ByRef でセル内容を加工
- ByRef でシート名を自動命名(重複回避)
- ByRef で Range(書き込み先位置)を可変管理
- Excel 実務の “定番” 書式
- 元データシート → 整形 → 別シートへレポート出力
- 行数に合わせて書き込み位置が自動で下へ移動
- 汎用的にどの会社でも使えるテンプレ構造
業務マクロ:レポート生成テンプレ
以下を 標準モジュールに丸ごと貼り付け できます。
' ===============================
' ◆ メイン処理
' ===============================
Sub CreateReport()
Dim src As Worksheet ' 元データ
Dim dst As Worksheet ' 出力先シート
Dim writePos As Range ' 書き込み位置(ByRefで動く)
Dim newSheetName As String ' シート名(ByRefで加工)
Set src = Sheets("元データ") ' 元データシートを想定
newSheetName = "レポート"
' --- シート名を一意のものに加工(ByRef) ---
Call MakeSheetNameUnique(newSheetName)
' --- 新規シート作成 ---
Set dst = Sheets.Add
dst.Name = newSheetName
' --- 最初の書き込み位置を設定(ByRefで更新する) ---
Set writePos = dst.Range("A1")
' --- ヘッダーを書き込む ---
writePos.Value = "チェック済みレポート"
Set writePos = writePos.Offset(2, 0) ' 2 行下へ移動
' ===============================
' 元データを読み取り、加工して書き込む
' ===============================
Dim i As Long
Dim lastRow As Long
lastRow = src.Cells(src.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow ' 1行目はヘッダー想定
Dim item As String
item = src.Cells(i, "A").Value
' --- 空欄はスキップ ---
If item <> "" Then
' --- ByRef でセル内容に「済」印を付ける ---
Call AddCheckMark(item)
' --- 出力 ---
writePos.Value = item
' --- 次の行へ移動(ByRefで更新) ---
Call MoveNextRow(writePos)
End If
Next i
MsgBox "レポート生成が完了しました!", vbInformation
End Sub
' ===============================
' ◆ ① セル値を ByRef で加工する
' ===============================
Sub AddCheckMark(ByRef text As String)
text = "[済] " & text
End Sub
' ===============================
' ◆ ② シート名を一意に加工(ByRef)
' ===============================
Sub MakeSheetNameUnique(ByRef nameText As String)
Dim baseName As String
baseName = nameText
Dim i As Integer
i = 1
While SheetExists(nameText)
i = i + 1
nameText = baseName & "_" & i
Wend
End Sub
Function SheetExists(sheetName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets(sheetName)
SheetExists = Not ws Is Nothing
End Function
' ===============================
' ◆ ③ Range を ByRef で更新していく
' ===============================
Sub MoveNextRow(ByRef pos As Range)
Set pos = pos.Offset(1, 0)
End Sub
VBこれでできること(実務レベル)
元データ(A列)を読み取る
例:(元データシート)
| A |
|---|
| 商品名 |
| テスト1 |
| テスト2 |
| テスト3 |
加工して別シートを自動作成
出力イメージ:
| A |
|---|
| チェック済みレポート |
| [済] テスト1 |
| [済] テスト2 |
| [済] テスト3 |
さらに実務向けのポイント
シート名は自動命名
- 「レポート」が存在 → 「レポート_2」に
- さらにあれば「レポート_3」
※ ByRef により呼び出し元も変更後の名前を保持
書き込み位置 Range は自動で下へ進む
- MoveNextRow の一行で OK
- 全プロシージャで同じ変数 writePos を共有できる
セルの加工処理を独立化(再利用可能)
- [済] 付与
- 文字のクリーニング
- 日付の追加など、ルールを変更しやすい
