動的な構造体の配列がEraseされているかどうか知る方法を教えてください。
If IsErase(udtArray) Then
みたいなのってありますでしょうか?
IsEmpty、Is Nothing等やってみたのですがエラーになります。
なんか基本中の基本っぽいのに知らないって言うのが恥ずかしいです><
皆様はどのようにやっていますか?
残念ながら、エラートラップで処理するしか無いのです。
一応、APIを使えば判定できますが、そこまでする必要があるかどうか…。
Option Explicit
Private Declare Function SafeArrayGetDim Lib "oleaut32" _
(ByVal psa As Long) As Long
Private Declare Function VarPtrArray Lib "msvbvm60" _
Alias "VarPtr" (ByRef var() As Any) As Long
Private Type MyType
aaa As Long
bbb As Integer
ccc As Boolean
End Type
Private Sub Form_Load()
Dim udtArray() As MyType
'ReDim前
MsgBox IsEraseMyType(udtArray)
'ReDim後
ReDim udtArray(3)
MsgBox IsEraseMyType(udtArray)
'Erase後
Erase udtArray
MsgBox IsEraseMyType(udtArray)
End Sub
Private Function IsEraseMyType(ByRef MyTypeArray() As MyType) As Boolean
IsEraseMyType = CBool(SafeArrayGetDim(VarPtrArray(MyTypeArray)) = 0)
End Function
なるほど。
確かにAPI使うまでもないかもしれません。
しかし参考になりました。長年の疑問が解決しました。
有難うございました。
良く考えたら、VarPtrArrayを使う必要は無かったかも。
Private Declare Function SafeArrayGetDim Lib "oleaut32" _
(ByRef psa() As Any) As Long
と宣言して、
If SafeArrayGetDim(udtArray) = 0 Then
Debug.Print "ReDimされていない"
End If
という感じで十分かな。
ツイート | ![]() |