ExcelVBAでは、WorksheetsコレクションからWorksheetオブジェクトを取得し操作することができます。
この記事では、WorksheetsコレクションからWorksheetオブジェクトを取得し操作する方法についてWorksheetオブジェクトとは何かやWorksheetオブジェクトで出来ること一覧、Worksheetオブジェクトを取得する方法といった基本的な内容から
- Activateでワークシートを切り替える方法
 - Copyメソッドでワークシートをコピーする方法
 - WorksheetFunctionについて
 
など応用的な使い方についても解説していきます。ワークシートをコピーする方法を使用することで書類の作成を効率的に行うことができます。例えば、全てのワークシートの元となるテンプレートを用意しておき、コピーして各ワークシートを作成するといった具合です。
それでは、例を交えながら詳しく解説していきます。
Worksheetオブジェクトとは
次の画像は、Excelで空のブックを作成したときのものです。(※説明のために、赤枠や青矢印を追加しています。)

画面下部に表示されているものがワークシートの見出しです。ワークシートの本体は、赤枠で囲まれた部分です。このワークシートをExcelVBAでは、Worksheetオブジェクトとして扱っています。
Worksheetsコレクションとの違いについて
先ほどはWorksheetオブジェクトについて説明しました。これによく似た用語でWorksheetsというものがあります。Excelではワークシートのほかにも、いろいろなシートがあります。
例えば、グラフシートや、マクロシート、ダイアログシートなどのシートがあります。

VBAでは、シートはSheetオブジェクトとして扱います。そのSheetオブジェクトの集合体がSheetsコレクションです。同じように、VBAではワークシートをWorksheetオブジェクトとして扱います。
そして、Worksheetオブジェクトの集合体がWorksheetsコレクションです。
Worksheetオブジェクトで出来ること一覧
Worksheetオブジェクトにはイベント、メソッド、プロパティがあります。これらを使ってVBAでワークシートを操作します。イベント、メソッド、プロパティについて解説し、それぞれ代表的なものを表にまとています。
イベント一覧
代表的なイベントについては下の表のとおりです。
| 名前 | 説明 | 使用例 | 
|---|---|---|
| Activate | ブック、ワークシート、グラフ シート、または埋め込みグラフがアクティブになったときに発生 | Worksheet_Activate() | 
| BeforeDelete | ワークシートが削除される前に発生 | Worksheet_BeforeDelete() | 
| BeforeDoubleClick | ワークシートをダブルクリックしたときに発生 | Worksheet_BeforeDelete(ByVal Target As Range, Cancel As Boolean) | 
| BeforeRightClick | ワークシートを右クリックしたときに発生 | Worksheet_BeforeRightClick(TyVal Target As Range, Cancel As Boolean) | 
| Calculate | ワークシートを再計算した後に Worksheet オブジェクトで発生 | Worksheet_Calculate() | 
| Change | ワークシートのセルが変更されたときに発生 | Worksheet_Change(ByVal Target as Range) | 
| Deactivate | グラフ、ワークシート、またはブックが非アクティブになったときに発生 | Workbook_Deactivate() | 
| SelectionChange | ワークシートで選択範囲を変更したときに発生 | Worksheet_SelectionChange(ByVal Target As Range) | 
メソッド一覧
代表的なメソッドについては下の表のとおりです。
| 名前 | 説明 | 使用例 | 
|---|---|---|
| Activate | 指定されたシートをアクティブに変更 | Worksheets("Sheet1").Activate | 
| Calculate | ワークシート内の指定されたセル範囲で計算を実行 | Worksheets("Sheet1").Rows(2).Calculate | 
| Copy | シートのコピー | Worksheets("Sheet1").Copy After:=Worksheets("Sheet3") | 
| Delete | シートの削除 | Worksheets("Sheet1").Delete | 
| Move | シートをブック内の他の場所へ移動 | Worksheets("Sheet1").Move after:=Worksheets("Sheet3") | 
| Paste | クリップボードの内容をシートに貼り付け | Worksheets("Sheet1").Paste Destination:=Worksheets("Sheet1").Range("D1:D5") | 
| PasteSpecial | 指定された形式で、クリップボードの内容をシートに貼り付け | Worksheets("Sheet1").PasteSpecial format:= _  "Microsoft Word 8.0 Document Object"  | 
| PrintOut | シートの印刷 | Worksheets("Sheet1").PrintOut | 
| PrintPreview | シートの印刷プレビューを表示 | Worksheets("Sheet1").PrintPreview | 
| Protect | ワークシートの保護、変更不可 | Worksheets("Sheet1").Protect Password:="pass" | 
| SaveAs | グラフまたはワークシートへの変更を別のファイルに保存 | Worksheets("Sheet1").SaveAs Filename:="Sample.xls" | 
| Select | シートを選択 | Worksheets("Sheet2").Select Replace:=False | 
| Unprotect | シートまたはブックの保護を解除 | Worksheets("Sheet1").Unprotect Password:="pass" | 
プロパティ一覧
代表的なプロパティについては下の表のとおりです。
| 名前 | 説明 | 使用例 | 
|---|---|---|
| Cells | セルを表すRangeオブジェクトを返す | Worksheets("Sheet1").Cells(5, 3).Font.Size = 14 | 
| Columns | 列を表すRangeオブジェクトを返す | Worksheets("Sheet1").Columns(2).ClearContents | 
| Index | シートのインデックス番号 | Worksheets("Sheet1").Index | 
| Name | シート名 | ActiveSheet.Name | 
| Names | すべてのワークシートの名前を表すNamesコレクションを返す | Worksheets("Sheet1").Names.ColorIndex = 3 | 
| Range | セルまたはセル範囲を表すRangeオブジェクトを返す | Worksheets("Sheet1").Range("A1").Value | 
| Rows | 行を表すRangeオブジェクトを返す | Worksheets("Sheet1").Rows(3).Delete | 
| Visible | シートの表示、非表示 | Worksheets("Sheet1").Visible = False | 
Worksheetオブジェクトを取得する方法
Worksheetオブジェクトを取得するためには、を使用します。Worksheetsコレクションには、見出しの順番でWorksheetオブジェクトが割り当てられます。
例えば、次の画像のような場合はSheet2, Sheet1, Sheet3の順番になります。

