作成日 2008/5/6
最終更新日 2008/10/26
Excelライブラリを理解する
このページではExcelライブラリを理解するにあたって、おさえおくべき点を説明します(※1、※2)。
Excel上で動作するアプリケーションを作成する際は、恐らく、Excelの機能を使用すると思います。そのため、設計時にある程度Excelで何が出来るのか、何が出来ないのかを知っておかないと、既にあるものを設計してしまったり、実装不可能な設計をしてしまいます。そうならないよう、設計時に必然的にExcelVBAのヘルプを見たりして、理解することになると思いますが、ポイントを知った上でヘルプを見た方が理解が早くなると思います。
-----
※1:オブジェクト指向設計、オブジェクト指向プログラミングとVBAの文法もおさえておくべき点ですが、それらについてはこのページでは説明しません。Visual
Basic
Editorの説明についてもこのページではしません。
※2:「だるまが始めてExcelVBAにてプログラムを組んだときに困った点や使えると思った機能を説明します。」といった方が良いかもしれません。
いきなりExcelライブラリやOfficeライブラリにて提供されているクラスを使用してプログラムを組むのは難しいです。なぜならば、どこに何のクラスがあり、構成がどのようになっていて・・・、ということを知っていなければプログラムを組むことが出来ないからです(その前に設計が出来ないと思います。)。しかし、Excelにはマクロの記録機能というものが付属していて、分からないことがあった場合はこれを使用すれば大抵のことは分かってしまいます。
ただし、マクロの記録機能は完璧ではありません。マクロの記録機能で生成したコードに関して、以下の点に注意した方が良いです。
- マクロの記録機能で生成したコードは余計なコードが多いです。
そのため、マクロの記録機能で生成したコードを理解する力が求められます。
- マクロの記録機能で生成したコードは実行スピードが遅いです。
余計なコードが多いのと、画面の更新をとめる処理(Application.ScreenUpdating =
False)が入っていないため、遅いです。実用的なコードではないということを覚えておいた方がよいと思います。
- マクロの記録機能では生成されないコードもあります。
挙げたらきりが無いのですが、ステータスバーの更新(Application.StatusBar =
"...")などや、ユーザフォーム関係のコード、イベント処理関連のコードは、マクロの記録機能では恐らく生成されないと思います。
Excelライブラリのヘルプについているサンプルを実行し、理解するしかないと思います。
Excelの機能を使用するには機能を提供するクラスのオブジェクトを取得する必要があります。そのためにはオブジェクトの構成を把握しておく必要があります。
たとえば、現在、アクティブになっているワークシートのA1セルの条件付書式1に設定されている数式を取得するには、
ActiveSheet.Range("A1").FormatConditions(1).Formula1
とする必要がありますが、オブジェクトの構成を知っていないとこんなコードは書けません。
しかし、そう簡単にオブジェクトの構成が分かるわけでもないので、その場合はマクロの記録機能を使用して調べましょう。これである程度は分かります。
駄目なら、Googleで調べ、それでも駄目なら、エクセルの画面を構成している要素(セルなど)の正式名称をもとに、VBAのマニュアルに載っている「Microsoft
Office Excel オブジェクト モデル」を見るか、オブジェクトブラウザを見るか・・・(大変だけど)。
VBE(Visual Basic
Editor)のオブジェクトブラウザを見るとクラス名が”s”で終わるクラスがたくさんあるのに気がつくと思います(※1)。それらのクラスは、コレクションクラスで、単体のオブジェクト(例えば、WorkbookオブジェクトやWorksheetオブジェクト)を管理するクラスです。
コレクションクラスには単体のオブジェクトの生成、取得、所属する単体オブジェクトすべてに対して処理を行うメソッド(※2)が定義されています。
コレクションクラスのオブジェクトに対してはFor Each文を適用できます。
コレクションクラスの多くは下記のメソッドorプロパティを提供しています。
- Countプロパティ
コレクションに含まれている単体のオブジェクトの個数を返します。
- Itemプロパティ
名前、もしくは番号よりコレクションに含まれている単体のオブジェクトへの参照を返します。
- addメソッド
単体のオブジェクトを生成し、コレクションに含めます。戻り値は生成したオブジェクトへの参照です。
addメソッドの引数はクラスによってまちまちのようです。
-----
※1:ちなみに、Javaはこのようなクラス構成ではないです。
※2:例えば、Workbooksオブジェクトのcloseメソッドを呼び出すと、すべてのWorkbookが閉じられます。
new出来ないクラスが多いというか、ほとんどのクラスはnew出来ないです。
(new出来るクラスは自分で作成したクラスかVBAライブラリのCollectionくらいしか、だるまは知らないです。)
具体的には
Sub aaa()
Dim wb As
Workbook
Set wb = New Workbook
End
Sub
|
は、コンパイルは成功するのですが、実行は出来ないです(実行時エラーが発生します)。
■newできない理由(注意:だるまの考えです):
ワークブックの生成・破棄はExcelが管理する必要があります。
勝手にnewされたら、Excelが管理できなくなってしまいます。
WorkbookオブジェクトはWorkbooksオブジェクトが管理していますので、Workbooksクラスのaddメソッドを通して行うようにしたのだと思います(※1)。
他のクラス(例えば、Worksheet)も同じです。RangeクラスのオブジェクトはWorksheetクラスを生成すると勝手に作成されるため(※2)VBAプログラマが作成する必要はありません。
ワークブックの作成は以下のようにします。
Sub aaa()
Dim wb As
Workbook Set wb =
Application.Workbooks.Add
End
Sub
|
-----
※1:Workbookのオープン(*.xlsファイルのオープン)も、Workbooksクラスに定義されているメソッドを通して行います。
※2:「RangeクラスのオブジェクトはWorksheetクラスを生成すると勝手に作成されるため」と書きましたが、正確には正しくないです。そんなことをしたらファイルを保存したときのファイルのサイズがとんでもなく大きくなってしまいます。VBAプログラマからはWorksheetクラスの作成時にRangeクラスのオブジェクトが生成されているように見えるのですが、初めて該当のRangeオブジェクトにアクセスしようとした際に作成されている可能性があります。ちなみに、
POIでは
プログラマが行やセルを作成する必要があります 。
エクセルVBAやVB6.0ではクラスを継承して新しいクラスを作成することが出来ません。
が、既に用意されているライブラリはクラス間に継承関係がある場合があるようです。
このような場合、VBAのヘルプを見ると「○○(親クラスの名前)オブジェクトのプロパティとメソッドはすべて□□(子クラス1の名前)、△△(子クラス2の名前)、および◇◇(子クラス3の名前)オブジェクトで共有されます。」と書いてある場合があります。
継承関係がある場合、VBAソースを書く場合は、
Dim obj As 親クラスの名前
Set obj =
子クラスのオブジェクトの取得メソッドの呼び出し |
という感じで、親クラスで宣言したオブジェクト型変数に子クラスのオブジェクトへの参照を代入するソースを書くことが出来ます。
クラス間に継承関係があるクラスとしては図1のものがあります。
図1 コマンドバーコントロールの継承関係(図をクリックすると拡大して表示します)
VBAはプログラムを作成する際、使用しているクラスやメソッドがどのライブラリに属するものなのかを把握しなくても良いようになっています。しかし、だからといってライブラリについて何も知らなくても良いかというとそんなことはありません。
良く使用するライブラリについては、どのようなものなのかを理解しておくと、クラスの理解が速くなりますし、WordVBAやAccessVBAを勉強する際に、理解が速くなります。
- VBAライブラリ
エラーオブジェクト(ErrObjectクラス)や可変長配列(連想配列としても使用可能)(Collectionクラス)があります。
そのほか、ファイル・ディレクトリ関連の関数(FileSystemモジュール)や日付関係の関数(DateTimeモジュール)、数学関数(Mathモジュール)、文字列操作関数(Stringsモジュール)、型変換関数(Conversionモジュール)などプログラムを作成する上での基本的なクラスや関数を提供しています。
ExcelだけでなくWordなど、他のOfficeアプリケーションのVBAでも使用します。
- Officeライブラリ
コマンドバークラス(CommandBarクラス)やアシスタント(例えばカイル)クラス(Assistantクラス)などがあります。
ExcelだけでなくWordなど、他のOfficeアプリケーションのVBAでも使用します。
- Excelライブラリ
WorksheetやRangeなどワークブックを構成するクラス、ApplicationクラスのようにExcelの情報を保持・設定するクラスなどがあります。
- MSFormsライブラリ
ユーザ定義のダイアログを作成する際に使用します。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メールをお願いします。
Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS
X は米国Apple Computer,Inc.の登録商標または商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
OMG、UML、Unified Modeling
Languageは、Object Management
Groupの商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。