このページの内容について
このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第五回記事です。公式テキスト第4章「VBAの構文」と第9章「シートとブックの操作」の内容について解説します。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。
オブジェクト
オブジェクトとは
VBAにおいてオブジェクトとは「機能(メソッド)」と「状態(プロパティ)」の集合体のことを指します。

機能(メソッド)
メソッドとは
メソッドとは関数のようなもので引数を渡して戻り値を得たり、呼び出すことでなにか動作やアクションが発生したりします。
メソッドの呼び出し方
オブジェクトの中のメソッドを呼び出す(使用する)ためには、「オブジェクト名.メソッド名」と記述します。引数がある場合は続けて「()」内に記述します。
サンプルコード(クリックでコピー)
Private Sub Test_Method()
Call VBA.MsgBox("「VBA」というオブジェクトのメソッドである「MsgBox」を呼び出してメッセージを表示します。")
End Sub
オブジェクトの省略
ExcelVBA(マクロ)では一部のオブジェクトは省略して記載することができます。上記のMsgBox関数はメッセージボックスを表示させるVBAに備え付けの関数ですが、実体は「VBA」というオブジェクトに含まれるメソッドです。しかしこの「VBA」というオブジェクトは特別に省略して記述することが認められており「MsgBox」と記述すると、マクロ実行時に「VBA」オブジェクトであることを自動で判定し実行されます。
状態(プロパティ)
プロパティとは
プロパティとはオブジェクトの持っている値のことです。また、オブジェクトの中にはオブジェクトが入れ子構造で入っていることもあります。便宜上、オブジェクトの中のオブジェクトもプロパティに分類されます。
プロパティの確認方法
メソッドと同様「オブジェクト名.プロパティ名」で参照することができます。
サンプルコード(クリックでコピー)
Private Sub Test_Property()
Debug.Print ThisWorkbook.Name
End Sub
コレクション
コレクションとは
コレクションとは同じオブジェクトの集合体のことです。
コレクションの例
「ThisWorkbook」オブジェクトには「WorkSheets」という「WorkSheet」オブジェクトの集合体が含まれています。

コレクションの参照方法
コレクションはオブジェクトの集合体なので、コレクションの中のオブジェクトを特定してメソッドやプロパティを呼び出すことができます。「コレクション名(インデックス)」でオブジェクトを特定します。
サンプルコード(クリックでコピー)
Private Sub Test_Collection()
Debug.Print ThisWorkbook.Worksheets(1).Name
End Sub
実行結果
上記サンプルでは「ThisWorkbook」の「WorkSheets」コレクションの一番目のオブジェクトの「Name」プロパティを取得・表示しています。
コレクションもオブジェクト
ややこしいポイントですが、コレクションもオブジェクトの一種です。そのためコレクション自体もメソッドとプロパティを持っています。
サンプルコード(クリックでコピー)
Private Sub Test_Collection2()
Call ThisWorkbook.Worksheets.Add
Debug.Print ThisWorkbook.Worksheets.Count
End Sub
実行結果
上記サンプルでは「ThisWorkbook」の「WorkSheets」コレクションの「Add」メソッドにより、ブックへシートを追加し、その後「Count」プロパティでWorkSheetオブジェクトの数を取得・表示しています。
ブックオブジェクト
ブックの指定方法
ThisWorkbook
マクロが動作しているブックは「ThisWorkbook」で指定することができます。このオブジェクトはプロジェクトエクスプローラーから目視できます。

