Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6869 / 13644 ツリー ←次へ | 前へ→

【42641】クラスにクラスを渡す yamadu 06/9/17(日) 13:33 質問[未読]
【42643】Re:クラスにクラスを渡す だるま 06/9/17(日) 14:34 回答[未読]
【42645】Re:クラスにクラスを渡す yamadu 06/9/17(日) 14:59 お礼[未読]
【42647】Re:クラスにクラスを渡す だるま 06/9/17(日) 15:16 回答[未読]
【42648】Re:クラスにクラスを渡す yamadu 06/9/17(日) 15:51 お礼[未読]

【42641】クラスにクラスを渡す
質問  yamadu  - 06/9/17(日) 13:33 -

引用なし
パスワード
   オブジェクト指向系の言語経験はありますが、
ExcelVBAは初心者の者です。

ExcelVBAでクラスモジュールのプロシージャーの引数に
クラスモジュールを設定する事は可能なのでしょうか?

以下のモジュールを使用すると、
実行時エラー'438'
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
と表示されます。

例:
class1:TestClass
============================
Option Explicit
Private cName As String

Public Property Let name(str As String)
  cName = str
End Property

Public Property Get name() As String
  name = cName
End Property
============================


class2:ClassHolder
============================
Option Explicit
Public Class As TestClass

Public Sub setClass(ByRef item As TestClass)
  Class = item
End Sub
============================


標準モジュール
============================
Sub test(ByVal moji As String)
  
  Dim Class As New TestClass
  Dim holder As New ClassFolder
  holder.setClass (Class)    '←ここでエラー発生

End Sub
============================


ご存知の方がおられましたら、
ご教授願います。

【42643】Re:クラスにクラスを渡す
回答  だるま WEB  - 06/9/17(日) 14:34 -

引用なし
パスワード
   こうでしょうか。^d^

class2: ClassFolder
============================
Option Explicit

Public Class As TestClass
============================


標準モジュール
============================
Sub test(ByVal moji As String)
 
  Dim Class As New TestClass
  Dim holder As New ClassFolder
  Set holder.Class = Class

End Sub
============================

【42645】Re:クラスにクラスを渡す
お礼  yamadu  - 06/9/17(日) 14:59 -

引用なし
パスワード
   早速のご回答ありがとうございます。

プロパティをPublicにして直接SETするしか
方法はないのでしょうか?

最終的にやりたい事は、以下のようなオブジェクトの
動的配列を扱うクラス(Javaで言うArrayListみたいな物)
を作成したいと思っています。


=================================================
Option Explicit
Private list() As Variant
-----------------------------
Public Sub init()
  ReDim list(0)
End Sub
-----------------------------
Public Sub add(ByRef obj As Variant)
  If UBound(list) = 0 Then
    list(0) = obj
  Else
    ReDim Preserve list(UBound(list) + 1)
    list(UBound(list)) = obj
  End If
End Sub
-----------------------------
Public Function getItem(ByVal num As Integer) As Variant
  getItem = list(num)
End Function
-----------------------------
Public Sub setItem(ByVal num As Integer, ByRef obj As Variant)
  list(num) = obj
End Sub
-----------------------------
Public Sub insertItem(ByVal num As Integer, ByRef obj As Variant)
  Dim i As Integer
  ReDim Preserve list(UBound(list) + 1)
  For i = UBound(list) To num Step -1
    If i = num Then
      list(i) = obj
    Else
      list(i) = list(i - 1)
    End If
    
  Next i
End Sub
-----------------------------
Public Sub deleteItem(ByVal num)
  Dim i As Integer
  For i = num To UBound(list) - 1 Step 1
    list(i) = list(num + 1)
  Next
  ReDim Preserve list(UBound(list) - 1)
End Sub
-----------------------------
Public Function size() As Integer
  size = UBound(list)
End Function

====================================================


上記のようなクラスを実現する為に、メソッドの引数で
クラスを渡せるようにしたいのです・・・。

【42647】Re:クラスにクラスを渡す
回答  だるま WEB  - 06/9/17(日) 15:16 -

引用なし
パスワード
   >メソッドの引数でクラスを渡せるようにしたいのです

そうですか、ではあらためて。^d^

class2: ClassFolder
============================
Option Explicit
Public Class As TestClass

Public Sub setClass(ByRef item As TestClass)
  Set Class = item
End Sub
============================


標準モジュール
============================
Sub test(ByVal moji As String)
 
  Dim Class As New TestClass
  Dim holder As New ClassFolder
  holder.setClass Class

End Sub
============================

【42648】Re:クラスにクラスを渡す
お礼  yamadu  - 06/9/17(日) 15:51 -

引用なし
パスワード
   できました〜♪

だるまさん、本当にありがとうございます。
昨日の深夜からず〜っと出来なく、
これだけが理由でVBで作成しようかと
考える所でした。

また何かありましたらよろしくお願いします。
(極力、勉強して自己解決できるように頑張ります)

6869 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free