• ベストアンサー

オブジェクトモジュールにメンバーの追加(エクセルVBA)

エクセルのVBAで、オブジェクトモジュールに(クラスの?)メンバーを追加したいと考えています。(そんな使い方すべきでないとの意見もありそうな問題ですが・・?) Thisworkbookのモジュールに次のコードを書いてみたのですが、test_bookを動かすと(1)~(3)は問題ないのですが、(4)がエラーになります。(自動メンバー表示もされません。且つ、???に何を入れればいいのか?判りません) で、質問ですが、オブジェクトモジュールに、プロパティ、メゾッドは追加できるのでしょうか?追加したプロパティ、メゾッドは、自動メンバー表示に加えることが出来るのでしょうか?その時は、やはり、Enum を使うのでしょうか?ご指導のほどよろしくお願い致します。 Private enum ?? ???? End Enum dim ??? as ??? Sub test_book()   MsgBox Name & FullName & FolderName  '(1) MsgBox ThisWorkbook.Name & _      TisWorkbook.FullName       '(2) MsgBox Me.Name & Me.FullName      '(3) MsgBox Name & FullName & _      ThisWorkbook.FolderName      '(4) End Sub Private Property Get FolderName() As String FolderName = "test"   '所属するフォルダー名を返すプロパティーを借りに想定して単に"test"を返して実験してみました。実際にやりたいことは、別にあります。 End Property 具体的に何をやりたいのかを明示できなくてすみません。宜しくお願い致します。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。vba_minaraiさん、KenKen_SPさん >ThisWorkbook をこの様に使うことはまずありません。 そうですね。イベントならともかく、可能なのは分りますが、KenKen_SPさんには失礼かもしれませんが、そういう方法は、まずないと言えるかと思います。Moug.net の実験的なコードなら出てくるかもしれませんが、私は、最近は、そういうことは、あまり考えないようにしています。 今年は、何度か、プロ?らしき人のコードを見るに当たって、何か、もっと根本的なところが違うような気がしたのです。人に見せるためではない実務的なコードというのが存在していますね。だから、どうすればよいか、と明確にはつかめてはいませんが、なんとなく違いが分るのです。私個人も、掲示板で公開する場合と、そうでない場合は、かなり内容的に違います。 以前も書いたことがありますが、私は、かねがね、Excel でクラス-インスタンスを用いるのは、イベントとカプセル化ぐらいで、それ以上は使わない、と思っているわけですね。それも、ほとんどは、イベントだけです。否定する方もいらっしゃるようですが、その実体を知りません。 結局、他の言語(例えば、C++とかVB.Net)の概念的なダウンサイズ、つまりミニチュアのようなものであって、Excelから積み上げ式にコードを構築していっても、同じようなコードの結果にはならないような気がしています。COMやDLLで作れば、違ってくるとは思うのですが、私は、Excel VBAを中心にしているせいもあるのですが、あまり、そういうものを作りません。 私は、Excelでは、ブック単体がほとんどであって、ブック内で完結しているように作るので、結局、そのブックの結果だけしかないと思うわけです。(つまりテクニックとして上位下位はあっても、方法は1つではないということです。)私としては、今のところは、掲示板で書くコードは、掲示板の質問のニーズの範囲内で納めていこうと思っています。また、自分の勉強は、しょせん、今のところは自分でしかありませんし、おそらくは、掲示板では書きません。(私の仕事自体、Excelはまったく使いませんので、ニーズという点で他人に聞くことはありませんが。) >オリジナルプロパティーをTrueにするとステータスバーにシート名が表示されるなど??これも意味がないかぁ? 実験的にはそういうことはあっても、例えば、Public 変数や、Public 定数を設ければ事が足りますよね。まして、ThisBookモジュールには、ThisBookモジュールの役割を、標準モジュールには、またその役割を果たすように作るだけで、もしかしたら、間違っているかもしれませんが、ThisBookモジュール自体にプロパティのコードを設けても、それは、単に、ThisBookモジュールに、プロパティを設けて定数を封入しただけではないかと思うのです。結果的には、Public 変数や定数と変りありません。 vba_minaraiさんがおやりになっていることは、否定はしませんが、今の私には、#3で書いた以上のことは考えられないですのです。 もし、発言に失礼が所がありましたら、お許しください。

vba_minarai
質問者

補足

