0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

別ブックのマクロを呼び出してクラスを返してもらう【ExcelVBA】

Posted at

こんな記事を見かけて機能別にブックを切り分けたくなってきたので模索中メモ

単機能ならまだしも複数機能にまたがるクラスってどうなるのか試してみた。

結論

  • クラスとして戻り値を得ることはできる
  • ただし型がVariantになり、インテリセンスも使えない

使えるには使えるけど結局ブックを分けたところで、更新があった場合呼び出す側も呼び出される側もどちらも更新しなきゃっぽい。

せいぜい使うクラス単位くらいに分けて管理?
そもそもRelaxToolsとか何機能あるんだよだもんね

皆さんバージョン管理ってどうやってるのでしょうか?
そろそろGitデビュー時?

以下コード

呼び出される側

クラス

呼び出される側 clsTest
Option Explicit

Public str As String
Public val As Long

標準モジュール

呼び出される側 bas
Option Explicit

Function testClass(str_ As String, val_ As Long) As clsTest
  ' 別ブックから呼び出してクラスを返せるか
  Dim clsT As New clsTest
  With clsT
    .str = str_
    .val = val_
  End With
  Set testClass = clsT
End Function

呼び出す側

標準モジュール

呼び出す側
Option Explicit

Sub test_クラスを返してもらう()
  
  ' 下ごしらえ:呼び出す別ブックのフルパス、プロシージャ名を付与
  Const 呼び出す別ブックのフルパス = "C:\Users\hoge\呼び出される側.xlsm"
  Const プロシージャ名 = "testClass"
    
  ' 別ブックを開く
  Dim wb As Workbook
  Set wb = Workbooks.Open(呼び出す別ブックのフルパス)
  
  ' メイン:別ブックのプロシージャを引数つきで呼び出す
  Dim 戻り値
  Set 戻り値 = Application.Run(wb.Name & "!" & プロシージャ名, "strTest", 12345)
  Stop
  With 戻り値
    Debug.Print .Str
    Debug.Print .Val
    
  End With
  
  ' 終了処理
  Set wb = Nothing
  Set 戻り値 = Nothing
  
End Sub

返してはもらえるが型がVariantになる
インテリセンスも使えない
image.png

呼び出される側自身でtestClassを呼ぶと型がクラスになる
インテリセンスは当然使える

Sub testCallClass()
  Dim clsT As clsTest
  Set clsT = testClass("qwerty", 12345)
  
  Stop
End Sub

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?