空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

【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

環境

Windows 11 Home 64bit
Microsoft 365 64bit

実行結果


備考

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))