VB6メモ:独自関数:配列の要素数


配列の要素数をしりたいときは普通、UBound関数で最大要素インデックスを求めて+1とするかと思います。
ただ困ったことにUBound関数は配列が未割り当ての場合にエラーになってしまいます。



それでは不便なので今回も独自関数を作りました。
簡単なので同じような関数を作っている人もいるかと思いますが…
ここは自分で作って勉強したいと思います。


下記のコードの使用は自己責任でお願いします。



'配列の要素数を返す(2次引数は省略可能)
Public Function arryElmntCnt(ByRef vArray As Variant, _
Optional ByVal dimensionNo As Long = 1) As Long
'引数:
' vArray:配列
' dimensionNo:次元インデックス(省略可)
'戻値:
' 指定した次元の要素数を返します。

On Error GoTo func_err

If IsArray(vArray) And dimensionNo > 0 Then
'配列であり、階層が1以上の場合
arryElmntCnt = UBound(vArray, dimensionNo) + 1
Else
GoTo user_err
End If

Exit Function
func_err:
'要素がない場合
arryElmntCnt = 0
Exit Function
user_err:
'引数が不正値の場合
arryElmntCnt = -1
End Function


上記のコードで配列の要素数(最大要素インデックスではない)が取得できます。
配列が見割り当ての場合は0を返します。




ちなにみVariant型をつかっているので、String/Long/Integer…なんの配列でも処理できると思います。
ただしVariant型はメモリを結構使うらしいので、少し処理速度に問題があるかもしれません。
気になるようでしたら利用内容に合わせて「vArray As Variant」を「vArray() As String」等に変更してください。



あと、Variant型は何でも格納できるようなので、引数として配列以外のものを入れることができてしまいます。
この場合はエラー値として-1を返すようにしています。






コメント
似たようなものはやっぱり作るものですねw
ただ、この関数の目的はUBound関数がVarant配列以外で-1を返さないせいですから、要素数よりもUbound互換の「-1」を返すようにしたほうがコーディングしやすいんじゃないかなぁ。
(直接For文に渡しても無エラー/1度も実行しないようにできますから)

また配列専用関数ですので引数に配列を渡されなかったらその場でエラーを生成するべきかなと。
その時はコーディングミスしかないでしょうし。
  • 通りすがりなな
  • 2010/02/15 7:17 AM
あ、引数自体をvArray()で宣言してしまうって手もありますね。
仮に呼び出し側で間違えて単なるVariantを渡そうとしても即気付きますし、配列の入ったVariantであれば、Variant()とすれば明示的に引き渡せますし。

あとちょっと捕捉:
> 要素数よりもUbound互換の「-1」を返す
Uboudのかわりに使うなら、要素数よりもUbound互換の上限値をそのまま返したほうがいいんじゃないか、という話です。
(Uboundの問題とは別に、要素数を得る関数が必要だるならそれでいいんですけど)
  • 通りすがりなな
  • 2010/02/15 7:30 AM
>通りすがりなな さん
ご指摘ありがとうございます!
やっぱり作りますよねw

>>Uboudのかわりに使うなら、要素数よりもUbound互換の上限値をそのまま返したほうがいいんじゃないか、という話です。
>>(Uboundの問題とは別に、要素数を得る関数が必要だるならそれでいいんですけど)

どちらかというと、この関数は確か要素数を得るために作ったのでこうなってます。
他言語だと要素数を得る関数があったのでそれに合わせたような…?


>>また配列専用関数ですので引数に配列を渡されなかったらその場でエラーを生成するべきかなと。
>>その時はコーディングミスしかないでしょうし。

全く持ってその通りです!
このコーディングだとコーディングミスしても結果が出るまでわかりませんね!
どうもこのときはVariant使うことしか頭になかったみたいです;


ところで、今となってはこの関数は全く使わないものになってしまいました…;
結局VBに慣れるとカウンタ変数と標準関数だけでやったほうが
スマートに感じたりして…
こういったものを考えて上達もしたので無駄ではなかったとは思いますがw
  • 謎猫
  • 2010/02/16 12:58 AM
コメントする








    
この記事のトラックバックURL
トラックバック