[[20230227145639]] 『variant の使い方について』(白音) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『variant の使い方について』(白音)

以下のように
関数から、処理をして該当すれば
POINTAPIで返し、該当しなければ
nothing で返したいのですが
どうすればよいのでしょうか?

Private Type POINTAPI

    x As Long
    y As Long
End Type

function get as variant

 if 〜

	get.x = 1
	get.y = 1
	exit function
	:
 end if

 set get = nothing

end function

いったん別に代入してから
 Dim pnt As POINTAPI
 pnt.x = 1
 pnt.y = 1

 get = pnt
としてもできません。

 set get = pnt
としてもできません。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 残念ながらVariant型にユーザー定義型は代入できませんので....

 代替案を考える必要があります。
 方向性としては、
  a) ユーザー定義型を使わないで、クラスを代替に使う方法
   b) ユーザー定義型をつかって、初期値代入に失敗したときに分かるようにする方法

 たぶんAPIを使いたいのでしょうから、ユーザー定義型を使う前提として、
 b)の方法は、こんな感じになります。

    Private Enum GetPointResult
       FAILURE = 0
       SUCCESS = 1
    End Enum
    Private Type POINTAPI
       x As Long
       y As Long
    End Type
    Sub test()
       Dim p As POINTAPI, tmp As POINTAPI
       If GetPoint(tmp) = SUCCESS Then
          p = tmp
       Else
          MsgBox "Pointの取得に失敗しました"
       End If
    End Sub

    Private Function GetPoint(ByRef p As POINTAPI) As GetPointResult
       Dim newP As POINTAPI
       If 条件 Then
          newP.x = 1
          newP.y = 1
          p = newP
          GetPoint = SUCCESS
       Else
          GetPoint = FAILURE
       End If
    End Function
(´・ω・`) 2023/02/27(月) 15:46:45

 既に明解な回答があります。 参考情報です。

https://excel-ubara.com/excelvba4/EXCEL_VBA_441.html

 を参照してください。
 下記のように書かれています。
 | ユーザー定義型をバリアント(Variant)変数に代入するとエラーとなります。
 | VBAリファレンスには、
 | (Variant 型はユーザー定義型をサポートするようになりました)。
 | このように書かれていますが、
 | これは、ActiveXプロジェクトやタイプライブラリの構造体の事をさしていると思われます。
 | VBA内で定義した構造体を、バリアント(Variant)変数に代入することはできません。

 私も 
 | (Variant 型はユーザー定義型をサポートするようになりました)。
 というVBAリファレンスに騙されました。実際に機能しないので使えませんね。

(abc) 2023/02/27(月) 15:50:54


POINTAPI は使っているので
呼び出し側は2行になりますが、問題ないので
新しく以下のように作って対応します。
ありがとうございます。

 Public Type GetPOINT
  success As Boolean 'Trueなら有効(x,yを使える)、Falseなら無効
  x As Long
  y As Long
 End Type
(白音) 2023/02/28(火) 16:40:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.