ActiveWorkbook
操作中(アクティブな)ブックのことです。アクティブなブックはマクロ動作中にユーザーの操作によって変更されることがあります。
Workbooks
上記以外のブックはWorkbooksコレクションからアクセスできます。
ファイル名による指定
拡張子付きのファイル名を文字列で指定します。新規作成された未保存のブックでは拡張子は付けません。
Workbooks("abc.xlsx")
Workbooks("Book1")
インデックスによる指定
ブックオブジェクトはExcelによって開かれた順番でインデックスが振られています。最初のブックは「1」です。
Workbooks(1)
ブックの操作
ブックの新規作成(Addメソッド)
サンプルコード(クリックでコピー)
Private Sub Test_WorkbooksAdd()
Call Workbooks.Add
End Sub
実行結果
上記サンプルコードを実行すると新しいブックが一つ作成されます。
ブックを開く(Openメソッド)
サンプルコード(クリックでコピー)
Private Sub Test_WorkbooksOpen()
Call Workbooks.Open(ThisWorkbook.Path & "\" & ThisWorkbook.Name)
End Sub
実行結果
上記サンプルコードを実行すると実行中のマクロが記述されているブックを開こうとします。つまり現在のExcelの仕様上、何も起きません。なお、保存されていないブック上で動作している場合は、エラーとなります。
引数の指定方法
Openメソッドは非常に引数の多いメソッドです。
Workbooks.Open(Filename As String, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreRealOnlycommended], [Origin], [Delimiter],[Editable], [Notify], [Converter], [AddToMru], [Local], [CorruptLoad])
必須項目はFilename必須項目は「Filename」のみですが、例えばパスワード付ファイルを開く場合は「Password」を指定するとマクロの動作を止めません。このように一部の引数をとびとびに指定する場合は、以下のように記述することができます。
Workbooks.Open(Filename:="●●●",Password:="xxx")
ブックの保存(Saveメソッド、SaveAsメソッド)
上書き保存
サンプルコード(クリックでコピー)
Private Sub Test_WorkbookSave()
Call Workbooks(1).Save
End Sub
実行結果
上記サンプルコードを実行すると、ブックを上書き保存します。未保存のブックであれば保存のメッセージが立ち上がります。
名前を付けて保存
名前を付けて保存する場合、ファイル名を含むパスを指定します。
サンプルコード(クリックでコピー)
Private Sub Test_WorkbookSaveAs()
Call Workbooks(1).SaveAs(ThisWorkbook.Path & "\sample.xlsx")
End Sub
実行結果
上記サンプルコードを実行すると、1番目のブックに名前を付けて、マクロが動作中のブックと同じ階層に保存します。※マクロブックが保存されていないとエラーになります。
ブックの保存状態をしらべる(Savedプロパティ)
サンプルコード(クリックでコピー)
Private Sub Test_WorkbookSaved()
Debug.print ActiveWorkbook.Saved
End Sub
実行結果
アクティブブックが保存されている状態をイミディエイトウィンドウに出力します。True・・保存済、False・・未保存(編集が保存されていない状態)
ブックを閉じる(Closeメソッド)
保存して閉じる
サンプルコード(クリックでコピー)
Private Sub Test_WorkbookCloseTrue()
Call Workbooks(1).Close(True)
End Sub
実行結果
上記サンプルコードを実行すると、1番目のブックを保存してから閉じます。マクロを実行中のブックであっても閉じられます。
保存せず閉じる
サンプルコード(クリックでコピー)
Private Sub Test_WorkbookCloseFalse()
Call Workbooks(1).Close(False)
End Sub
実行結果
上記サンプルコードを実行すると、1番目のブックを保存せずに閉じます。
シートオブジェクト
シートの指定方法
オブジェクト名による指定
ブックには「ThisWorkbook」という最初から存在するブックオブジェクトがありました。シートにも同じようにオブジェクトが事前に用意されています。作成されたままの状態だと「Sheet1」「Sheet2」のような連番になっていますが、これでは管理がしづらいので、プロパティウィンドウでオブジェクト名を変更して管理します。下記の画像では「wsRieki」や「wsUriage」というオブジェクト名をマクロで使用できます。

