ExcelVBA

【Excel VBA】シートがなければ追加する方法

blogthumb

今回、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

 

これで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 "処理が完了しました"

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

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

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

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

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

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
ABOUT ME
ごんゾウ太郎@ちゃんころ
趣味と勉強とその他のこと。ハマったことはとことん。あまり人と接するのは得意じゃない。