Excel VBA | 実務寄りで「ByRef を使うとどう便利になるか」がすぐ理解できるサンプル

VBA
スポンサーリンク

業務テンプレ:「チェック済みレポートを自動生成し、内容を整形して別シートへ出力する」

では 「セル加工」+「シート名生成」+「書き込み位置管理(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 を共有できる

セルの加工処理を独立化(再利用可能)

  • [済] 付与
  • 文字のクリーニング
  • 日付の追加など、ルールを変更しやすい

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