WorksheetsコレクションからWorksheetオブジェクトを取得するためには、次のように2通りの方法があります。
インデックス番号を指定して取得する方法
インデックス番号を指定してWorksheetオブジェクトを取得するためには、次のように記述します。
Dim ws As Worksheet Set ws = Worksheets(インデックス番号)
次のサンプルコードでは、1番目のワークシートを取得するためにSet ws = Worksheets(1)としています。
Sub Sample()
    Dim ws As Worksheet
    Set ws = Worksheets(1)
    MsgBox ws.Name + "を取得しました。"
End Sub


確認のため、取得したワークシートの名前をメッセージボックスで表示しています。WorksheetオブジェクトのNameプロパティを使ってワークシートの名前を取得しています。
実行結果の画像から1番目のワークシートを取得できていることが確認できます。
ワークシート名を指定して取得する方法
ワークシート名を指定してWorksheetオブジェクトを取得するためには、次のように記述します。
Dim ws As Worksheet
Set ws = Worksheets("ワークシート名")
次のサンプルコードでは、Sheet2を取得するためにSet ws = Worksheets("Sheet2")としています。
Sub Sample()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet2")
    MsgBox ws.Name + "を取得しました。"
End Sub


確認のため、取得したワークシートの名前をメッセージボックスで表示しています。WorksheetオブジェクトのNameプロパティを使ってワークシートの名前を取得しています。実行結果の画像からSheet2を取得できていることが確認できます。
Activateでワークシートを切り替える方法
アクティブシートを切り替えるにはActivateメソッドを使います。サンプルコードで確認しましょう。
Sub Sample()
    Dim msg As String
    
    Worksheets("Sheet1").Activate
    msg = "切り替え前は" & ActiveSheet.Name & vbCrLf
    
    Worksheets("Sheet2").Activate
    MsgBox msg & "切り替え後は" & ActiveSheet.Name
End Sub

WorksheetオブジェクトのActivateメソッドでアクティブシートを切り替えて、Nameプロパティでアクティブシートの名前を取得しています。
Copyメソッドでワークシートをコピーする方法
例えば、次のようなテンプレートとなるワークシートをコピーして書類を作成したいとします。

Copyメソッドでワークシートをコピーするためには、次のように記述します。
Sub Sample()
    Dim ws As Worksheet
    Set ws = Worksheets("テンプレート")
    ws.Copy Before:=ws
End Sub

テンプレートとなるワークシートを取得するためにSet ws = Worksheets("テンプレート")としています。このサンプルコードでは、ws.Copy Before:=wsとして、Beforeパラメータを指定することでテンプレートの前にコピーを作成しています。
同様にワークシートの後ろにコピーするためのAfterパラメータも用意されています。実行結果からワークシートがコピーされていることが確認できます。さらに、コピーしたシートの名前を変更したいことがあります。
そのような場合、次のサンプルコードのように記述します。
Sub Sample()
    Dim ws As Worksheet
    Set ws = Worksheets("テンプレート")
    ws.Copy Before:=ws
    ActiveSheet.Name = "シート"
End Sub

コピー時にアクティブシートが切り替わることを利用し、ActiveSheet.Name = "シート"とすることでコピーしたワークシートの名前を変更しています。ワークシートの名前を変更するために、WorksheetオブジェクトのNameプロパティで値を変更しています。
実行結果の画像からシート見出しに表示されるワークシートの名前が変更されていることを確認できます。
WorksheetFunctionについて
ApplicationオブジェクトのWorksheetFunctionプロパティというものがあります。Worksheetオブジェクトと呼び名が似ていますが、Worksheetオブジェクトを操作するものではありません。
WorksheetFunctionプロパティはVBAからワークシート関数を呼び出す場合に使います。ワークシート関数とはExcelシート上のセルに入力する関数のことです。
WorksheetFunctionプロパティの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
            
                
                    
まとめ
いかがでしたか?今回は、ExcelVBAでWorksheetsからWorksheetオブジェクトを取得し、操作する方法について解説しました。テンプレートとなるワークシートをコピーして、新しいワークシートを作成することで書類作成を効率化することができますね。
もし、ExcelVBAでWorksheetsからWorksheetオブジェクトを取得し、操作することがあればこの記事を思い出してみてください!。
  





