Excelのクラスの説明

Excelが持つクラスにどんなものがあるか、それらのドキュメントの調べ方を説明しておく。

オブジェクトブラウザ

RubyからExcelを制御するときには、Excelが持つクラスの構成と各クラスが持つメソッドを調べないといけない。 そのツールには「オブジェクトブラウザ」を使う。

  • オブジェクトブラウザはExcelのVisual Basic Editorを起動すると利用できる。VB EditorはExcel上で [ツール/マクロ/Visual Basic Editor]メニューを選択することで起動できる。
  • その後、以下のボタンで「オブジェクトブラウザ」を起動できる。

オブジェクトブラウザのボタン

  • アプリケーションを選択するリストボックスがあるので、"Excel"を選択する

オブジェクトブラウザでExcel選択

  • 左下にずらっと並んでいるのがExcelの持つクラスの一覧、右がそのクラスが持つメソッド/プロパティ/イベントの一覧だ

オブジェクトブラウザで目的のクラスを探すにはちょっとコツがいる。まずはいくつかキーになるクラスを覚えておく。

Workbook
Excelのワークブック。
Worksheet
Excelのワークシート。
Range
Excelのセルやセルの集合。

例えば、セルに関する操作なら、オブジェクトブラウザでRangeクラスを調べて、メソッド一覧を眺めて、それっぽいメソッドを みつけてF1キーでヘルプを表示させれば、なんか見つかるかも。

クラス間の親子関係がわかってくると、もうちょっと探しやすくなる。

例えば、セルを指すRangeはワークシートに属するので、Rangeの親はWorksheet。また、セルの罫線などはセルに属するから、Rangeの 子孫に罫線を示すクラスがあるはず。 このようなあたりをつけてクラスやメソッドを探していく。

まぁ、これはちょっと慣れてきてからの方法。

マクロの記録機能で調べる

もうひとつのExcelのクラス/メソッドを調べる方法は、マクロの記録機能を使って、実際の操作をVBマクロに変換し、 どんなマクロを使えばいいか調べる方法。

例えば、セルの背景色を変える方法を調べてみる。

  • [ツール/マクロ/新しいマクロの記録]メニューを選択
  • 実際にセルの背景色を変えてやる
  • マクロの記録停止ボタンを押す
  • [ツール/マクロ/マクロ]メニューで先ほど記録したマクロの中身を表示させる。こんな感じ。
  1: Sub Macro1()
  2:    Range("F11").Select
  3:    With Selection.Interior
  4:        .ColorIndex = 6
  5:        .Pattern = xlSolid
  6:    End With
  7: End Sub
  
  • これを読み取るにはVBAの文法を多少知ってないといけないのだが、3行目のWithというのは、Withで囲まれた部分のメソッドや プロパティを適用するオブジェクトを省略できるようにする文だと思う*1
  • 3:のSelectionは選択中のオブジェクトを指す。どうやら、省略されているけどApplicationクラスのオブジェクト、つまりExcel そのものだろうとしておこう。
  • ということは、3:のSelectionは2:でSelectされたRange("F11")を指していると予想できる。実際、Selectionはセルだけでなく、 図形なども返せるのだが、Selectionが返すオブジェクトの表記に置き換えてもたいてい問題ない*2
  • Range("F11")も適用先のワークシートオブジェクトが省略されている*3
  • この辺を踏まえて、先ほどのスクリプトは以下のように書き換えることができる。
  1: Sub Macro1()
  2:   Range("F11").Interior.ColorIndex = 6
  3:   Range("F11").Interior.Pattern = xlSolid
  4: End Sub
  
  • これから、背景色はRange#Interior でInteriorオブジェクトを得て、InteriorクラスのColorIndexプロパティで色を指定する ことがわかる。
  • ここまでわかった時点でオブジェクトブラウザでInteriorクラスを調べてどんなプロパティがあるか調べれば、Interiorクラス で何が変えられるかわかる

WIN32OLEへの置き換え方

先ほどのようにVBAを単純化すると、Rubyへの置き換えも機械的にできる。

ここでのポイントは、

  • Excelを起動するには、WIN32OLE.new('EXCEL.Application')で、これはApplicationオブジェクト
  • クラス間の親子関係から、Applicationオブジェクト → Workbookオブジェクト→Worsheetオブジェクト→Rangeオブジェクト とたどっていくのが基本
  • 子供オブジェクトを得る方法はオブジェクトブラウザで調べる(最初はカンをある程度働かせる必要があった)

Rangeへの道程

  • このへんを踏まえて、Rubyで書き直すと、こうなる。
  01: require 'win32ole'
  02: 
  03: class Excel
  04: end
  05: 
  06: excel = WIN32OLE.new('EXCEL.Application')
  07: WIN32OLE.const_load(excel, Excel)
  08: excel.visible = true
  09: book = excel.workbooks.add('c:\temp\test.xls')
  10: sheet = book.worksheets(1)
  11: range_01 = sheet.range("F11")
  12: range_01.Interior.ColorIndex = 6
  13: range_01.Interior.Pattern = Excel::XlSolid
  

