Script事業案内エクセル以外トップマクロVBAVBAクラス入門VBAクラス入門:クラスとは?オブジェクト指向とは?最終更新日:2019-11-25VBAクラス入門:クラスとは?オブジェクト指向とは?VBAを覚えて、いろいろ作りながらネットで調べたりしていると、クラスとかオブジェクト指向といった言葉に出くわします。ジュール」は気になっていたかもしれません。このクラスモジュールを使ってクラスを作ります。作ったクラスがオブジェクトになります。言葉を尽くしても、これらクラスやオブジェクト指向を完全に説明しつくすことは難しいでしょう。これらクラスやオブジェクト指向は、エクセルVBAで作業を自動化する上で特に必須という事はありません。そもそもエクセルそのものがオブジェクトの集まりで出来ています。エクセルのシートもセルもそれらが全てオブジェクトであり、それがクラスであり、オブジェクト指向で作られています。VBAを理解する上で、クラスの理解やオブジェクト指向の理解は必ず役に立つものです。オブジェクトとは操作対象の事ですと説明されたりしますが、まずは何かの物体、つまりは対象物と理解すれば良いでしょう。ワークシート、セル、グラフ、これらが全てオブジェクトです。対象物を部品を使って組み立てるように表現してプログラミングしていく事になります。心配はいりません、少なくともVBAでは、継承も多態性も使えないのですから、(継承としてはインターフェースだけ使えますが、急ぎ覚える必要はないでしょう。)従って、カプセル化だけを意識すれば良いのです。カプセル化カプセル化とは、関連するデータやその操作を一つ(カプセル)にまとめることを言います。関連するものを一つのカプセルとしてまとめ、それを使いまわすことになります。これは概念的なものになりますので、くどくど言葉で説明してもなかなかピンとこないかもしれません。わかりづらいのは、「関連する」というのが抽象的過ぎるということだと思います。人によって関連の範囲は変わってくることになります。人によってクラスの作り方も変わってくるということです。同僚、学校の同級生、近所の住人・・・どこまでを想像し、どこまでを一つにまとめるかは、人それぞれ違ってきます。全部を一つにまとめても良いし、それぞれを別々にまとめても良い。まとめる範囲が違えば、必要な操作も変わってきます。どれが適切なのかの正解はないことがほとんどです。実践の中で、自ら模索し決定していくことになります。カプセル化の重要な要素として、「隠蔽」があります。必要な情報のみ外部に公開し、不必要なものは非公開として隠蔽するのです。透明なカプセルではなく、不透明なカプセルを作るということです。専用の出入り口(これがプロパティ)を作ります。その出入口は、入り口専用・出口専用にすることもできます。カプセルの中を操作できないようにしておき、カプセルの中を操作したいときは、カプセルについているボタンを押して操作(これがメソッド)できるようにします。オブジェクト指向とカプセル化とクラスオブジェクト指向のプログラムを作るにはクラスが必要です。いいますか、オブジェクト指向で独自オブジェクトを作るためにクラスが存在しています。意識すべきはカプセル化だと言って良いでしょう。・関連するデータやその操作を一つにまとめる。・必要な情報のみ外部に公開し、不必要なものは非公開として隠蔽。勘違いしてほしくないのは、クラスを使えばカプセル化できるわけではないということです。キャビネットを買ったからと言って事務所が整理されるわけではありません。一つのキャビネットには関連するものを整理して入れ、扉を閉めておく。これは人間がやることであり、これをやらなければいみがありません。キャビネットに適当にものを入れて扉を開けっぱなしでは、単に物の場所を移動しただけです。そんなことなら、キャビネットは必要ありません。クラスを使ってカプセル化したオブジェクトを作るということです。「プログラムの強度や凝集度は高まり、結合度は下がる」これが利点と言われても、まあ大抵の人は「何それ」ってことになるはずです。そもそもクラスを使用しないと実現できない処理はありません。結果としての全体動作だけなら、別の手段で実現可能です。(細部まで完全に同じ動作になるかは別として)クラスがどうしても必要になる処理としては、RaiseEventで、自作のイベント処理を作るような場合ですと、クラスが良いのですが、これとて、他の方法で実装できるものがほとんどになるはずです。※RaiseEventの説明は割愛します、興味のある方は別途調べて下さい。VBAクラスを使う事で、ユーザー定義イベントを作成したり、動的にイベントを割り当てる事が出来ます。ユーザー独自のイベントを作成したり、フォームに動的に追加したコントロールにイベントを設定することができます。EventステートメントとRaiseEventステートメントを使う事で、ユーザー定義イベントつまりユーザー独自のイベントを作成できます。無くてはならないものではなく、使えれば便利なものだということです。逆の言い方をすれば、クラスが使いこなせるようになると、これほど便利なものはなく、もし一切クラスを使わずに作れと言われると困ってしまうくらいの存在となります。以下はMicrosoftサイトでの説明文の抜粋を引用しています。オブジェクトの概要オブジェクトは、データおよびそのデータを操作するメソッドを含む構造体のことです。Basicで行うほとんどすべての作業は、オブジェクトにかかわっていますclassはある対象の抽象表現であり、オブジェクトはそのクラスを表す実例です。Basicの各オブジェクトは、クラスによって定義されます。クラスは、オブジェクトの変数、プロパティ、プロシージャ、およびイベントを記述します。オブジェクトはクラスのインスタンスです。クラスを定義すると、必要な数のオブジェクトを作成できます。クラスを定義したら、必要な数のオブジェクトを作成することができます。オブジェクトとそのクラス間の関係を理解するために、クッキーの抜き型とクッキーを考えてみましょう。クッキーの抜き型はクラスです。クラスを使用して、オブジェクトを作成します。オブジェクトはクッキーです。メンバーにアクセスする前に、オブジェクトを作成する必要があります。※ほほ原文のままインスタンスについての補足しますインスタンスとは実体の事です。クラスはあくまで型であり実態を持っていません。クラスで作った実体がインスタンスでり、それがオブジェクトです。短くまとめると、クラスは型(オブジェクトの設計図)で、型を使って実体化(インスタンス)したものがオブジェクトです。オブジェクトとは、クラスのインスタンスであるという事になります。これがなかなか実感として理解しづらいかもしれません。イメージですが、以下のようなとらえ方をしても良いでしょう。一般名詞と固有名詞、こんな違いとして認識しても良いかもしれません。一般名詞は特定のものを指しません、物や概念を指すものです。固有名詞は、特定のものであり、唯一のものです。一般名詞は実体を伴わない概念であり、固有名詞は特定の実体を指しています。漠然とこんな感覚でとらえても良いでしょう。以下では、自動車というクラスを作る場合の例えになります。排気量このように、プロパティはオブジェクトの性質を表すデータになります。自動車クラス自動車オブジェクトを作るには、自動車クラスのインスタンスを生成することで作成します。4,000ccこれで上で設定したような仕様の自動車が出来上がるという事です。出来上がった自動車で、いろいろな事をしていくことになります。作成したクラスを使う時のVBAの具体的な記述について説明します。FileSystemObjectFileSystemObjectこれがクラスです。FileSystemObjectこれでインスタンスが作成され、つまりオブジェクトとして使えるようになります。objFSOがオブジェクトとして使用可能となります。FileSystemObject、これだけでは、オブジェクトとして使用できません。インスタンスを生成して、初めてオブジェクトとして使用できるようになります。FileSystemObjectこれは、型の定義とインスタンスの生成をまとめて行っている事になります。同じクラスのオブジェクトは、いくつでも作る事が出来ます。同じクラスから、複数のインスタンスが生成できます。変数1と変数2は、同じクラスからインスタンス生成した、別々のオブジェクトです。自動車というクラスをもとに、セダンやSUVを作り出すという感じで理解すれば良いでしょう。クラスを体験してみるいろいろと説明してきましたが、これらを延々と文章で説明しても、かえって混乱するだけのようにも思えます。「百聞は一見に如かず、百見は一行にしかず」とにかく「やってみる」という事も時には重要な事だと思います。第12回.エクセルの言葉を理解する(オブジェクト、プロパティ、メソッド)VBAを書いて実行すると、何やら難しい日本語らしきメッセージが表示されることがあります。エクセルが何かを伝えようとしている訳ですが、何を言っているのかを理解してあげなければエクセルがかわいそうです。かわいそうと言うのはともかくとして、エクセルが表示するエラーメッセージの言葉の意味くらいは知っておきたいところです。このページくらいは理解していることとして説明をしていきます。実際にクラスを作っていきましょう。クラスを作ると言う事は、オブジェクトを作ると言う事です。モジュール」ショートカットはAlt→I→Cプロジェクトウインドウで右クリックからも挿入できます。クラス名の変更プロパティウインドウのオブジェクト名で変更します。Getプロパティの値を取得するプロシージャです。取得とは、クラスを使う側(オブジェクトを使う標準モジールのプロシージャー)から見て取得ということです。Range("A1").ValueこのValueプロパティがGetです。Letプロパティの値を設定するプロシージャです。設定とは、クラスを使う側(オブジェクトを使う標準モジールのプロシージャー)から見て設定ということです。100このValueプロパティがLetです。Setプロパティのオブジェクトを設定するプロシージャです。オブジェクトの場合は、Letではなく、Setになります。GetとLet、または、GetとSetは同一の名前が使えます。通常は、同一名にして、ペアで作成します。値の設定と取得を同じプロパティ名にすることで使いやすくできるという事です。RangeのValueプロパティには、GetとSetがあるので、設定と取得が同じValueで使えています。読み取り専用プロパティとは、Getプロパティのみのプロパティになります。RangeのAddressプロパティは設定できません。Getのみの読み取り専用プロパティということです。メソッドの作成Subステートメント、Functionステートメントで作成します。標準プロシージャーでの扱いと同様になります。クラス内にPublicで定義されたSubまたはFunctionは、そのクラスのインスタンスを経由して使用することが出来ます。Publicは、クラス外から使えるメソッドになります。Privateで定義されたメソッドは、クラス外から直接使う事はできません。メソッドは、そのオブジェクトに何らかの動作をさせるものです。Rangeオブジェクトであれば、DeleteInsertAutoFilterこれらのように、そのオブジェクトに何らかの振る舞いをさせるものになります。以下は、独自のワークシートを作るクラスです。クラスモジュールを挿入し、貼り付けて下さい。SubMySheet扱うシートを設定・取得できるようにしているプロパティです。Nameシート名を変更・取得できるようにしているプロパティです。MyRangeセル範囲を(開始セル,行数,列数)で指定できるようにするプロパティです。Getだけなので、読み取り専用プロパティとなっています。MyCellsセルを(行位置,列位置)で指定できるようにするプロパティです。Getだけなので、読み取り専用プロパティとなっています。CurrentBorders指定セルのアクティブセル領域に罫線を引くメソッドです。戻り値が必要ないので、Subプロシージャーで作成しています。標準プロシージャーで上のクラスを使う場合です。Withクラス入門の最後に最初は遊びがてら、上記のコードをいじってみるところから初めてみると良いと思います。書籍やWEBで、しっかりクラスを理解しようとしてもかなりの苦労が待ち受けているだけだと思います。標準モジュールでも簡単に実現できるような簡易なコードから使い始めれば良いでしょう。書いている通り、クラスは無くてはならないものではありませんので、VBAの基本及び応用において、一通り習得できた後にチャレンジしてみるくらいで十分です。以下はクラスに関する解説およびクラスのVBAサンプルです。VBAクラスの作り方:列名の入力支援と列移動対応クラスを使う良さとして、入力支援が使えてコーディングが楽になるという利点があります、列番号をクラスに持てば、列名が候補表示されて非常に便利です。これを実装するには、かなりの手間がかかります。クラス作成に手間をかけて、その後を楽にするということになります。VBAクラスの作り方:列名のプロパティを自動作成するクラスに列名のプロパティを作成することで、入力支援が使えてコーディングが楽になりますが、列数が多くなればVBAの記述量が増え、コーディングが大変になります。入力支援が使えるのは良いが、その事前準備があまりに大変ではやる気が失せてクラス作るのが面倒になってしまいます。VBAクラスの作り方:独自Rangeっぽいものを作ってみたクラスの作成は、標準モジュールで作成していた時とは様相が違い戸惑う部分も多いと思います、それは、初めてVBAに取り組んだ時の戸惑いと同じかもしれません。最初はとにかく慣れることが一番です、細かい文法や機能は、少し慣れてから改めて学んでも遅くはありません。クラスを使って他ブックのイベントを補足するVBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。開いている全ブックまたは、他の特定のブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って全ブックまたは他ブックのイベントを補足する方法につ...クラスとイベントとマルチプロセス並列処理エクセルVBAではマルチスレッドによる並列処理はサポートされていません、つまり通常は順序良く直列に処理していくしかありません。処理時間が多大にかかるような処理も現実には存在しているため、エクセルVBAで並列処理したいという要望も出てきます。クラスとCallByNameとポリモーフィズム(多態性)VBAの使い方が進んでいくとクラスを使うようになっていきます。クラスを使うようになるとオブジェクト指向という言葉に出会い、オブジェクト指向を学んでいくとポリモーフィズム(多態性)という言葉に出会います。オブジェクト指向における多態性の説明としては、メソッドの呼び出し時に、メソッドが属するオブジェクト(クラス)の種類によって呼び出し先の実装コードが選択され、オートフィルタを退避回復するVBAクラスシートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAでは、何かと注意が必要になります。このような場合、オートフィルタを解除するか、フィルタ絞り込みをクリアして対応している事が多くなります。オートフィルタを解除したり、フィルタをクリアしてしまうと、それまでの絞り込み条件が消えてしまい、オートフィルタ退避回復クラスを複数シート対応させるVBAクラスシートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAは何かと面倒になります。これはシートが一つしか扱えません。複数シートで使う場合は、シートごとにクラスのインスタンスを作成する必要があります。コレクション(Collection)の並べ替え(Sort)に対応するクラスオブジェクトを扱う事が多くなってくるとコレクション(Collectionオブジェクト)を使う機会も増えてくると思います。配列やディクショナリー(Dictionary)を使ったほうが良い場合も多くはありますが、単純にオブジェクトを保管し、順序通り(FIFO)に処理するだけなら、とても扱いやすい場合もあります。VBAクラスのAttributeについて(既定メンバーとFor...Each)VBAクラスをエクスポートすると各種のAttributeが設定されているのが確認できます。それぞれのAttributeの意味と、さらに追加で指定できるAttributeについて説明します。Next)|VBA入門7.マクロって何?VBAって何?|VBA入門8.セルに文字を入れるとは(Range,Value)|VBA入門9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説10.ひらがな⇔カタカナの変換|エクセル基本操作トップマクロVBAVBAクラス入門VBAクラス入門:クラスとは?オブジェクト指向とは?このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用トップマクロVBAVBAクラス入門VBAクラス入門:クラスとは?オブジェクト指向とは?このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。