働くこと自体は嫌いじゃない。
ただ「納得して働きたい」だけ。
by 毒舌リーマン(♂)
プログラミング

【Excel VBA For文】シートがなければ自動追加de脱残業

毒舌リーマンはVBAも使うんよ。
(※2025年4月現在ほとんど使っていない。ExcelよりもGoogleスプレッドシート。だからGASは使う、Google Apps Scriptね。)

今回、Excel VBAで紹介するのは、「シートがなければ追加」する方法を解説しようと思う。

業務をやっていると、従業員全員分の雇用契約書を作ったり顧客への請求書を人数分作ったりと数が多ければ多いほど手作業では大変な作業がたくさんあるよね。

そんなとき、今回紹介する方法を使えば簡単に全員分のシートを作成できるのでぜひやってみてほしい。

シートがなければ追加する方法

イメージは下記みたいな感じ。

マスタがあって人数分のシートを作成したい場合、シート作成ボタンを押すと、

ほら、全員分のシートが一発で完成。すごく便利。
これが100人とか1000人とか手作業でやっていたら数時間かかってしまう作業も、ボタン一つでしかも一瞬で作成することができます。

Sub シートがなければ追加()

    Dim ws As Worksheet, mstSht As Worksheet
    Dim i As Long
    Dim flg As Boolean
    
    Set mstSht = ThisWorkbook.Worksheets("マスタ")
    
    flg = False
    
    For i = 2 To mstSht.Range("A10000").End(xlUp).Row
    
        For Each ws In ThisWorkbook.Worksheets
            If mstSht.Range("A" & i).Value = ws.Name Then
                flg = True
                MsgBox mstSht.Range("A" & i).Value & "のシートはすでに存在しています"
                Exit For
            End If
        Next ws
        
        If flg = False Then
            With Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
                .Name = mstSht.Range("A" & i).Value
            End With
        End If
        
    Next i

    mstSht.Select
    MsgBox "処理が完了しました"
    
End Sub

そしてソースコードは下記の通り。

For文、For Each文、If分の組み合わせでできちゃいます。

それでは解説していきます。

まずは、変数の定義から。

Dim ws As Worksheet, mstSht As Worksheet
Dim i As Long
Dim flg As Boolean

Set mstSht = ThisWorkbook.Worksheets("マスタ")

flg = False

ws = For Each文でワークシートを格納するため
mstSht = オブジェクト変数で「マスタシート」の定義
i = カウンター変数(人数)
flg = 真偽

上記のような感じで、変数を定義しておきましょう。

flgは「False」にしておいてください。

For文で人数分繰り返し

For文で2行目から、名前の最後まで繰り返すために下記のFor文を書きましょう。

For i = 2 To mstSht.Range("A10000").End(xlUp).Row

  "ここにコードを書く"

Next i

これは、2行目から最終行までを繰り返す。


mstSht.Range(“A10000”).End(xlUp).Rowは、「A10000から上に向かって値が入ってるセルまでいきその行まで」って意味。

これでOK。この中に、さらにコードを書いていきます。

For Each文でシートの数分だけループ処理 & If分で条件分岐

定義した変数「ws」に、「ThisWorkbook.Worksheets」で全シートを取得して、一個一個代入していきます。

そして、マスタシートのRange(“A” & i).Value と一個目のwsの名前が一致していたら、もうシートがあるので、処理を中断して次のシートに行く処理を書きます。それがIf~End Ifの部分です。

「マスタシートのRange(“A2”)の値」と 「最初のワークシートの名前」が同じだったら、flgをTrueにして(シートが存在する)、シートがあるよ!って教えてあげて、For文を抜ける(Exit For)。

そして同じ名前のシートがなかったら、flgはFalseのままの場合は、新規でシートを作成して、名前を変えるようにします。

For Each ws In ThisWorkbook.Worksheets
  If mstSht.Range("A" & i).Value = ws.Name Then flg = True
    MsgBox mstSht.Range("A" & i).Value & "のシートはすでに存在しています"
    Exit For
  End If
Next ws

If flg = False Then
  With Worksheets.Add(after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) 
    .Name = mstSht.Range("A" & i).Value
  End With
End If

こんな感じでOK。全員分のシートが作成できますね。

そして最後は、マスタシートを選ぶようにして、Msgboxで処理完了みたいに書けばすっきりOK。

mstSht.Select
MsgBox "処理が完了しました"

まとめ:応用すると、いろんなことができるよ

今回は、「シートがなければ追加」する方法をご紹介しました。

簡単で基礎的な処理だったので、今回の基礎を学習して応用すればもっと実務で活用できると思います。例えば、シートをコピーして人数分作るとか、所属によってコピーするシートを条件分岐して全員分のシートを作成するとか。

僕が紹介した方法よりももっと簡単にできたりわかりやすい方法があるかもしれないので調べてみるといいかもですね。

ということで、「シートがなければ追加」する方法でした。

ABOUT ME
毒舌リーマン
社畜やってるけど、ただの愚痴じゃ終わらせない。 非IT企業でHP管理から広報までなんでも担当する現役サラリーマンが、 「働くって何だ?」「この会社おかしくない?」と感じた瞬間を毒まじりで発信中。 現場のリアル、ちょっとした仕事術、精神を保つ工夫なども共有していきます。 社畜だけど、終わりたくない人へ。 「社畜じゃ終わらん。ここから反撃だ。どあほう。」