前提・実現したいこと
VBAで あるライブラリを使用しているのですが、
その中の関数が、結果によってオブジェクトと値のどちらを返してくるか
実行してみるまで分からない仕様となっており
呼び出し側で戻り値をどう受ければよいか困っております。
とりあえず値が戻ると仮定して一度呼び出して、
エラーになれば再度オブジェクトとして受けるように呼び出すという手段もあるかと思いますが
関数の背後で通信が発生しているため、あまり頻繁な呼び出しは避けたいと思っています。
なにか良い方法はありますでしょうか?
(該当のライブラリはBSDライクのライセンスなので、受け手でどうにもならない場合は
ライブラリのコードに手を入れることも考えています)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
どうやるのが一般的か知らないですが思い付いた方法を回答します。
まず、以下のクラスを作成します。
VBA
1Public X As Variant 2Public IsObject As Boolean 3 4Public Sub SetX(v As Variant) 5 If VBA.Information.IsObject(v) Then 6 Set X = v 7 IsObject = True 8 Else 9 X = v 10 IsObject = False 11 End If 12End Sub
使い方は次の通り
VBA
1Public Sub test() 2 Dim t_Container As New Container_Class 3 Dim t_X As Variant 4 5 ' オブジェクトの場合 6 t_Container.SetX Sheet1 7 If t_Container.IsObject Then 8 Set t_X = t_Container.X 9 Else 10 t_X = t_Container.X 11 End If 12 13 ' 値の場合 14 t_Container.SetX 1 15 If t_Container.IsObject Then 16 Set t_X = t_Container.X 17 Else 18 t_X = t_Container.X 19 End If 20End Sub
関数の引数にすれば、オブジェクトでも値でも受けれるので
それを利用した感じです。
別にクラスを作らなくても出来ますが、まぁ一例ということで。
投稿2022/01/11 13:13
編集2022/01/11 13:17総合スコア1508
0
xail2222さんの「関数の引数にすれば、オブジェクトでも値でも受けれる」という素晴らしいアイデアを拝借して、
vba
1'外部ライブラリのつもり 2Public Function GetX(i As Long) 3 If i = 0 Then 4 Set GetX = Sheet1 5 Else 6 GetX = i + 1 7 End If 8End Function 9 10Public Sub SetX(ByRef X, V) 11 If IsObject(V) Then 12 Set X = V 13 Else 14 X = V 15 End If 16End Sub 17 18Public Sub test() 19 Dim X As Variant 20 21 SetX X, GetX(0) 22 Debug.Print TypeName(X) 23 If IsObject(X) Then 24 Debug.Print X.Name 25 Else 26 Debug.Print X 27 End If 28 29 SetX X, GetX(1) 30 Debug.Print TypeName(X) 31 If IsObject(X) Then 32 Debug.Print X.Name 33 Else 34 Debug.Print X 35 End If 36 37End Sub
ベストアンサーは辞退します。
投稿2022/01/11 14:01
総合スコア34075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
値なのかオブジェクトなのかをどう判別するかは分かりませんが
取り合えず、Variant型で受け取って、それを使って諸々の判定を行えば良いのではないでしょうか
例えば、値が数値ならば、IsNumericで判定した後でCIntやCLngで変換すれば良いでしょうし
投稿2022/01/11 10:04
総合スコア211
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/11 13:58
2022/01/11 14:33
2022/01/12 04:30