ExcelVBAにおいて
Set SheetObj = Workbooks("ブック名").Sheets("シート名")
のようにメソッドチェーンで書くことができますがこれをクラスで
真似る場合
Public Function Workbooks(Optional ByVal BookName as Variant = "")
'処理
Set Workbooks = Me
End Function
とすればメソッドチェーンで書けるようになりますが・・・
Set BookObj = Workbooks("ブック名")
のように後ろにメソッドが来なければブックのオブジェクトを返すといったような
挙動をすることはできますでしょうか?
まとめ。
クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は)
自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは
可能でしょうか?
No.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
No.1
- 回答日時:
>Workbooks("ブック名").Sheets("シート名")
まず例がメソッドチェーンじゃないという時点でいろいろとあれですが。
>クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は)
>自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは
>可能でしょうか?
根本的に考え方がおかしいです。
その場合Meが後ろのメソッドを持つという実装になるべきであって、そんな訳の分からん処理はさせません。
…打ちながら気づいたんですが、そもそも、
>Set BookObj = Workbooks("ブック名")
これがメソッドだと勘違いしてませんか?
Workbooksは「コレクション」です。「現在開かれているすべてのブック」を表し、「("ブック名")」とするとその名前のブックを(開いていれば)返すものです。
この回答への補足
返信ありがとうございます!
いろいろと不適切な表現があり失礼しました。
うまく説明できるか不明ですがもう一度書かせていただきます。
(たぶん、順を追って説明していなかったのもまずかったと思っています)
■背景
ExcelVBAで特定の目的に対し、コードを書いていて
同じようなソースをクラス内に閉じ込めて、やりたいことに
集中できるようにしたいと思っていました。
そこで、Appliationオブジェクト配下のよく使うメソッド、プロパティ、コレクションのみに特化させて、擬似的に(※1)クラス内で実装することでソースコードの記述を減らそうと思っています。
※1:完全に同じものを再現できると考えていない。ついでにいうと、完全に再現することが目的でない
■たぶん本題
そこで、1つの例としてWorkbooksであれば
Appliation.Workbooks としてプロパティにアクセスするとWorkbookコレクションを返し
Application.Workbooks(ブック名)としてプロパティにアクセスするとWorkbookオブジェクトを返し
Application.Workbooks(ブック名).Sheets Workbookオプジェクとのプロパティにアクセスするような使い方をクラスで擬似的に再現できないものかな??
と言う話です。
あくまでも目的は、よくかき回す記述をクラス内にまとめ、やりたいことを簡潔に記述したいということです。
私個人の考えとして上記のような動きをクラスで完全に同じにできると考えていません。なので擬似的にと思っているのですが、あまりきれいな実装にならずもやもやしているところです。
(え?無理なことに努力をするなと・・・)
ここで解答していただきたいことは、
いやいやいやいやいや、あなたの知識が浅いだけでこうしたらできますって!
という解答。
または、擬似的であればこんな感じだったら、実装できまっせ
という解答。
または、そもそも発想がおかしい。出直してきなさい。
という解答。
または、その他。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- Visual Basic(VBA) Csvファイルの最終行を取得する構文はこれであっていますか?オブジェクトは、このプロパティまたはメソ 3 2022/12/26 14:38
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) worksheets & rows メソッドは失敗しました。のエラー回避のやり方 1 2022/06/07 13:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
コマンドプロンプト実行後に画...
-
JSPで<SELECT>の中にDBから持っ...
-
VB.netで、シリアル通信のタイ...
-
boolean型のフィールドとゲッタ...
-
mainメソッドのthrows節で設定...
-
Excel VBA でExcelを終了したい...
-
onClickで関数呼出し後に、結果...
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
Refreshメソッドの使い方
-
DataGridViewでセルクリックイ...
-
シンボルを解決できません。 ...
-
ListViewにて行追加
-
AdapterView<?> parent この部...
-
worksheets & rows メソッドは...
-
サーブレット DBにある生年月...
-
ポストバック時のDatasourceバ...
-
ASP.NET MVCのホームページ表...
-
ダブルコロンの役割
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
Labelコントロールに数字を代入...
-
final修飾子を使っているのに、...
-
エクセルVBAにおけるON TIMEメ...
-
コマンドプロンプト実行後に画...
-
mainメソッドのthrows節で設定...
-
DataGridViewでセルクリックイ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
ExcelのxlDialogInsertPictureで。
-
Refreshメソッドの使い方
-
JSPで<SELECT>の中にDBから持っ...
-
【sendkeysメソッドが動かずに...
-
ウィンドウを最前面にできません
-
(String args[])というメッソ...
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA シェイプの原型のサ...
-
VB.netで、シリアル通信のタイ...
-
boolean型のフィールドとゲッタ...
おすすめ情報