dポイントプレゼントキャンペーン実施中!

現在VBAで既存のオブジェクトをカスタマイズする必要があります。
aaaというオブジェクトの下に、新たに自分で
オブジェクトメンバを追加し、そこにオブジェクト、プロパティを
配置していきく必要があります。
(顧客配布時に、一貫したコーディングが出来るように)

aaa.aab.aac

と言うものに

aaa.BBB.CCC
aaa.BBB.QQQ

といった形に、発展させて行きたいのですが
こう言ったことが出来ますか?

ちなみに、aaaオブジェクトの詳細はブラックボックスです。

そして、このこれらを、コーディング時の参照リストにも
追加したいです。

稚拙な質問で申し訳ないですが、よろしくお願いします。

A 回答 (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

この回答への補足

DexMachinaさん、

できました。アドバイスどおり、組み込んだところ問題なく
動きました。ありがとうございます。
これから、内容を噛み砕いていきたいと思います。

ありがとうございました。

補足日時:2009/11/28 09:20
    • good
    • 0
この回答へのお礼

DexMachinaさん、

夜分にありがとうございます。サンプルコード大変参考になります。

しかし、少し格闘しましたが、まだ動くようになっていませんので
週末がんばってみます。

本当に助かります。

お礼日時:2009/11/28 01:01

> ちなみに、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)」で定義したクラスとして宣言


・・・具体例な話でないため、わかりにくいかとは思いますが(汗)、参考まで。
    • good
    • 0
この回答へのお礼

DexMachinaさん、

ご回答ありがとうございます。大分クリアになってきました。
残念ながら、こちらでもaaaはブラックボックスなんです。

追加で質問ですが、今回は仕方がなく、aaaの代わりに
DexMachinaさんのアドバイスの下、aaabというクラスモジュールを
作ってこれに、BBBやCCCを追加していこうと思っていますが、
この場合同一プロジェクト内でもこう言った細工が出来ますでしょうか?

aaab.BBB.CCCを作成してみた所、BBBの下にBBB自身が見えてしまって…

こう言った場合、どういった作り方をすれば良いでしょうか?
よろしくお願い致します。

お礼日時:2009/11/27 10:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!