- ベストアンサー
ExcelVBAでClassの返り値について
- ExcelVBAでクラスを使用してメソッドチェーンを実現する場合、メソッドチェーンの後ろにメソッドが存在する場合はクラス自体を返し、メソッドとして使用する場合は別の値を返すことができるかを検討します。
- ExcelVBAでは、メソッドチェーンを使って複数のメソッドを連続して実行することができます。しかし、クラスを使ってメソッドチェーンを実現する場合、後ろにメソッドが控えている場合はクラス自体を返し、メソッドとして使いたい場合は別の値を返す必要があります。
- 例えば、Workbooksメソッドをクラスとして実装する場合、メソッドチェーンの後ろにメソッドがある場合はクラス自体を返し、メソッドとして使いたい場合は別の値を返すようにします。これにより、メソッドチェーンを使ってスムーズなコーディングを実現することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
イメージだけですが、参考になりますか。 Class1 Private m_Items As Collection Private Class_Initialize() Set m_Items = New Collection End Sub Public Sub Add(ByVal obj As Class2) m_Items.Add obj, CStr(obj.Name) End Sub Public Property Get Item(Byval vValue As Variant) As Class2 Set Item = m_Items(vVlaue) End Property Public Sub Method() MsgBox "これはClass1のメソッドです" End Sub Class2 Private m_Name As String Public Function Init(Byval strName As String) As Class2 m_Name = strName Set Init = Me End Function Public Property Get Name() As String Name = m_Name End Property Public Sub Method() MsgBox "これはClass2(" & Name & ")のメソッドです" End Sub Sub Try() Dim o As Class1 Dim oo As Class2 Set o = New Class1 Set oo = New Class2 o.Add oo.Init("1") Set oo = New Class2 o.Add oo.Init("2") o.Method o.Item("1").Method '上の行は Class1のItemプロパティを既定のプロパティに設定すれば o("1").Method 'とメソッドチェーンが記述出来ます 'WorkBooks("hoge").WorkSheets・・・・と同じですね End Sub oだけならClass1への参照 o. ならClass1のメンバへアクセス o.Item("1") はClass1が持つItemプロパティ(型はClass2型)によりClass2の参照を得る Itemを省略可能なプロパティに設定すれば o("1")だけでClass2への参照が得られる o("1"). でClass2が持つメンバへアクセス可能になる コンパイルしてませんので、適宜修正願いますm(_ _)m
その他の回答 (1)
- play_with_you
- ベストアンサー率37% (112/301)
>Workbooks("ブック名").Sheets("シート名") まず例がメソッドチェーンじゃないという時点でいろいろとあれですが。 >クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は) >自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは >可能でしょうか? 根本的に考え方がおかしいです。 その場合Meが後ろのメソッドを持つという実装になるべきであって、そんな訳の分からん処理はさせません。 …打ちながら気づいたんですが、そもそも、 >Set BookObj = Workbooks("ブック名") これがメソッドだと勘違いしてませんか? Workbooksは「コレクション」です。「現在開かれているすべてのブック」を表し、「("ブック名")」とするとその名前のブックを(開いていれば)返すものです。
補足
返信ありがとうございます! いろいろと不適切な表現があり失礼しました。 うまく説明できるか不明ですがもう一度書かせていただきます。 (たぶん、順を追って説明していなかったのもまずかったと思っています) ■背景 ExcelVBAで特定の目的に対し、コードを書いていて 同じようなソースをクラス内に閉じ込めて、やりたいことに 集中できるようにしたいと思っていました。 そこで、Appliationオブジェクト配下のよく使うメソッド、プロパティ、コレクションのみに特化させて、擬似的に(※1)クラス内で実装することでソースコードの記述を減らそうと思っています。 ※1:完全に同じものを再現できると考えていない。ついでにいうと、完全に再現することが目的でない ■たぶん本題 そこで、1つの例としてWorkbooksであれば Appliation.Workbooks としてプロパティにアクセスするとWorkbookコレクションを返し Application.Workbooks(ブック名)としてプロパティにアクセスするとWorkbookオブジェクトを返し Application.Workbooks(ブック名).Sheets Workbookオプジェクとのプロパティにアクセスするような使い方をクラスで擬似的に再現できないものかな?? と言う話です。 あくまでも目的は、よくかき回す記述をクラス内にまとめ、やりたいことを簡潔に記述したいということです。 私個人の考えとして上記のような動きをクラスで完全に同じにできると考えていません。なので擬似的にと思っているのですが、あまりきれいな実装にならずもやもやしているところです。 (え?無理なことに努力をするなと・・・) ここで解答していただきたいことは、 いやいやいやいやいや、あなたの知識が浅いだけでこうしたらできますって! という解答。 または、擬似的であればこんな感じだったら、実装できまっせ という解答。 または、そもそも発想がおかしい。出直してきなさい。 という解答。 または、その他。 よろしくお願いします。
お礼
クラスを2つ使いで表現ですか! なかなか面白いアプローチですね 参考にいじくってみます!