• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA オブジェクト追加)

VBAオブジェクト追加

このQ&Aのポイント
  • VBAで既存のオブジェクトをカスタマイズする方法について紹介します。詳細な手順やコーディングの参照リストへの追加方法なども解説します。
  • VBAでは、既存のオブジェクトに独自のオブジェクトメンバを追加することができます。具体的な例として、aaaオブジェクトの下に新たなオブジェクトやプロパティを配置する方法を説明します。
  • VBAのコーディング時に、一貫性のあるコーディングを実現するために、オブジェクトのカスタマイズや参照リストへの追加が必要な場合があります。この質問では、aaaオブジェクトに新たなオブジェクトメンバを追加し、関連のあるオブジェクトやプロパティを配置する方法について解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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

tmk2z
質問者

お礼

DexMachinaさん、 夜分にありがとうございます。サンプルコード大変参考になります。 しかし、少し格闘しましたが、まだ動くようになっていませんので 週末がんばってみます。 本当に助かります。

tmk2z
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> ちなみに、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)」で定義したクラスとして宣言 ・・・具体例な話でないため、わかりにくいかとは思いますが(汗)、参考まで。

tmk2z
質問者

お礼

DexMachinaさん、 ご回答ありがとうございます。大分クリアになってきました。 残念ながら、こちらでもaaaはブラックボックスなんです。 追加で質問ですが、今回は仕方がなく、aaaの代わりに DexMachinaさんのアドバイスの下、aaabというクラスモジュールを 作ってこれに、BBBやCCCを追加していこうと思っていますが、 この場合同一プロジェクト内でもこう言った細工が出来ますでしょうか? aaab.BBB.CCCを作成してみた所、BBBの下にBBB自身が見えてしまって… こう言った場合、どういった作り方をすれば良いでしょうか? よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 全てのプロパティが空白のオブジェクトは・・。

    例えば、 「aaa」、「bbb」、「ccc」とプロパティを持つオブジェクト「$obj_test」で、 $obj_test->aaa = "" ; $obj_test->bbb = "" ; $obj_test->ccc = "" ; とした場合、「empty($obj_test)」では真とはなりません。 全てのプロパティが空白のオブジェクトを、emptyと瞬時に判断する関数または方法はあるでしょうか?

    • ベストアンサー
    • PHP
  • ピポッド 集計の追加

    ご存知の方、お知恵をお貸し下さい。 現在、下記のようなピポッドを組んでいます。 グループ1  AAA (AAAの合計、以下aaa+bbb+cccの合計) aaa bbb ccc        BBB (BBBの合計、以下ddd+eee+fffの合計) ddd eee fff CCC (CCCの合計、以下ggg+hhh+iiiの合計) ggg hhh iii グループ2・・・以下続く 上記に、BBBとCCCだけの合計を、(グループ1の中に)追加したいのです。 このように、合計したい項目だけを指定して 集計する事は可能でしょうか? 数式の集計アイテムの追加を行いましたが 上手くできませんでした。 ご存知の方、ご教授いただければ幸いです。 宜しくお願い致します。

  • powershellのelect-Object

    powershellですが、Get-xxxxの結果に対してSelect-Objectで取り出しています。 出力結果に文字列、$LISTの値をを追加、結合したいのですができません。 $LISTS='aaa','bbb','ccc' foreach($LIST in $LISTS) { Get-xxxxx $LIST -Properties hogeプロパティ | Select-Object -Expand hogeプロパティ } aaa,内容1 aaa,内容2 bbb,内容1 bbb,内容2  :  : ccc,内容3 というようにしないのですができなのでしょうか。 dir *.txt | select-object -expadn fullname とすると コマンドを実行したカレントディレクトのファイル名がフルパスで表示されます その結果の前でも後でもいいのですが、任意にの文字列を追加したいのですが、 できるのでしょうか。 1,c:\tmp\a.txt 2,c:\tmp\b.txt : 10,c:tmp\c.txt という具合です。 お願いします。

  • VBA の Application.Run でエラー発生

    独学で勉強したVBAなのですが、とても困っています。 AAA.xls BBB.xls CCC.xls というファイルがあるとします。 AAAを起動すると、BBBを起動して、 Application.Run "'BBB.xls'!TEST" で、BBBのTESTを実行するようにしています。 TESTを実行すると、 Workbooks.Open filename:=ActiveWorkbook.Path & "\CCC.xls", Password:="XXX", WriteResPassword:="XXX", ReadOnly:=True でCCCを起動して、CCCのシートの値をBBBにコピーしてくるようにしています。この一連の処理において、 「実行時エラー'2147352567(80020009)' 'Run'メソッドは失敗しました:'_Application'オブジェクト」 が発生します。 これらは共有サーバー上で動作させているのですが、 困ったことに、エラーが発生する人と、そうでない人がいます。 理由が全くわからず、非常に困っています。 教えていただけたらとても助かります。 何卒よろしくお願いいたします。

  • フリー配布CGIのファイル名変更

    お世話になります。 メールで受信するフォームでを作っていますが、CGIを自分で組めないため配布CGIを利用させていただいてます。フリー配布CGIなのでカスタマイズ可能なのですが、ファイル名を変更しても機能するのか教えてください。 例えば <AAA>フォルダ  │--bbb.cgi  │--fff.pl  │--ccc.html があります。ccc.htmlを動かすためのbbb.cgiです。 もうひとつCGIを入れたいフォームeee.htmlが有る場合、上記のフォルダとファイルをコピーしてファイル名を変更して利用することはできますか? │ │--<AAA>フォルダ │   │--bbb.cgi │   │--fff.pl │   │--ccc.html | │--<DDD>フォルダ     │--bbb2.cgi     │--fff2.pl     │--eee.html ccc.htmlとeee.htmlのフォームの内容は異なるのですが、ファイル名を気軽に変更したcgiファイルでも大丈夫でしょうか? または、<AAA>にeee.htmlを入れてbbb.cgiを共有させることはできるのでしょうか?(<DDD>フォルダ以下はなしで) プログラムファイルを壊してしまうのが怖くてなかなか実行できないでいるのです。 抽象的な質問ですみませんが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • 動的IP(ADSL)+ダイナミックDNS+webサーバー

    動的IPでダイナミックDNSを利用して、 webサーバを公開したく思っているのですが… 取得したサブドメインが aaa.bbb.ccc とした場合、 www1.aaa.bbb.ccc www2.aaa.bbb.ccc という風にして公開することは可能でしょうか? 可能な場合、DNSサーバを立ち上げる必要があるのでしょうか? それともバーチャルホスト機能で出来るでしょうか? 今考えてるのは、一台のサーバマシンで 異なったコンテンツをそれぞれ www1.aaa.bbb.ccc www2.aaa.bbb.ccc として表示させたいのですが、 ゆくゆくは2台に分けてと思ってます。 良きアドバイス宜しくお願いします。

  • 配列のソート

    教えていただけますか? 一つの配列にサイズの異なるオブジェクトがいくつか入っています。 もう一方にもサイズの異なるオブジェクトがいくつか入っています。 双方の配列内のオブジェクトは同一ではありません。 しかしサイズが同一の異なるオブジェクトが対として入っています。 双方配列内のオブジェクトを同じサイズの順番で並ぶように、片方の配列の順番を並べ替えるにはどのようなアルゴリズムがよいのでしょうか? よろしくお願いします。 例 配列A (aaa:size5) (bbb:size3) (ccc:size2) (ddd:size9) 配列B (ppp:size9) (qqq:size3) (rrr:size2) (sss:size5) を 配列A (aaa:size5) (bbb:size3) (ccc:size2) (ddd:size9) 配列B (sss:size5) (qqq:size3) (rrr:size2) (ppp:size9)

  • 別シートの値を検索して一致したものを合計する

    excelvba初心者です。 お手数おかけします。 難問なのかどうかもよく分からず。。困っています。 シート1       シート2   シート3 AAA 100     AAA 50      BBB 20 BBB 200   CCC 150   CCC 30 DDD 300   QQQ 250   DDD 10 EEE 400     WWW 350  RRR 40 上記の値を決められた順番に別シートに集計したい(その時に、値を1/10にしたい) シート4 AAA 150 BBB 220 CCC 180 DDD 310 EEE 400 FFF 0 GGG 0 www 350 findでAAAを検索し見つかった値を ifにて条件分岐させるものをつくったものの プロシャーシーが大きすぎと言われてできません。 どなたか教えていただけないでしょうか。

  • SQL Server:UNIONで結合した結果にIDを追加するには?

    いつも参考にさせて頂いています。 下記のような、テーブル、tabAとtabBを UNIONした結果にcol1の昇順でIDカラムをを追加して 表示するにはどのようなSQL文を書けばよろしいでしょうか? ご存知の方、宜しくお願い致します。 【tabA】 col1 col2 --------- 100 AAA 110 BBB 120 CCC 【tabB】 col1 col2 --------- 200 XXX 210 YYY 220 ZZZ 【結果】 ID col1 col2 ------------ 1 100 AAA 2 110 BBB 3 120 CCC 4 200 XXX 5 210 YYY 6 220 ZZZ

  • エクセル 日程表

    作業時間を別フォームに転記するため、日にち指定で項目&時間を抜き出す方法がありましたら教えて下さい。 項目1...項目2...1.....2.....3..←日にち AAA.....QQQ......8..........←時間 BBB.....WWW.............6 CCC.....EEE..............2 上記のフォームを読み込み、 "別シート"に日にちを指定すると項目と時間が表示される。 例えば「2」日と指定すると BBB.....WWW...........6 CCC.....EEE.............2