Excel VBA 逆引き集 | シートを追加する

Excel VBA
スポンサーリンク

シートを追加する

「新しいシートを作る」「末尾に入れる」「名前を付ける」「複数追加する」——初心者がつまずきやすいポイントを、確実に動くコード例とテンプレートでわかりやすく解説します。


基本:最短でシートを1枚追加する

すぐ試せる最小コード

Sub AddSheet_Basic()
    Sheets.Add 'アクティブなシートの前に1枚追加
End Sub
VB
  • ポイント:
    • Sheets.Add(またはWorksheets.Add)で追加できます。引数なしだと「今アクティブなシートの直前」に新規シートが入ります。
    • Worksheetsはワークシート限定、Sheetsはグラフシートなども含むコレクションです。

位置を指定して追加する

先頭/末尾に追加

Sub AddSheet_Position()
    '先頭に追加
    Sheets.Add Before:=Sheets(1)

    '末尾に追加
    Sheets.Add After:=Sheets(Sheets.Count)
End Sub
VB
  • ポイント:
    • BeforeAfterに既存シートを指定します。末尾はSheets.Countで最後のシートを指すのが定番です。
    • 慣例的に「出力シート」は末尾に追加すると見つけやすく管理しやすいです。

名前を付けて追加する(重複・禁止文字に配慮)

追加してすぐ命名

Sub AddSheet_WithName()
    Dim ws As Worksheet
    Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    ws.Name = "月次レポート"
End Sub
VB
  • ポイント:
    • Worksheets.Addの返り値(追加されたシート)をWorksheet変数に受け取り、Nameで命名します。
    • シート名は重複不可。禁止文字(: / \ ? * [ ])と31文字上限に注意しましょう。

安全テンプレート:なければ作る、あれば再利用

Try-Add命名の基本雛形

Function GetOrCreateSheet(sheetName As String, Optional wb As Workbook) As Worksheet
    Dim ws As Worksheet
    If wb Is Nothing Then Set wb = ThisWorkbook

    '既存確認(エラー回避)
    On Error Resume Next
    Set ws = wb.Worksheets(sheetName)
    On Error GoTo 0

    If ws Is Nothing Then
        Set ws = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
        '安全な名前に整形してから命名
        ws.Name = SanitizeSheetName(sheetName, wb)
    End If
    Set GetOrCreateSheet = ws
End Function