いつもいつも、貴重なご意見有難う御座います。何度も何度も熟読して噛み砕いていこうと思います。 >もし、発言に失礼が所がありましたら、お許しください。滅相もない、勿体無いお言葉有難う御座います。 全く、VBAが解っていないものが意見を申すのもおこがましい限りですが、プロシージャーをどこのモジュールに書くのが正しいのか?って考えた結果、Wendy02様が仰ることとお同じく、(本質は月とスッポンほどの差があることは重々承知しています。) >Public 変数や、Public 定数を設ければ事が足りますよね。まして、ThisBookモジュールには、ThisBookモジュールの役割を、標準モジュールには、またその役割を果たすように作るだけで・・・という思いが生じThisBookに標準で装備されているプロパティについての加工において、そのbookでの標準的な加工は、ThisBookモジュールで処理する。って考え方もありかな?って思い質問しました。マイクロソフトが用意した標準プロパティが万事において標準であるとは言い切れず、また逆に、何でもかんでも標準化、自動化的にプロパティを用意すると普遍性、汎用性、フレキシブル性にかけるものとなることも理解しているつもりです。正直今、手探り状態で総当たり戦でトライしているところです。こんなくだらないことにつき合わせてしまいまことに申し訳ありません。 これを実現するためには、どうすればいいのかだけではなく、一緒になぜこうしないのかも習得できれば最高だと思っています。エキスパートの人から見ればなんて無駄なステップを踏むのかと感じられることだと思いますが、納得できないと寝れない性格上、なかなか無駄な寄り道が多くなります。仰ると通り、 >ThisBookモジュール自体にプロパティのコードを設けても、それは、単に、ThisBookモジュールに、プロパティを設けて定数を封入しただけではないかと思うのです。結果的には、Public 変数や定数と変りありません。だと、思います。 でも、基本的な考え方として、どこにおいても一緒だからどうでもいいっ的な考えではなく(決して、Wendy02様がそんないい加減な考えて述べているのではないことは重々承知してますし、尊敬しています)こうだから、こうだって自分の意見を探しているとでも言えるでしょうか?なんだか?かたぐるしい文章となってしまったことをお詫びいたします。いつも質問方法が悪く正直なところ何を言っているのか解らない?っ的な質問に親切丁寧に、しかも本来ならば私が今の何倍も自己努力して習得すべきものを、なんの惜しげもなくご指導頂ける環境に幸せを感じています。 本当に本当に有難う御座います。 今後とも、ご指導のほど宜しくお願い致します。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

vba_minaraiさん、こんにちは。 Wendy02です。 私のつたない文章を読んでいただいて、たいへん恐縮しています。 >ThisBookに標準で装備されているプロパティについての加工において、そのbookでの標準的な加工は、ThisBookモジュールで処理する。って考え方もありかな?って思い質問しました。 今の私は、ThisWorkbookモジュールというのは、そのブックの表玄関、または入り口にあたるのではないかなって思って、そういう使い方をしています。だから、わたし的には、ThisWorkbookモジュールは、標準モジュールの下位に付けています。ただし、標準モジューでは出来ないことが、ThisWorkbookモジュールでできることがありますね。 でも、今回の件を、もう一度、私なりにいろいろ検討してみましたが、コードの全体の形態としては大掛かりにはなるのですが、プロパティの全体的な役割として、イベントなら別ですが、Public 変数自体を問題とするなら、クラスモジュールで、ブックのインスタンスを作り、そこに、Property Let, Property Get で、プロパティを設けていたほうがよいのではないかなって思いました。つまり、これはカプセル化ですよね。それ以外に、Excelとしての設定の意義を求められないような気がしました。 まあ、私としては、ここらは、あまり詳しいわけではありませんが。

vba_minarai
質問者

補足

なんども、なんどもご指導有難う御座います。 >クラスモジュールで、ブックのインスタンスを作り、そこに、・・・ すでに、この部分でよく理解していません。多分、クラスとインスタンスを理解していないから、今回の質問のような無意味なことを考えてしまうのかと我ながら推測しますが、なかなか?理解度が進みません。色々な本を読んでは見ているのですが、入れ知恵ばかりがたまり、消化不良となっております。単に、単語の羅列しか出来ていません。こんな、支離滅裂な状態で、丁寧なご指導心より感謝しております。 この件については、一度無意味であるとの結論とし、もう少し、理解が深まった時に、まだ疑問が解消されていないようでしたら再度質問をアップさせて頂きますので、見捨てないで、ご指導のほど宜しくお願い致します。本当に本当に有難う御座いました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

