- VBAで任意の名前のシートがない時だけ追加するにはどうすればいいの?
- マクロ終了後に任意のシートを表示したい
- できるだけ記述を簡単にしたい
そこで今回は、VBAで任意の名前のシートがなければ追加する方法について紹介します。
追加シートの名前の変更方法や簡単に書くにはどうすればいいのかについても解説します。まずはコピペして使ってみてください。
VBAで任意の名前のシートがなければ作成するサンプルコード
'任意のワークシート名を指定
Dim trgtShName As String
trgtShName = "新規追加"
'シートが開いているかどうかのフラグを定義する
Dim flg As Boolean
'ワークシートオブジェクトを定義する
Dim ws As Worksheet
'マクロ実行ブックの全シートにループ処理を実行する
For Each ws In ThisWorkbook.Worksheets
'シートの名前が目的のブック名と一致した場合、処理を実行
If ws.Name = trgtShName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
'フラグがFalseだった場合、シートを作成する
If flg = False Then
Worksheets.Add
'シート名を変更(追加されたシートはアクティブとなる)
ActiveSheet.Name = trgtShName
End If
上記サンプルコードでは「新規追加」シートがあれば何もしない、なければ「新規追加」シートを追加する処理を実行します。次に詳しい解説をしていきます。
VBAで任意の名前のシートがなければ作成するコードの解説
'任意のワークシート名を指定
Dim trgtShName As String
trgtShName = "新規追加"
まず、作成したいワークシートの名前を変数「trgtShName」に定義します。'シートが開いているかどうかのフラグを定義する
Dim flg As Boolean
この後の判定処理で指定した名前のシートがあるかどうかを「True / False」で保持する変数「flg」を定義します。初期値は「False」となります。'ワークシートオブジェクトを定義する
Dim ws As Worksheet
'マクロ実行ブックの全シートにループ処理を実行する
For Each ws In ThisWorkbook.Worksheets
'シートの名前が目的のブック名と一致した場合、処理を実行
If ws.Name = trgtShName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
ここでは、指定したシート名とブック内のシート名が一致するかをループ処理「ForEach」を使って判定します。具体的にはマクロ実行ブック内の全シートのシート名を順に取得して、指定したシート名「trgtShName」と一致する場合に「flg = True」とする処理です。「For Each ws In ThisWorkbook.Worksheets」で、マクロ実行ファイル内のワークシート(ThisWorkbook.Worksheets)から一つずつのワークシート「ws」として処理を実行していきます。ループ内ではまず、「If文」とワークシートの「Name」プロパティを使って、「If ws.Name = trgtShName Then」という判定を実行します。
これで、「ws」の名前と指定したシート名「trgtShName」が一致した場合には、「flg = True」とします。また、この時点で残りのワークシートを確認する必要はないので「Exit For」でループ処理を抜けています。
'フラグがFalseだった場合、シートを作成する
If flg = False Then
Worksheets.Add
'シート名を変更(追加されたシートはアクティブとなる)
ActiveSheet.Name = trgtShName
End If
指定したシート名「trgtShName」のワークシートがあるかどうかを保持している変数「flg」が「False」の場合、つまりシート名が「trgtShName」と一致するワークシートがなかった場合のみ「Worksheets.Add」を実行して、新規シートを作成します。この時、新しく追加されたワークシートは「Active」になるので、「ActiveSheet.Name = trgtShName」とすることで、追加されたシートの名前を「trgtShName」に変更することができます。以上で、VBAで任意の名前のシートがなければ作成する処理が実行できました。
VBAで任意の名前のシートがなければ作成する際の注意点と応用
作成されたシートが「Active」となる
今回紹介した「任意の名前のシートがなければ作成する」処理には注意点もあります。それは、新たにシートを作成した場合、新規で追加されたシートが「Active」になることです。
サンプルコードではこの性質を利用して、ワークシート追加直後に「ActiveSheet.Name = trgtShName」を実行してシート名を修正しています。
マクロ処理終了後に、表示したいシートがある時は、次のようにシート追加が終わった後、表示したいシートに「Activate」を実行するようにしましょう。
'任意のワークシート名を指定
Dim trgtShName As String
trgtShName = "新規追加"
'シートが開いているかどうかのフラグを定義する
Dim flg As Boolean
'ワークシートオブジェクトを定義する
Dim ws As Worksheet
'マクロ実行ブックの全シートにループ処理を実行する
For Each ws In ThisWorkbook.Worksheets
'シートの名前が目的のブック名と一致した場合、処理を実行
If ws.Name = trgtShName Then
'フラグをTrueにしてループを抜ける
flg = True
Exit For
End If
Next
'フラグがFalseだった場合、シートを作成する
If flg = False Then
Worksheets.Add
'シート名を変更(追加されたシートはアクティブとなる)
ActiveSheet.Name = trgtShName
End If
'元のシート(サンプル)に表示を戻す
ThisWorkbook.Worksheets("サンプル").Activate
任意の名前のシートがあるかどうかを返す自作関数を作る
任意の名前のシートがなければ作成するサンプルを紹介しましたが、任意の名前のシートがあるかどうかを確認するためにいちいちループ処理を書くのは手間がかかる上、可読性やメンテナンス性も低くなってしまいます。そこで、任意の名前のシートがあるかどうかをフラグで返す自作関数を作って、書きやすく、可読性の高いコードに作りかえましょう。
任意の名前のシートがあるかを確認する場合、必要なのは「対象ブック」と「任意のシート名」です。これを利用して、「ワークブックオブジェクト」と「任意のシート名」を渡して「True / False」を返す関数を作ることができます。
また、引数の「任意のシート名(wsName)」と比較対象「ws」の名前(ws.Name)を比較する「If文」の条件は「=」ではなく「Like」なので、「任意のシート名」にはワイルドカードも渡すことができます。
'----------------------------------------------------------
'wsExists
'引数 wb, wsName
'返り値 true/false
'呼び出し元 -
'任意の名前のワークブック内に任意の名前のシートがあるか判定
'----------------------------------------------------------
Public Function wsExists(ByVal wb As Workbook, ByVal wsName As String) As Boolean
Dim ws As Worksheet
Dim flg As Boolean
For Each ws In wb.Worksheets
If ws.Name Like wsName Then
flg = True
Exit For
End If
Next
wsExists = flg
End Function
上記の自作関数「wsExists」を使うと、冒頭で紹介した「任意の名前のシートがなければ作成する」サンプルコードを次のようにわかりやすく、簡単に書くことができます。'任意のワークシート名を指定
Dim trgtShName As String
trgtShName = "新規追加"
'wsExistsがFalseだった場合、シートを作成する
If wsExists(ThisWorkbook, trgtShName) = False Then
Worksheets.Add
'シート名を変更(追加されたシートはアクティブとなる)
ActiveSheet.Name = trgtShName
End If
こうしたよく使う自作関数をまとめて一つのモジュールにしておくと、コピペで自作関数を全て実装することができるので作業効率が上がります。ぜひお気に入りの関数モジュールを作成して、使い回してみてください。例えばこちらの記事では、任意の名前のブックが開いているかどうかをフラグで返す自作関数を紹介しています。あわせて見てみてください。
VBAで任意の名前のシートがなければ作成するまとめ
今回はVBAで任意の名前のシートがなければ作成する方法と下記の注意と応用について紹介しました。任意の名前のシートがなければ作成する際の注意と応用
任意の名前のシートがなければ作成する処理は汎用性が高いので、まずはコピペで使ってみましょう。- 作成されたシートが「Active」となる
- 任意の名前のシートがあるかどうかを返す自作関数
ただ、判定にループ処理が必要で煩雑になりやすいので、短いコードになるよう、自作関数「wsExists」もあわせて使ってみてください。