【VBA】SafeArrayGetDim を使って、配列の次元数を求める
ネットを見ていると、SafeArrayGetDim のVBA での宣言は、以下のように書かれているのを見かける。
Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32" (ByRef psa() As Any) As Long
しかし、MSのサイトの C++ 表記では、以下のようになっている。
UINT SafeArrayGetDim(
[in] SAFEARRAY *psa
);
引数は、SAFEARRAY を指すポインタであるので、今回の処理では、以下のようにして使っている。
(最初に書いた宣言で、配列を渡すと、意図した値は返ってこないようです。)
Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32" (ByVal psa As LongPtr) As Long
実行結果
備考
SAFEARRAY を指すポインタが取得できれば、SAFEARRAY 関連のAPIを使って出来ることが増えるかもしれません。
こちらのサイトを参考にさせていただきました。
www5f.biglobe.ne.jp
別解
2022/9/29 追記
SAFEARRAY を指すポインタが取得できたら、SafeArrayGetDim を呼ばずに、SAFEARRAY 構造体の先頭メンバー cDims を取得してもよさそう。
Dim iDims As Integer 'SAFEARRAY 構造体の戦闘メンバー cDims を引っ張ってくる Call RtlMoveMemory(iDims, ByVal pArray, Len(iDims))