Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13601 / 76732 ←次へ | 前へ→

【68634】Re:動的配列の初期化について
発言  UO3  - 11/3/31(木) 13:46 -

引用なし
パスワード
   ▼Tacchi さん:

こんにちは

横から失礼します。
錚々たるエキスパートの方々からの回答もあり、私なんぞのでる幕ではありませんが

・まず、動的配列を規定したかどうかの判断を行いたい場合、一番簡単な方法は
 配列にセットするループの最初でブール型の変数あたりをFalseにしておき、RedimかけたらTrue。
 配列から取り出すループの前に、この変数の値を判定する。

・そうではなく、どうしても配列が初期化されているかどうかの判定をしたいということなら
 以下のコードは、以前に別のところでyukiさんに紹介いただいたもの(と記憶)ですが。
 判定プロシジャ GetDim は本来は次元数を取得するものですが、ここでの戻り値が 0 なら
 動的配列だけど初期化されていないということになります。
 あるいは今回の場合は1次元配列ですから戻り値が 1 かどうかの判定のほうがいいかもですね。
 (2003で検証済み。2007以降では未検証です)

・いずれにしても【めったやたらに】エラートラップを使うのはどうなんでしょうか。
 本来のバグまでもが隠されてしまいますよね。

Option Explicit

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByVal psa As Long) As Long
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal ptr As Long, ByRef ret As Long)

Sub Test()
  Dim pas As Long
  
  Dim a As Variant
  ReDim a(2, 2)      '2次元動的配列
  
  Dim b As Variant    '配列ではない
  
  Dim c() As Variant
  ReDim c(2, 2, 2)    '3次元動的配列
  
  Dim d() As Variant   '初期化されていない配列
  
  Dim e(1) As Variant   '1次元静的配列
  
  Dim f(2, 3) As Variant '2次元静的配列
  
  MsgBox "a:" & GetDIm(a)
  MsgBox "b:" & GetDIm(b)
  MsgBox "c:" & GetDIm(c)
  MsgBox "d:" & GetDIm(d)
  MsgBox "e:" & GetDIm(e)
  MsgBox "f:" & GetDIm(f)

End Sub

Private Function GetDIm(ByVal sa As Variant) As Long
  Dim p As Long
  
  If IsArray(sa) Then
    GetMem4 VarPtr(sa) + 8, p
    If p = 0 Then
      GetDIm = 0 '初期化されていない配列
    Else
      GetDIm = SafeArrayGetDim(p) '配列については次元数を返す
    End If
  Else
    GetDIm = -1 '配列ではない
  End If
  
End Function

 
1 hits

【68618】動的配列の初期化について Tacchi 11/3/30(水) 14:11 質問
【68619】Re:動的配列の初期化について Tacchi 11/3/30(水) 14:31 質問
【68620】Re:動的配列の初期化について momo 11/3/30(水) 15:13 発言
【68657】Re:動的配列の初期化について Tacchi 11/4/3(日) 15:35 質問
【68695】Re:動的配列の初期化について momo 11/4/7(木) 10:13 発言
【68623】Re:動的配列の初期化について neptune 11/3/30(水) 16:24 回答
【68626】Re:動的配列の初期化について neptune 11/3/30(水) 23:25 回答
【68658】Re:動的配列の初期化について Tacchi 11/4/3(日) 15:39 お礼
【68627】Re:動的配列の初期化について 角田 11/3/31(木) 0:31 回答
【68659】Re:動的配列の初期化について Tacchi 11/4/3(日) 15:43 お礼
【68628】Re:動的配列の初期化について Yuki 11/3/31(木) 10:08 発言
【68662】Re:動的配列の初期化について Tacchi 11/4/3(日) 16:00 お礼
【68634】Re:動的配列の初期化について UO3 11/3/31(木) 13:46 発言
【68660】Re:動的配列の初期化について Tacchi 11/4/3(日) 15:50 お礼
【68640】Re:動的配列の初期化について Hirofumi 11/3/31(木) 18:36 回答
【68642】Re:動的配列の初期化について Hirofumi 11/3/31(木) 20:29 回答
【68661】Re:動的配列の初期化について Tacchi 11/4/3(日) 15:58 お礼
【68696】解決済みですが。 Jaka 11/4/7(木) 12:36 発言
【68697】かぶっていたけど、まいっか。 Jaka 11/4/7(木) 12:50 発言

13601 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free