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

とりあえず、このようにしてみた。

ラップしたシートオブジェクトrealShMoveメソッドを実行したあと、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

ちなみに、もとのブックは

f:id:akashi_keirin:20191012084252j:plain

この状態。

スト2を実行すると、

f:id:akashi_keirin:20191012084255j:plain

この状態。

で、イミディエイトは、

f:id:akashi_keirin:20191012084258j:plain

この状態。当然、移動したシートそのもののシート名を返している。

引数を省略した場合

問題は、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を出力させようという試み。

こいつを実行すると、

f:id:akashi_keirin:20191012084300j:plain

なんじゃこら。初めて見たよ、こんなエラー。

[デバッグ]をクリックして、再度そのまま実行を続けると、

f:id:akashi_keirin:20191012084304j:plain

今度はエラーの種類が変わった。以後、何度繰り返してもこいつが出る。

ちなみに、一応

f:id:akashi_keirin:20191012084306j:plain

このようにシートの移動はできている。

これは困った。

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を再度実行。

f:id:akashi_keirin:20191012084310j:plain

この状態で実行すると、

f:id:akashi_keirin:20191012084312j:plain

こうなって、イミディエイトは

f:id:akashi_keirin:20191012084315j:plain

この状態。

とりあえず意図どおり。

おわりに

さて、これで良いものだろうか。