ActiveSheet
操作中(アクティブな)シートのことです。アクティブなシートはマクロ動作中にユーザーの操作によって変更されることがあります。
Worksheets、Sheets
上記以外にはWorksheetsコレクションとSheetsコレクションからアクセスできます。
シート名による指定
シート名を文字列で指定します。
Worksheets("Sheet1")
Sheets("Sheet1")
インデックスによる指定
シートオブジェクトは左から何番目かのシートの位置でインデックスが振られています。
Worksheets(1)
Sheets(1)
シートの操作
シートの挿入(Addメソッド)
引数 | 働き |
---|---|
[Before] | シートを指定するとそのシートの前にシートを挿入する。指定しないと操作中のシートを指定したことになる。 |
[After] | シートを指定するとそのシートの後にシートを挿入する。指定しないとBeforeを指定したことになる。 |
[Count] | 数値を指定するとその数だけシートを挿入する。指定しないと「1」。 |
[Type] | シートのタイプを指定する。指定しないと「ワークシート」を挿入する。 |
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetsAdd()
Call Worksheets.Add(After:=ThisWorkbook.Worksheets(1), Count:=1)
End Sub
実行結果
上記サンプルコードを実行するとマクロが動作中のブックの1番目のシートの「後」に「1」つのシートを挿入します。
シートをアクティブにする(Selectメソッド、Activateメソッド)
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetActivate()
Call ThisWorkbook.Worksheets(1).Activate
End Sub
Private Sub Test_WorksheetSelect()
Call ThisWorkbook.Worksheets(1).Select
End Sub
実行結果
上記サンプルコードはマクロが動作しているブックの1番目のシートをアクティブにします。ActivateもSelectそれぞれ同じ結果となります。
シート名の取得・変更(Nameプロパティ)
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetName()
Debug.Print ThisWorkbook.Worksheets(1).Name
ThisWorkbook.Worksheets(1).Name = "テスト"
End Sub
実行結果
上記サンプルコードを実行すると、マクロが動作しているブックの1番目のシート名をイミディエイトウィンドウに出力します。その後、シート名を「テスト」へ変更します。
シートを削除する(Deleteメソッド)
警告して削除する
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetDelete()
Call ThisWorkbook.Worksheets(1).Delete
End Sub
実行結果
上記サンプルコードを実行すると、マクロが動作しているブックの1番目のシートを削除します。ただし手動で削除する時と同じ下記の警告が表示され入力されるまでマクロの動作は停止します。

警告せずに閉じる
「Application.DisplayAlert」というExcelのプロパティを変更することで、Excelからの警告メッセージを表示しないようにすることができます。そのため、下記のサンプルでは事前の警告なくシートの削除が実行されます。
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetDeleteUnAlert()
Application.DisplayAlerts = False
Call ThisWorkbook.Worksheets(1).Delete
Application.DisplayAlerts = True
End Sub
実行結果
上記サンプルコードを実行すると、マクロが動作しているブックの1番目のシートを削除します。警告はありません。
シートの表示・非表示(Visibleプロパティ)
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetVisible()
ThisWorkbook.Worksheets(1).Visible = False
End Sub
実行結果
上記サンプルコードを実行すると、マクロが動作しているブックの1番目のシートを非表示にします。
シートの移動またはコピー(Moveメソッド、Copyメソッド)
引数 | 働き |
---|---|
[Before] | シートを指定するとそのシートの前にシートを移動またはコピーする。指定しないと操作中のシートを指定したことになる。 |
[After] | シートを指定するとそのシートの後にシートを移動またはコピーする。指定しないとBeforeを指定したことになる。 |
サンプルコード(クリックでコピー)
Private Sub Test_WorksheetCopy()
Call ThisWorkbook.Worksheets(1).Copy(Before:=ThisWorkbook.Worksheets(1))
Call ThisWorkbook.Worksheets(1).Move(After:=ThisWorkbook.Worksheets(2))
End Sub
実行結果
上記サンプルコードを実行するとマクロが動作中のブックの1番目のシートを1番目のシートの前に「コピー」します。その後、1番目のシートを2番目のシートの後に「移動」します。
Comment