こんにちは。KenKen_SP です。 前回の回答で [ ThisWorkbook ] モジュールのコメントが逆になって ました。Property Let が設定で、Property Get が取得です。 すみません。 補足します。 確かに Public 変数はプロパティと似たような使い方ができますが、 異なる点があります。 1. Public 変数は読み取り・書き込みの両方が可能です。対してプロ   パティはそれぞれ定義しない限りできません。つまり、   ・取得しか定義しなければ、そのプロパティは「読み取り専用」   ・設定しか定義しなければ、そのプロパティは「書き込み専用」   ・両方を定義すると「読み書き」ともに許可 = ほぼ Public 変数   となります。    -->   読み書きともに許可する場合は Public でもOK、いずれか一方のみ   許可する場合は、Property ~ を使います。 2. プロパティ値の設定や取得を監視し、状況に応じて裏で対応する   操作を行うことができます。   (別にプロパティでなくでも可能ですが)   例えば、   Application.Caption = "TEST"   のように Caption プロパティを操作すると、Excel のタイトルバー   が変化しますよね?   これも Public 変数との違いです。例えば #3 補足欄の、   > このオリジナルプロパティーをTrueにするとステータスバーに   > シート名が表示されるなど??   をコーディングしてみます。実験的なコードです。 ’【ThisWorkbook モジュール】---------------------------------------- '// 変数 Private mblnFLAG As Boolean '// イベント Private Sub Workbook_SheetActivate(ByVal Sh As Object)      If mblnFLAG Then     Application.StatusBar = Sh.Name   Else     Application.StatusBar = ""   End If End Sub Private Sub Workbook_WindowActivate(ByVal Wn As Window)   Call Workbook_SheetActivate(ActiveSheet) End Sub Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)   Application.StatusBar = "" End Sub '// プロパティー Public Property Let STATUSBAR_SHNAME_SHOW(ByRef blnDISPAY As Boolean)   mblnFLAG = blnDISPAY   Call Workbook_SheetActivate(ActiveSheet) End Property Public Property Get STATUSBAR_SHNAME_SHOW() As Boolean   STATUSBAR_SHNAME_SHOW = mblnFLAG End Property ’【標準 モジュール】------------------------------------------------ Sub ステータスバーにシート名表示()   ThisWorkbook.STATUSBAR_SHNAME_SHOW = True End Sub Sub ステータスバー解除()   ThisWorkbook.STATUSBAR_SHNAME_SHOW = False End Sub

vba_minarai
質問者

補足

いつも、いつも丁寧なご指導の上、サンプルマクロの提示までして頂き真に恐縮しております。 率直な意見を述べさせて頂きますと、KenKen_SP様の頭ってドラえもんのポッケみたいですね? 恐れ入ります。内容をよくかみ締めて理解していきたいと思います。 本当に、本当に有難う御座いました。 今後とも宜しくお願い致します。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

> オリジナルプロパティをプロパティーウィンドーに追加表示することは > 出来ますか? これは、Visual Basic Editor の問題だと思います。 恐らく、不可能でしょう。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。KenKen_SP です。 フォーム、シート、ThisWorkbook、クラスなどはオブジェクトモジュールです。 オブジェクトモジュールには独自プロパティーを追加することができます。 プロパティーは外部参照できるもの、、つまり他モジュールからアクセスでき るものですから通常は Public で宣言します。 というか Private での宣言は今のところ見たことがないです、、、 ご質問の意図するところが見えていない状況であれこれ言うのもなんですが、 ThisWorkbook をこの様に使うことはまずありません。 テストとして下記のコードで自動メンバ表示機能が働くことを確認してみて 下さい。 ’【ThisWorkbook モジュール】---------------------------------------- '内部変数 Private mFOLDER_NAME As String 'プロパティー取得 Public Property Let FolderName(ByVal strNEW_FOLDER_NAME As String)   mFOLDER_NAME = strNEW_FOLDER_NAME End Property 'プロパティー設定 Public Property Get FolderName() As String   FolderName = mFOLDER_NAME End Property ’【標準 モジュール】------------------------------------------------ Sub プロパティー設定Sample()      ThisWorkbook.FolderName = "TEST"    End Sub '// 先に上のプロシージャを実行します Sub プロパティー取得Sample()      MsgBox ThisWorkbook.FolderName    End Sub

vba_minarai
質問者

補足

いつもいつもありがとう御座います。 私の(エキスパートの方からすれば)意味の無い質問に丁寧にお答え頂き誠にありがとう御座います。 教えて頂きたかったのはまさしくこれです。でも?何に使うの?とご指摘を受けそうですが、私も色々と無駄なことを考えていまして・・・!!のろまですが、一歩一歩進んで行きたいと思います。最近は、オブジェクト指向ってものを理解しないといくら本を読んでも次に進まないと思うようになってきました。本当に、本当にいつもありがとう御座います。自分一人では、とっくに挫折しているところです。謝謝!!因みに、オリジナルプロパティをプロパティーウィンドーに追加表示することは出来ますか?(内部的なクラスからインスタンスを作るときに設定されるので無理なのかなぁ?って素人的に思えますが??)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

