- ベストアンサー
VBAオブジェクト追加
- VBAで既存のオブジェクトをカスタマイズする方法について紹介します。詳細な手順やコーディングの参照リストへの追加方法なども解説します。
- VBAでは、既存のオブジェクトに独自のオブジェクトメンバを追加することができます。具体的な例として、aaaオブジェクトの下に新たなオブジェクトやプロパティを配置する方法を説明します。
- VBAのコーディング時に、一貫性のあるコーディングを実現するために、オブジェクトのカスタマイズや参照リストへの追加が必要な場合があります。この質問では、aaaオブジェクトに新たなオブジェクトメンバを追加し、関連のあるオブジェクトやプロパティを配置する方法について解説します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 > この場合同一プロジェクト内でもこう言った細工が出来ますでしょうか? 私自身は殆どAccessVBAしか扱っていないので、「同一プロジェクト」の 認識がずれている可能性がありますが(汗)、1ファイル内に保存されている モジュール間での参照という意味でよければ、可能です。 なお、クラスを定義したのとは別のファイルであっても、以下の手順を踏めば 使用可能にできます: 1)参照したいクラスの「Instancing」プロパティを、既定の「1-Private」から 「2-PublicNotCreatable」に変更する (VBEの画面でF4キーを押すと表示される「プロパティウィンドウ」で設定) 2)クラスを定義したファイル内で新規の標準モジュールを作成し、そのクラス のインスタンスを生成する関数を用意する (Instancingプロパティが「NotCreatable」なので、そのままでは同一 ファイル内でしかインスタンスを作成できないため、その回避策として) 3)そのクラスを参照したいファイル側で、クラスを定義したファイルに対する 参照設定を行う ※インスタンスを作成する際は、「2)」で用意した関数を使用します。 > aaab.BBB.CCCを作成してみた所、BBBの下にBBB自身が見えてしまって… 下記サンプルのコーディング中、実際に同様の現象を見はしたのですが・・・ こちらの方では、原因は「BBBクラスモジュールで、間違ってBBBプロパティを 定義していた」というものでした(汗) 念のため、BBBクラス内で、BBBという名前のProperty/Sub/Function/変数 を定義・宣言していないか、確認してみてください。 とりあえず、ごくごくシンプルなサンプルを提示してみます(動きませんが、雰囲気 の参考ということで・・・)。 クラスモジュールは使い始めて数ヶ月で拙い限りではありますが、問題解決の 手がかりになれば幸いです。 【「aaab」クラスモジュール】 Option CompareDatabase Option Explicit '各プロパティの内容を保持する変数を宣言 Private myaaa As aaa, myBBB As BBB '「aaa」プロパティ Public Property Get aaa() As aaa Set aaa = myaaa End Property Public Property Set aaa(NewObj As aaa) Set myaaa = NewObj '「aaa」の入替時に「BBB」を初期化するという想定 Set myBBB = Nothing End Property '「BBB」プロパティ Public Property Get BBB() As BBB Set BBB = myBBB End Property Public Property Set BBB(NewObj As BBB) Set myBBB = NewObj '「BBB」の入替時に「aaa」オブジェクトの「Update」メソッドを実行する想定 myaaa.Update End Property 【「BBB」クラスモジュール】 Option CompareDatabase Option Explicit Private myCCC As Integer '「CCC」プロパティ Public Property Get CCC() As Integer CCC = myCCC End Property Public Property Let CCC(NewVal As Integer) myCCC = NewVal End Property '「DDD」メソッド Public Sub DDD(AddVal As Integer) '「CCC」プロパティの値に、指定した値を加算するメソッド、という想定 myCCC = myCCC + AddVal End Sub
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
> ちなみに、aaaオブジェクトの詳細はブラックボックスです。 これが「ユーザーにとってブラックボックス」というだけならよいのですが、 もしも「プログラマ(tmk2zさん)にとってもブラックボックス」ということだと、 aaaオブジェクトに予め「ユーザー定義のプロパティ追加するメソッド」が 用意されていない限り、無理ではないかと思います。 【AccessVBAでの例】 A)DAO.Databaseへの、独自定義のプロパティの追加 予め「CreateProperty」メソッドが用意されている →これを使用することで、そのデータベースの内部構造がわからなくても、 独自に定義したプロパティを追加できる。 (展開中のmdbファイル以外のmdbファイル(=詳細が不明のブラック ボックス)でも、OpenDatabaseで接続を確立できさえすれば、独自 プロパティの追加が可能) B)Formオブジェクトへの、独自定義のプロパティの追加 プロパティを追加するメソッドは用意されていない →当該フォームのクラスモジュールに、プロパティの定義を直接記述する 必要があるため、ブラックボックス(=クラスモジュールが開けない)では 対応不可 とりあえず、プログラマにとってはaaaオブジェクトもブラックボックスではない、 ということでしたら、クラスモジュールを使用することで、「aaa.BBB.CCC」と いった形の参照は可能にできます(→プロパティなどをPublicで宣言すれば Ok)。 また、Publicで宣言されたプロパティなどは、コーディング時の参照リストに 自動的に追加されます。 (「aaa.BBB.CCC」の形の記述は可能だがリストには追加しない、或いは その逆というのは(→つまりそれぞれを個別に設定)、多分無理) おおまかには、以下のような流れになるかと思います。 1)「BBB」を定義するクラスモジュールを作成 2)上記モジュール「CCC」「QQQ」といったプロパティやメソッドの定義・動作を 記述し、保存 3)「aaa」オブジェクトを定義したクラスモジュールに「BBB」プロパティを追加し、 そのデータ型を「1)」で定義したクラスとして宣言 ・・・具体例な話でないため、わかりにくいかとは思いますが(汗)、参考まで。
お礼
DexMachinaさん、 ご回答ありがとうございます。大分クリアになってきました。 残念ながら、こちらでもaaaはブラックボックスなんです。 追加で質問ですが、今回は仕方がなく、aaaの代わりに DexMachinaさんのアドバイスの下、aaabというクラスモジュールを 作ってこれに、BBBやCCCを追加していこうと思っていますが、 この場合同一プロジェクト内でもこう言った細工が出来ますでしょうか? aaab.BBB.CCCを作成してみた所、BBBの下にBBB自身が見えてしまって… こう言った場合、どういった作り方をすれば良いでしょうか? よろしくお願い致します。
お礼
DexMachinaさん、 夜分にありがとうございます。サンプルコード大変参考になります。 しかし、少し格闘しましたが、まだ動くようになっていませんので 週末がんばってみます。 本当に助かります。
補足
DexMachinaさん、 できました。アドバイスどおり、組み込んだところ問題なく 動きました。ありがとうございます。 これから、内容を噛み砕いていきたいと思います。 ありがとうございました。