解説する。

  • 3:〜4:は7:で定数のロード先のクラスを用意しているだけ
  • 6:でExcelを起動。ただし、この時点では不可視属性なので、ウィンドウは表示されない
  • 7:はExcelの定数をExcelクラスにロードしてる。定数はExcel::XlSolidのように書けばアクセスできる
  • 8:で可視化している。visibleはApplicationクラスのメソッド(Excel的にはプロパティ)。
  • 9:はワークブックを開いている。ここで注目すべきはファイル名はフルパスでないといけないのと、表記方法はRuby形式ではない ということ。Excelが理解できる形式でないといけない。
  • しかし、ワークブックを開くのに、Workbooks.addというのはしっくりこないね。Workbooksはワークブックのコレクションを 返すメソッド。コレクションはリストのようなもの。リストにaddすれば追加されて、ワークブックが開くというわけだ。
  • 10:〜13:はまぁ、見たとおり、Rangeを得て、背景色を設定している。13:にある"Excel::XlSolid"は7:でロードしたExcelの 定数を利用している。VBAでは"xlSolid"となっているが、Rubyでは定数は大文字ではじまらないといけないので、"XlSolid"と なっている。この辺の変換はWIN32OLEがやってくれている。

Excelのよく使うクラスとメソッド

Excelでよく使う基本的なクラスとメソッドをちょこっと載せておく。オブジェクトブラウザで調べるコツをつかむきっかけになれば いいのだが。

Applicationクラス

ApplicationクラスはExcelアプリケーションそのもの。まず、これを開いて、ワークブック、ワークシート、セルオブジェクト*4を得ることができる。

visible
Excelアプリの可視属性。visible=true にすることで、ウィンドウが表示される。
displayAlerts
Excelのいろんな警告ダイアログの表示を制限できる。displayAlerts=falseにしておかないと、終了時などに「上書きしますか?」とか聞いてきてしまう ため、スクリプトでファイルを自動生成するときに困る。
Workbooks
ワークブックのコレクション。現在、開いているワークブックを得るだけでなく、新しくワークブックを追加するときは"excel.Workbooks.add()"、 ワークブックを開くときは、"excel.Workbooks.open()"を使う。 なんとなく、ワークブックの追加ならexcel.add_workbook()やexcel.open_workbook()のような気がするんだが。
Selection
選択されたものを返す。セルが選択中ならRangeオブジェクトを返す。

Workbookクラス

WorkbookクラスはExcelのワークブックを指すクラス。excel.workbooks.open(filename)で既存のExcelファイルを開き、その開いたWorkbookオブジェクトを得る。 ワークブックに関する操作はこのクラスのメソッドを使う。保存や印刷だけでなく、ワークシートへのアクセスを提供する。

Save()
SaveAs()
ワークブックを保存する。
PrintOut()
ワークブックを印刷する。
Worksheets
ワークシートのコレクション。現在、ワークブックが保持しているワークシートへのアクセスはこのコレクションを使う。 n番目のワークシートはWorkbook.worksheets.item(n)で得られる*5。"Sheet2"という名前のワークシート はWorkbook.worksheets.item("Sheet2")でアクセスできる。

Worksheetクラス

Excelの各ワークシートをあらわすクラス。主にRangeクラスを得るための土台。 ワークシート全体にかかわる操作はこのクラスのメソッドを使う。

Range()

セルや複数のセルの集合を返すメソッド。引数に"A1"や"E8:G10"を指定すれば、そのRangeを返す。 あらかじめセルに名前をつけておけば、Worksheet.Range("範囲名")のように指定することもできる。

ちょっと変わった指定で、Worksheet.Range(Worksheet.Cells(4,1),Worksheet.Cells(4,4)) という方法で複数のセルの集合を指定できる。

Cells(v_pos,h_pos)
こちらは座標でセルを指定する時に使う。
Name
ワークシートの名前を参照したり、変更したりする。

Rangeクラス

セルまたはセルの集合を指すクラス。セルへの操作はこのクラスのメソッドを使う。

Value
セルに書き込まれている文字列、値を読み出したり書き込んだりする。
Borders
セルの罫線を示す。どこの罫線かは引数で指定する。罫線を示すBorderクラスを返す。
Interior.ColorIndex
背景色。
Copy/Cut/Delete/Paste
セルをコピー/カット/削除/ペーストする。
Height/Width
高さと幅を返す。
Row/Column
Rangeオブジェクトの座標を返す。Rowが縦方向の座標。Columnが水平方向の座標。


戻る


*1自分もVBAをまじめに勉強したことが無いので、VBAに 関することはほとんど推測。
*2オブジェクト指向って ありがたいなぁ。
*3うーん、Applicationが省略される場合と、ActiveSheetが 省略される場合があるみたいだが、実際どういうルールになってるんだろう。
*4ワークブックはExcelの 1ファイルのこと。ワークシートはワークブックに含まれる各シートのこと。セルはワークシート上のセルのこと(定義になってないが)。 複数のセルの集まりをRangeと呼ぶ。
*5Workbook.worksheets(n)という表記も同じ。