vba_minaraiさん、こんにちは。 Wendy02です。 私には、さっぱり、おやりなろうとしていることが分りません。 最初から、Class設計から作るならともかく、既存のThisWorkbookのオブジェクトのメンバーに新たなプロパティを加えようとする意味はなんでしょうか?Excelであって、Excelではないことを考えられているようにお見受けします。クラスで、プロパティに定数を入れたところで、それ自体は、あまり有効に使えるとは思えないのです。 ThisWorkbook.FolderName '←このFolderNameというのは、つまり、Pathのことですね。それを、"Test" にするとすれば、メソッド(Method)ですから、早い話、プロシージャのことです。そのプロシージャを、ThisWorkbookモジュールに入れて、ちょっとややこしいですが、自ブックをフォルダをTestに移すように作れば済むはずです。 私の書き込みの内容は、的外れかもしれませんが。

vba_minarai
質問者

補足

いつもいつもありがとう御座います。 当然、的外れな考えをしているのは私です。クラスについて色々と勉強しているとシートやブックをaddするということは内部的なシート、ブックのクラスのインスタンスをつくることかなぁ?って思えて来ました。(間違っているかも?) そこで、シートオブジェクトやブックオブジェクトのプロパティから取得した値を、標準モジュール内で加工するのではなく、オリジナルなプロパティーとして各オブジェクトに作る方法もあるのかなぁ?って思い質問しました。(いいたとえではないと思いますが、このオリジナルプロパティーをTrueにするとステータスバーにシート名が表示されるなど??これも意味がないかぁ?(T T;))よくよく考えてみると、クラス、インスタンスと言う概念に逆らう行為かも?知れません。質問内容のコードは、追加のプロパティが出来るかどうかだけのもので単に、”処理内容”と明確に意思表示すべきでした。すみません。 最近は、クラスとイベントに苦慮しております。クラスの勉強として、.NETの本を読むと余計泥沼にはまっている感じがしています。継承??ってのも気になるし??

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

今、試してみたんですが、 Public Property Get FolderName() As String FolderName = "test" End Property はできるみたいですね

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

やろうとしていることが、もうひとつわからないので トンチンカンなコメントだったらすみません public x as integer みたいに変数は作れて ThisWorkboo.x '自動表示される はできますが ThisWorkbookにプロパティの追加だったらできないと思います。 クラスモジュールでラッパークラスを作ったらどうでしょうか

vba_minarai
質問者

補足

いえいえ、有難う御座います。 クラスってまだ、勉強中なので、ラッパークラス?って全く意味が解りません。 お手数をお掛けいたしますが改めてご指導頂けないでしょうか? 宜しくお願い致します。

