Excelアプリをマウスで操作しますが、操作している対象はVBAから扱えるオブジェクトです。左の赤い枠がExcelのオブジェクトモデルです。右のVBAには、そのオブジェクトモデルの一部が見える。左の赤枠の階層構造は何となく覚えておけば、VBAのコードを書く時にリストから選ぶことができる。
Excelのオブジェクトは、画面と関連して名前を覚える。画面では見えないトップのApplicationから順に階層の構造になっている
マクロ記録では得られない情報です。オブジェクトとコレクションの操作を説明します。
Workbooksオブジェクトは、Excelファイルのこと。単語の最後にsが付く複数形は、コレクションと言う。複数のオブジェクトの集合でExcelが開いているxlsファイル/ワークブックをWorkbooksで管理できる。コレクションは、Countプロパティは持っている。また、コレクションの特定のオブジェクトを使う場合は、()を付けて1から始まる数値か名前を使う。
同様に、Worksheetsもワークブック内の全ワークシートを操作できる。以下はイミディエイトウィンドウで入力する。?から始まる行を入力。その下が出力結果。「’」から始まる文字列はコメントなので不要。
?application.Workbooks.Count '入力行、ワークブックの個数を調べる。
1
?application.Workbooks(1).Sheets.Count 'ワークシートの個数
3
?application.Workbooks(1).Worksheets(1).name 'Worksheetsの1は、Index番号
Sheet1 '1つ目のワークブックの1つ目のワークシートの名前
?application.Workbooks(1).Worksheets("sheet1").index 'Index番号の確認
1
?application.Workbooks(1).Worksheets("sheet1").name
Sheet1
ワークブックは、「メニュー/ファイル/開くで(??.xls?)」ファイルを読み込むとワークシートが現れる。ワークブック(ファイル)の中にワークシートが前図の例では3つ(Sheet1,Sheet2,Sheet3)ある。
通常は、Excelを起動するとすぐに使えるオブジェクトも準備している。つまり、ワークブックを開いているのでSheet1やSheet2が使える。しかし、次図のようにワークブックが無い状態だと、ワークシートもないのでプロジェクトエクスプローラには何のオブジェクト( Sheet1 など)も無い。起動しているのはApplcationオブジェクトだけ。
この状態では、「メニュー/ツール/参照設定」もできないのでオブジェクトが無いのでF2オブジェクトブラウザも起動しない。
上図の状態は、VBAだと確認しやすい。というのは、マウス操作でExcelを起動すると何かファイルを選ぶため。
以下をイミディエイトウィンドウに入力すると上図のワークシート無しのExcel(Applicationオブジェクト)だけを見ることができる。
set x=new Excel.Application ‘Bookを持たないExcelを起動する
x.visible=true ‘Excelを見えるようにする
次図は、マウス操作でワークブック(Excelファイル)を2つ読み込んでいる。手前と背面にワークブックがある 。
まず2つのExcelが動いているように見える。これをイミディエイトウィンドウで確認する。
?excel.Application.Workbooks.Count
2 '2つのファイルを開いている
?excel.Application.Workbooks(1).Name
Book1.xlsx
?excel.Application.Workbooks(2).Name
Book2 '保存してないと拡張子xlsmが無い
ワークシート(Sheet?)タブの他にGraph?が見える(Graph?を作るには、グラフを作って右クリックメニューで「グラフの移動」を選択、「新しいシート」を選択)。Sheetsコレクションは、Chartsも含む。Sheets≠Worksheetsである。Chartsが無ければ結果的にSheets=Worksheetsとなる。クラス名で言えばSheetの方が守備範囲が広い。
オブジェクトの複数形は、コレクションという。
Workbookの複数形Workbooks
Worksheetの複数形Worksheets
オブジェクトを扱う時は、2通りの扱い方がある。
- 直接オブジェクト名を扱う
- コレクションのIndex番号か名前(Excel本体のワークシートのタブの文字列)を使う
オブジェクトの名前は、次図のSheet1やSheet2などでVBEでないと見えれない。
コレクションは、Index番号や名前を使って個々のオブジェクトとしても使える。
?excel.Application.Workbooks.Count?
2 '2つのファイルを開いている
?excel.Application.Workbooks(1).Name
Book1.xlsx
?excel.Application.Workbooks(2).Name
Book2 '保存してないと拡張子xlsmが無い
?application.Workbooks(2).sheets.Count
5
excel.Application.Workbooks(2).worksheets.Count
3
?application.Workbooks(2).charts.Count
2
先にBook2のどこかのセルをクリックしてから以下を実行する。ブックを選択していると「application.Workbooks(?).」を省略できる。以下は、イミディエイトウィンドウ。
?excel.Sheets.Count
5
?excel.Workbooks.Count
3
?excel.Charts.Count
2
あるワークシートを選択していると「application.Workbooks(?).Worksheets(?)」を省略できる。