【VBA入門】WorksheetsからWorksheetオブジェクトを取得し操作する

ExcelVBAでは、WorksheetsコレクションからWorksheetオブジェクトを取得し操作することができます。

この記事では、WorksheetsコレクションからWorksheetオブジェクトを取得し操作する方法についてWorksheetオブジェクトとは何かやWorksheetオブジェクトで出来ること一覧、Worksheetオブジェクトを取得する方法といった基本的な内容から

  • Activateでワークシートを切り替える方法
  • Copyメソッドでワークシートをコピーする方法
  • WorksheetFunctionについて

など応用的な使い方についても解説していきます。ワークシートをコピーする方法を使用することで書類の作成を効率的に行うことができます。例えば、全てのワークシートの元となるテンプレートを用意しておき、コピーして各ワークシートを作成するといった具合です。

それでは、例を交えながら詳しく解説していきます。

目次

Worksheetオブジェクトとは

次の画像は、Excelで空のブックを作成したときのものです。(※説明のために、赤枠や青矢印を追加しています。)

vba_worksheets11 0

画像:ワークシート

画面下部に表示されているものがワークシートの見出しです。ワークシートの本体は、赤枠で囲まれた部分です。このワークシートをExcelVBAでは、Worksheetオブジェクトとして扱っています。

Worksheetsコレクションとの違いについて

先ほどはWorksheetオブジェクトについて説明しました。これによく似た用語でWorksheetsというものがあります。Excelではワークシートのほかにも、いろいろなシートがあります。

例えば、グラフシートや、マクロシート、ダイアログシートなどのシートがあります。

Worksheets01

画像:挿入画面

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の順番になります。

vba_worksheets21 0

画像:ワークシート

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

vba_worksheets22 0

画像:実行前

vba_worksheets23 0

画像:実行後

確認のため、取得したワークシートの名前をメッセージボックスで表示しています。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

vba_worksheets22 0

画像:実行前

vba_worksheets33 0

画像:実行後

確認のため、取得したワークシートの名前をメッセージボックスで表示しています。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

Worksheets02

画像:実行結果

WorksheetオブジェクトのActivateメソッドでアクティブシートを切り替えて、Nameプロパティでアクティブシートの名前を取得しています。

Copyメソッドでワークシートをコピーする方法

例えば、次のようなテンプレートとなるワークシートをコピーして書類を作成したいとします。

vba_worksheets41 0

画像:サンプル

Copyメソッドでワークシートをコピーするためには、次のように記述します。

Sub Sample()
    Dim ws As Worksheet
    Set ws = Worksheets("テンプレート")
    ws.Copy Before:=ws
End Sub

vba_worksheets42 0

画像:サンプルをコピー

テンプレートとなるワークシートを取得するために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

vba_worksheets43 0

画像:実行結果

コピー時にアクティブシートが切り替わることを利用し、ActiveSheet.Name = "シート"とすることでコピーしたワークシートの名前を変更しています。ワークシートの名前を変更するために、WorksheetオブジェクトのNameプロパティで値を変更しています。

実行結果の画像からシート見出しに表示されるワークシートの名前が変更されていることを確認できます。

WorksheetFunctionについて

ApplicationオブジェクトのWorksheetFunctionプロパティというものがあります。Worksheetオブジェクトと呼び名が似ていますが、Worksheetオブジェクトを操作するものではありません。

WorksheetFunctionプロパティはVBAからワークシート関数を呼び出す場合に使います。ワークシート関数とはExcelシート上のセルに入力する関数のことです。

WorksheetFunctionプロパティの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

まとめ

いかがでしたか?今回は、ExcelVBAでWorksheetsからWorksheetオブジェクトを取得し、操作する方法について解説しました。テンプレートとなるワークシートをコピーして、新しいワークシートを作成することで書類作成を効率化することができますね。

もし、ExcelVBAでWorksheetsからWorksheetオブジェクトを取得し、操作することがあればこの記事を思い出してみてください!。

この記事を書いた人

フリーランスのエンジニアです。
最近では、プログラミング関連の記事を作成するライターとしても活動しています。

趣味と業務の両方でプログラミング言語をいくつも学んできたので
その経験を活かして分かりやすい記事を作成できればと考えています。

目次