関連するQ&A

  • Excel:ThisWorkbookオブジェクト内にプロシージャを追加し、それを標準モジュールから呼び出すことは可能?

    (おかしなことを言っているかもしれませんし、 VBAについて正しく理解できていないのかもしれません) ThisWorkbookオブジェクト内にプロシージャ(Public)を追加して、 それを標準モジュールから呼び出すことが出来るのでしょうか? 質問内容のことを行いたいのです。 しかし、それ以前にThisWorkbookオブジェクト内にプロシージャを追加して、 それをThisWorkbookオブジェクト内から呼び出すことも今現在出来ていないません。 (ThisWorkbookオブジェクトにプロシージャの追加、またそれの呼び出しが可能か不可能かも分かっていません)

  • VBAでの疑問

    以下のようなコードを見ました。 Private Sub Workbook_BeforeClose(Cancel As Boolean) With ThisWorkbook Application.DisplayAlerts = False If .Name <> .FullName Then SaveAs Else Me.Saved = True End If Application.DisplayAlerts = True End With End Sub これは何のためのコードでしょうか? If .Name <> .FullName Then って、パスなしのBOOK名とパス付BOOK名が同じじゃないのは当然で、同じになるのは新規に作成したばかりで保存する前のファイルくらいしか思いつきません。これでは必ず上書きされてしまうと思いますが、どういう意図が考えられるのかお分かりの方教えていただけないでしょうか?

  • VBAのプロパティウィンドウについて

    VBAでプロパティウィンドウには ・Microsoft Excel Object ・フォーム ・標準モジュール があります。 ところで、下のプログラムですが、(1)の部分を標準モジュールに書き込み、フォームにあるコマンドボタンをクリックしたら、"test.xls"が表示されます。 しかし、(1)の部分をMicrosoft Excel Object のsheet1(sheet1)のコードに書き込み、プログラムを実行させると、フォームのコマンドボタンをクリックしても"test.xls"は表示されません。 これはなぜですか? (1)の部分のコマンドボタン1はsheet1に存在します。 (1)----------------------------------- Private file_name as string Private Sub CommandButton1_Click()   file_name="test.xls" UserForm1.Show End Sub (1)----------------------------------- フォーム Sub CommandButton1_Click() MsgBox file_name End Sub

  • フォームのイベントを標準モジュールから呼び出す

    フォームのイベントを標準モジュールから呼び出す事は出来ないのでしょうか? ちなみにアクセスです。 例えば、 Private Sub Form_Load() MsgBox "test" End Sub というのはフォームを開いたときにしか発生しないですよね。 でもフォームを開いている状態でForm_Loadと全く同じ事をしてほしい時は どうすればいいですか? 標準モジュールで Sub a() Call Form_フォーム1.Form_Load End Sub としてみましたが、メソッドまたはデータ メンバが見つかりません。 (Error 461)になりました。 MsgBox "test" だけなら、 Sub a() MsgBox "test" End Sub にすりゃいいじゃん!って思われがちですが、 実際はForm_Loadイベントにはたくさんのコードが書かれています。 標準モジュールからイベントの呼び出しを教えてください。

  • エクセルVBAのBeforePrintで

    ThisWorkbookモジュールで Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name <> "Sheet1" Then Exit Sub MsgBox "BeforePrintイベント発生" End Sub を使って、Sheet1での印刷のイベントを取得できます。 ただ、指示がPrintなのかPrintPreviewなのかが取得できません。 印刷またはプレビューされる前にどちらの指示なのかを取得する方法がありますか?

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

  • 【VBA】SUBプロシージャーは標準モジュール以外に書いてもいい?

    ThisWorkbookのコードを書く場所や Sheetのイベントプロシージャーが実行されるところに Sub test() MsgBox "あああ" End Sub と書いて実行するとメッセージボックスが表示されます。 クラスモジュールとフォームのイベントプロシージャーを書くところではできませんでした。 ということはSUBプロシージャーは 標準モジュールでなくてもいいのでしょうか?

  • エクセルVBAでシートモジュールでのパブリック変数

    エクセル2000です。 標準モジュールで取得したパブリック変数は他のシートモジュールで参照できますが、逆にシートモジュールで取得したパブリック変数は他のシートで参照できないのでしょうか? シートチェンジイベントで取得した文字列を変数nmに格納し、ワークブックモジュールで呼び出そうとしたら何もでてきませんでした。 どうやったらよいのでしょうか? 'シートモジュールの記述 Public nm As String Private Sub Worksheet_Change(ByVal Target As Range) Dim rw As Integer If Intersect(Target, Range("A1").CurrentRegion) Is Nothing Then Exit Sub If Selection.Count > 1 Then Exit Sub rw = Target.Row nm = IIf(Cells(rw, "A") = "", Cells(rw, "A").End(xlUp).Value, Cells(rw, "A").Value) 'MsgBox nm End Sub 'ThisWorkbookモジュールの記述 Private Sub Workbook_BeforeClose(Cancel As Boolean) If nm = "" Then Exit Sub MsgBox nm & "さん、ご苦労様でした。" End Sub

  • VBA オブジェクト追加

    現在VBAで既存のオブジェクトをカスタマイズする必要があります。 aaaというオブジェクトの下に、新たに自分で オブジェクトメンバを追加し、そこにオブジェクト、プロパティを 配置していきく必要があります。 (顧客配布時に、一貫したコーディングが出来るように) aaa.aab.aac と言うものに aaa.BBB.CCC aaa.BBB.QQQ といった形に、発展させて行きたいのですが こう言ったことが出来ますか? ちなみに、aaaオブジェクトの詳細はブラックボックスです。 そして、このこれらを、コーディング時の参照リストにも 追加したいです。 稚拙な質問で申し訳ないですが、よろしくお願いします。

  • 標準モジュールにpublicで宣言するしかない?

    フォームモジュールと標準モジュールで同じ変数を使って値を行き来したい場合、 標準モジュールにpublicで宣言するしかないのでしょうか? 【フォームモジュール】 Private Sub cmd_コマンド0_Click() test = "aaa" Call 標準モジュールtest End Sub 【標準モジュール】 Public test As String Sub 標準モジュールtest() MsgBox test End Sub でいいのですか?

専門家に質問してみよう