Worksheetクラスを継承したクラスを作る(7)
Worksheetクラスを継承したクラスを作る(7)
ここまでの経緯はコチラからどうぞ。
Moveメソッドのオーバーライドw
いよいよMove
メソッドにまでたどり着いた。思えば遠くへ来たもんだ。
もともとSub
、すなわち返り値なしのメソッドだが、Copy
メソッド同様、移動後のシートを返すような仕様にしたい。
リスト1 クラスモジュール PoweredSheet
※関係する部分のみ
'Module Level Variable' 'ラップするシートオブジェクトを格納する変数' Private realSh as Worksheet Public Function Move(Optional ByVal Before As Variant, _ Optional ByVal After As Variant) As Worksheet Dim ret As Worksheet Call realSh.Move(Before, After) Set ret = realSh Set Move = ret End Function
とりあえず、このようにしてみた。
ラップしたシートオブジェクトrealSh
のMove
メソッドを実行したあと、realSh
を返すような形。
こいつを、次のコードで実行。
リスト2 標準モジュール
Private Sub test04() Dim ps As PoweredSheet Set ps = New PoweredSheet Call ps.init(Sheet1) Dim sh As Worksheet With ps Set sh = .Move(After:=Sheet2) Debug.Print sh.Name End With End Sub
ちなみに、もとのブックは
この状態。
リスト2を実行すると、
この状態。
で、イミディエイトは、
この状態。当然、移動したシートそのもののシート名を返している。
引数を省略した場合
問題は、Move
メソッドの引数を省略した場合。
この場合、新しいブックをわざわざ作って、そこに移動してしまうらしい。知らなかった。
で、上のリスト2をちょこっと変更して、次のようにしてみる。
リスト3 標準モジュール
Private Sub test04() Dim ps As PoweredSheet Set ps = New PoweredSheet Call ps.init(Sheet1) Dim sh As Worksheet With ps Set sh = .Move Debug.Print sh.Parent.Name End With End Sub
Move
メソッドの引数を全省略して実行。その後、移動後のシートのParent
(つまり親ブック)のName
を出力させようという試み。
こいつを実行すると、
なんじゃこら。初めて見たよ、こんなエラー。
[デバッグ]をクリックして、再度そのまま実行を続けると、
今度はエラーの種類が変わった。以後、何度繰り返してもこいつが出る。
ちなみに、一応
このようにシートの移動はできている。
これは困った。
Moveメソッドのコードの修正
うーむ、困った。
とりあえず、Move
メソッド実行直後に、移動したシートが表示される現象を利用して、次のように書き直してみた。
リスト4 クラスモジュール PoweredSheet
※関係する部分のみ
Public Function Move(Optional ByVal Before As Variant, _ Optional ByVal After As Variant) As Worksheet Dim ret As Worksheet Call realSh.Move(Before, After) Set ret = ActiveSheet Set Move = ret End Function
われながら、ActiveSheet
なんぞを使っているところがイマイチ極まりないw
実行
リスト3を再度実行。
この状態で実行すると、
こうなって、イミディエイトは
この状態。
とりあえず意図どおり。
おわりに
さて、これで良いものだろうか。