Function SanitizeSheetName(rawName As String, wb As Workbook) As String
    Dim safe As String
    safe = rawName
    '禁止文字を置換
    safe = Replace(safe, ":", "_")
    safe = Replace(safe, "/", "_")
    safe = Replace(safe, "\", "_")
    safe = Replace(safe, "?", "_")
    safe = Replace(safe, "*", "_")
    safe = Replace(safe, "[", "_")
    safe = Replace(safe, "]", "_")
    '長さ制限(31文字)
    If Len(safe) > 31 Then safe = Left$(safe, 31)
    '重複回避(末尾に連番)
    Dim i As Long
    Dim base As String: base = safe
    i = 1
    Do While SheetExists(safe, wb)
        i = i + 1
        If Len(base) > 28 Then
            safe = Left$(base, 28) & "_" & CStr(i)
        Else
            safe = base & "_" & CStr(i)
        End If
    Loop
    SanitizeSheetName = safe
End Function

Function SheetExists(name As String, wb As Workbook) As Boolean
    Dim t As Worksheet
    On Error Resume Next
    Set t = wb.Worksheets(name)
    SheetExists = Not t Is Nothing
    On Error GoTo 0
End Function
VB
  • ポイント:
    • 「存在チェック → 追加 → 命名」をひとまとめ。使い回ししやすい定番テンプレート。
    • 禁止文字と31文字制限、重複時の連番付与まで面倒を見ます。
    • Worksheets.Addの返り値を受けると、そのシートだけに続けて操作しやすいです。

複数枚を一気に追加する

指定枚数を連続追加

Sub AddMultipleSheets(countToAdd As Long)
    Dim i As Long
    For i = 1 To countToAdd
        Worksheets.Add After:=Worksheets(Worksheets.Count)
    Next i
End Sub
VB
  • ポイント:
    • 単純ループでOK。末尾追加に統一すると管理しやすいです。

名前リストから一括追加(重複・禁止文字対応)

Sub AddSheetsFromArray()
    Dim names As Variant
    names = Array("売上", "在庫/速報", "顧客一覧", "週報*2025")

    Dim i As Long
    Dim ws As Worksheet
    For i = LBound(names) To UBound(names)
        Set ws = GetOrCreateSheet(CStr(names(i)))
        '追加直後に初期レイアウトなどの設定も可能
        ws.Range("A1").Value = "初期化済み"
    Next i
    MsgBox "追加(または再利用)が完了しました。"
End Sub
VB
  • ポイント:
    • バラついた入力名にも強い。既存なら再利用、なければ安全に命名して作成。
    • 「初期化」や見出しの書き込みなどをループ内で並行して行うのが実務的。

追加と同時にテンプレートを使う(Type指定)

ひな形シートから新規作成

Sub AddFromTemplate()
    'テンプレート用のチャートシートやワークシートをTypeで指定する方法もあります
    '一般的にはひな形シートをコピーして作るのが扱いやすい
    Worksheets("Template").Copy After:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = SanitizeSheetName("レポート", ThisWorkbook)
End Sub
VB
  • ポイント:
    • Sheets.Add(Before, After, Count, Type)Type引数で種類指定も可能だが、既存の「テンプレートシート」をCopyするほうが現場では実用的です。
    • 書式・数式・レイアウトを丸ごと継承できます。

例題で練習

例題1:月次レポートを自動作成して初期化

Sub CreateMonthlyReport()
    Dim target As String
    target = Format(Date, "yyyy-mm") & "_レポート"

    Dim ws As Worksheet
    Set ws = GetOrCreateSheet(target)

    With ws
        .Range("A1").Value = "作成日"
        .Range("B1").Value = Date
        .Range("A2").Value = "担当"
        .Range("B2").Value = Environ$("Username")
        .Range("A4").Value = "サマリー"
    End With

    MsgBox "レポートシートを準備しました: " & ws.Name
End Sub
VB
  • ポイント:
    • 月名(年月)を含む安定した命名規則で運用すると管理が楽。
    • 初期項目を一括でセットして、毎月の「開始作業」をゼロに。

例題2:ボタンひとつで「週報」を5週分自動生成

Sub CreateWeeklyReports()
    Dim i As Long, name As String, ws As Worksheet
    For i = 1 To 5
        name = "週報_" & CStr(i)
        Set ws = GetOrCreateSheet(name)
        ws.Range("A1").Value = "週番号"
        ws.Range("B1").Value = i
    Next i
    MsgBox "週報シートを作成/更新しました。"
End Sub
VB
  • ポイント:
    • 連番での大量生成は「重複対策済みテンプレート」を使うと事故が少ない。
    • 後から順番を入れ替えてもシート名で識別できる。

実務の落とし穴と対策

  • 禁止文字・長さ制限:
    • シート名は: / \ ? * [ ]が使えず、31文字上限。入力を整形してから命名しましょう。
  • 重複命名でエラー:
    • 既存と同名はエラー。存在チェックして連番を付けるのが安全です。
  • SheetsとWorksheetsの違い:
    • Sheetsはグラフシート等も含む。通常はWorksheetsで十分。種類を明示的に扱う場合のみSheetsを使うと混乱が減ります。
  • 追加位置のデフォルト:
    • 引数なしAddはアクティブシートの直前に入るため、意図した場所に置きたいときはBefore/Afterを必ず指定しましょう。

次の一歩(小課題)

  • 課題1: InputBoxで受け取った文字列をSanitizeSheetNameに通し、末尾に安全追加するマクロを書いてみる。
  • 課題2: 「Template」という見出し付きシートを作り、月次名でCopyし、A1に年月を自動入力。
  • 課題3: 名前配列(例: Array(“売上”, “在庫”, “顧客”))を一括でGetOrCreateSheet処理し、各A1に作成時刻を記録。

タイトルとURLをコピーしました