アプリ版:「スタンプのみでお礼する」機能のリリースについて

ExcelVBAにおいて
Set SheetObj = Workbooks("ブック名").Sheets("シート名")
のようにメソッドチェーンで書くことができますがこれをクラスで
真似る場合


Public Function Workbooks(Optional ByVal BookName as Variant = "")
'処理
Set Workbooks = Me
End Function

とすればメソッドチェーンで書けるようになりますが・・・


Set BookObj = Workbooks("ブック名")
のように後ろにメソッドが来なければブックのオブジェクトを返すといったような
挙動をすることはできますでしょうか?


まとめ。
クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は)
自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは
可能でしょうか?

A 回答 (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
    • good
    • 0
この回答へのお礼

クラスを2つ使いで表現ですか!
なかなか面白いアプローチですね
参考にいじくってみます!

お礼日時:2013/09/18 00:18

>Workbooks("ブック名").Sheets("シート名")


まず例がメソッドチェーンじゃないという時点でいろいろとあれですが。

>クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は)
>自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは
>可能でしょうか?
根本的に考え方がおかしいです。
その場合Meが後ろのメソッドを持つという実装になるべきであって、そんな訳の分からん処理はさせません。

…打ちながら気づいたんですが、そもそも、
>Set BookObj = Workbooks("ブック名")
これがメソッドだと勘違いしてませんか?
Workbooksは「コレクション」です。「現在開かれているすべてのブック」を表し、「("ブック名")」とするとその名前のブックを(開いていれば)返すものです。

この回答への補足

返信ありがとうございます!

いろいろと不適切な表現があり失礼しました。
うまく説明できるか不明ですがもう一度書かせていただきます。
(たぶん、順を追って説明していなかったのもまずかったと思っています)


■背景
ExcelVBAで特定の目的に対し、コードを書いていて
同じようなソースをクラス内に閉じ込めて、やりたいことに
集中できるようにしたいと思っていました。
そこで、Appliationオブジェクト配下のよく使うメソッド、プロパティ、コレクションのみに特化させて、擬似的に(※1)クラス内で実装することでソースコードの記述を減らそうと思っています。

※1:完全に同じものを再現できると考えていない。ついでにいうと、完全に再現することが目的でない


■たぶん本題
そこで、1つの例としてWorkbooksであれば
Appliation.Workbooks としてプロパティにアクセスするとWorkbookコレクションを返し
Application.Workbooks(ブック名)としてプロパティにアクセスするとWorkbookオブジェクトを返し

Application.Workbooks(ブック名).Sheets Workbookオプジェクとのプロパティにアクセスするような使い方をクラスで擬似的に再現できないものかな??
と言う話です。

あくまでも目的は、よくかき回す記述をクラス内にまとめ、やりたいことを簡潔に記述したいということです。

私個人の考えとして上記のような動きをクラスで完全に同じにできると考えていません。なので擬似的にと思っているのですが、あまりきれいな実装にならずもやもやしているところです。
(え?無理なことに努力をするなと・・・)

ここで解答していただきたいことは、
いやいやいやいやいや、あなたの知識が浅いだけでこうしたらできますって!
という解答。

または、擬似的であればこんな感じだったら、実装できまっせ
という解答。

または、そもそも発想がおかしい。出直してきなさい。
という解答。

または、その他。

よろしくお願いします。

補足日時:2013/09/15 00:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!