和風スパゲティのレシピ

日本語でコーディングするExcelVBA

新規シートを新しいブックに追加する

新しいシートを、新規のブックに追加する方法を紹介します。

それには、こちらのコードを実行します。

Workbooks.Add

Dim 新規シート As Worksheet
Set 新規シート = ActiveWorkbook.Worksheets(1)

ブックを追加し、そのブックの第1シートを取得するコードです。


欲しいものが「ワークシート」であるため、シートを追加する

Worksheets.Add

をまず考え、このAddメソッドの追加先に新規ブックを指定できないかを考えていた方もいらっしゃるかもしれません。


しかし今回の場合は、Workbooks.Addでブックを追加すればそこにシートがありますので、そのシートを取得すればOKということになります。


なお、分かりやすい様に

  1. ブックを追加(新しいブックがアクティブになる)
  2. アクティブブックの第1シートを変数にセット

というコードを書きましたが、今回の目的を果たすコードは以下のように書くこともできます。

Dim 新規シート As Worksheet
Set 新規シート = Workbooks.Add.Worksheets(1)

だいぶ短く書けますね。


このコードをひとつずつ分解して解説しますと、まずAddメソッドさんは、
ブックの追加後に出来上がったWorkbookオブジェクトを返り値としてくれる便利な仕様があります。

つまり、

Dim 新規ブック As Workbook
Set 新規ブック = Workbooks.Add

これができるということですね。


また、Addさんに限らず「オブジェクトを返すメソッドやプロパティ」は、
メソッドやプロパティにそのまま「.」をつなげて次のプロパティを書くことで、
返ってきたオブジェクトのプロパティを直接指定できます


つまり、

Dim 作成ブック As Workbook
Set 作成ブック = Workbooks.Add

Dim 作成シート As Worksheet
Set 作成シート = 作成ブック.Worksheets(1)

この2つのオブジェクト取得コードを、

Dim 作成シート As Worksheet
Set 作成シート = Workbooks.Add.Worksheets(1)

と、一気に書くことができるということですね。


コードを簡潔に書くひとつの道具になりますので、
気が向いたら覚えてあげてください。


なお、この短縮コードでシートを作ったあと、やっぱりブックの変数も欲しくなったときは、

Dim 作成シート As Worksheet
Set 作成シート = Workbooks.Add.Worksheets(1)

Dim 作成ブック As Workbook
Set 作成ブック = 作成シート.Parent

と、シートの親(Parent)というプロパティを使って、シートからブックを取得することもできます。


ブックを新しく作るマクロでは、この書き方が便利な場面も多いです。

こちらも気が向いたら覚えてあげてください。


この二つの合わせ技を使えば、

Worksheets.Add.Parent.Worksheets.Add.Parent.Worksheets.Add

これで3つのシートを追加できます。

もちろんやる意味は全くないですけどね(´∀`)

おまけ

メソッドやプロパティにそのまま「.」をつなげて次のプロパティを書くことで、
返ってきたオブジェクトのプロパティを直接指定できます。


これをみて、「へ~そうなんだ」と思った方へ。

実はあなたは、既にこの機能を使っているかもしれません。


最終行を取得する

最終行 = Cells(Rows.Count, 1).End(xlUp).Row

というコードをよく見てください。


これは、

Dim シート最下部から上側に飛んだ先のセル As Range
Set シート最下部から上側に飛んだ先のセル = Cells(Rows.Count, 1).End(xlUp)

Dim 最終行 As Long
最終行 = シート最下部から上側に飛んだ先のセル.Row

このようにコードを分解できます。


Rangeオブジェクトを返す「Endプロパティ」にそのまま「.」をつないで、
返ってきたセルの「Rowプロパティ」を直接指定しています。


まさに、
「メソッドやプロパティにそのまま「.」をつなげて次のプロパティを書くことで、
 返ってきたオブジェクトのプロパティを直接指定」したわけですね!


定型文として使っていたコードの原理を知る、
いいきっかけになれば幸いです(´∀`)