• ベストアンサー

VBA クラスにプロパティが実装できません

VBA初心者です。 現在、Excel2003-VBAでクラスにプロパティの実装を試みていますが、うまくいきません。 Publicで宣言する方法は問題なく出来たのですが…。 勉強用のため、敢えて簡単なサンプルを自分で作っています。 【状況】 下記プログラムで、メッセージを「20」と表示させたいのですが、 「スタック領域が不足しています」エラーにより、実行できません。 また「Atai」を「Suji」にかえると、メッセージとして「0」と出てきます。 あるいは、「Suji = Atai + 5」を消してみても「15」ではなく「0」と出ます。 【質問】 どちらでもうまくいかないのですが、これは (1)このコードがおかしいのか、それとも (2)単純なプログラムであるのに領域不足と出るところから、 VBA特有の不具合でどうしようもない物なのでしょうか? ご意見お待ちしています。 ===通常Module(呼び出し側)=== Option Explicit Sub 実行() Dim Haichi As New Class1 With Haichi .Suji = 15 .MSGクラス End With End Sub ===クラスMODULE(Class1)=== Option Explicit Sub MSGクラス() MsgBox Suji End Sub Public Property Let Suji(Atai As Double) Suji = Atai + 5 End Property Public Property Get Suji() As Double End Property

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

一般的な実装 ' プロパティSujiの値を記憶しておく実体 Private dSuji as Double public Property Let Suji( Atai as Double )   dSuji = atai + 5 end Property Public Property Get Suji() as Double   Suji = dSuji End Property といった具合に実装します 質問のような記述をすると #1の回答のように 実行時に With Haichi .Suji = 15 で Class1の Public Property Let Suji(Atai As Double) ここが呼び出されます 次の Suji = Atai + 5 が Sujiへの代入なので また Public Property Let Suji(Atai As Double) の行が実行されます これが繰り返されて スタックを食いつぶすことになります

greatpurin
質問者

補足

ご回答の通りにしてみたらできました。 まだ理解が浅いので、ヘンな表現ですが、 SujiがAtaiに代入され、 Ataiを使ってdSujiが計算され、 dSujiがSujiに代入されるという感じでしょうか。 (AtaiとdSujiは一時的に値を記憶なり取得なりする?)

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

簡単な例を挙げてみます。参考になれば。 クラスでプロパティとメソッドを作る例 VBEの画面で 挿入ークラスモジュール 2つめのクラスモジュールに作ったので名前はClass2になってます。 Nameはモジュールで1つのプロパティの名として使います。 keisanはメッソドでモジュールでメソッドとして、この名で使います。 下記はいわゆる設計図に当たります。 Dim m_strName As String Dim keisann As Integer Public Property Get Name() As String Name = m_strName End Property Public Property Let Name(ByVal NewValue As String) m_strName = NewValue End Property Public Function keisan(a As Integer) keisan = a + 5 End Function ーー 標準モジュールのModule1に Dim aaa As New Class2 Sub test01() Set aaa = New Class2 aaa.Name = "AAAAAA" MsgBox aaa.Name MsgBox aaa.keisan(10) End Sub aaaは実体化した時のオブジェクトの名前。 Set aaa = New Class2はクラスClass2をインスタント化 aaa.Name = "AAAAAA" はNameプロパティにAAAAAAにセット MsgBox aaa.Name はプロパティの値を利用している。 MsgBox aaa.keisan(10) は計算メソッドを利用している。 引数に+5している。 ーーー >Public Property Let Suji(Atai As Double) Suji = Atai + 5 End Property はプロパティでの定義でするものではないのではないか。 === VBAはApplicationであるエクセル・アクセスの操作などを対象にしたもので、普通の操作に使う、プロパティ・メソッドは既に備わっている。解説書の量で言えば、エクセルで1000ページに近い。 ですからエクセルなどでクラスの考えを使わなければならないことは ほとんどない。もっとシステム設計やアルゴリズムなどのことで勉強することがたくさん有るだろう。深入りしても無駄だと思う。VB.NETではメインの考えだろうが。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

'-------- Class-------------- Private myData As Double Public Sub MSGクラス()   MsgBox myData End Sub Public Property Let Suji(Atai As Double)   myData = Atai + 5 End Property '-------------------------------    

greatpurin
質問者

補足

参考になりました。 ありがとうございます。

  • lovesens
  • ベストアンサー率30% (48/158)
回答No.1

ざっと見ただけですが… >Public Property Let Suji(Atai As Double) >Suji = Atai + 5 >End Property Sujiをずっと呼び続けることになりませんか。 +、+と延々繰り返してメモリエラーになるような。 あと、 >MSGクラス >Sub 実行() 日本語混じりは今から使わないよう癖つけといたほうがいいと思います。

greatpurin
質問者

補足

解決できました。ありがとうございます。 日本語混じりも気を付けたいと思います。

関連するQ&A

専門家に質問してみよう