top of page
検索

ExcelでVBA:配列が空かどうかの判定

更新日:6月22日

私、便利なので配列をガンガン使うタイプなのですが、関数の引数として動的配列を使う場合は注意が必要ですよね。要素数が0の場合に何等かのインデックスを指定したものなら、即座にエラーと怒られてしまいます。よって、要素数が0(=空)かどうかを判断する方法を確立しておきたいと思い、いろいろ調べた結果を備忘録しておきます。



※以降の処理は、何れもVBE(Visual Basic Editor)メニューの「ツール」-「オプション」-「全般」-「エラートラップ」にて「エラー処理対象外のエラーで中断」を設定しています。

「オプション」設定


■ 動作環境

 

OS: Windows 10 Home(64ビット)

Excel: 2019(64ビット)



■ Sgn関数

 

2024.06.19:

動きが以前と変わっているので説明割愛します。

Sgn関数の利用はおすすめしません💦



■ 論理演算子Not

 

「Not」は、論理否定。Notに渡す条件式がTrueの場合にはFalseを、逆にFalseの場合にはTrueを返します。


このNotに動的配列を渡すと次のような動きになりました。



実行結果どおり「Dimで定義した後、そしてRedimで再定義する前」と「Eraseで初期化した後」は、必ず-1を返す…な動きを応用して、「配列が空かどうか」の判定に使われているようです。


ただし、その逆の場合はSgn関数と同様。

また値がコロコロ変わっています…💦

よって、この方式もおすすめしません!💦



■ UBound関数でのエラー発生をキャッチ

 

UBound関数は、引数として渡した配列の要素数の最大値を返します。

配列が空の場合にUBound関数に渡すとエラーが発生するため、その動きを利用して「配列が空かどうか」の判定に使います。



実行結果どおり「Dimで定義した後、そしてRedimで再定義する前」と「Eraseで初期化した後」は、必ずエラーが発生するため、「配列が空かどうか」を判定することができます。


空でない場合(=False)も安定した判定感なので、この理屈で独自の判定関数を作ってみました。


isEmptyArrayがそれなのですが、無茶苦茶乱暴なロジックになっています(笑)

  • ほんとはargが配列かどうかIsArray関数で判定したほうが良いかもー

  • ほんとはErrが発生したら…ではなく、Errが発生して「インデックスが有効範囲~的なエラー」だったら…的な判定をしたほうが良いかもー

まぁ、でも安定して動くようなので、これで一旦完了です。^^



■ まとめ

 

いかがでしたでしょうか?

任意の関数を介して動的配列を操作する場合は、重宝しそうですよね、この考え方。ベストな方式がエラー発生を逆手にとって…というのがしっくりこない気もしますが、これはこれでありだと思います! 次回以降も、苦労した点を備忘録しようと思います。

閲覧数:17,772回0件のコメント

Comments


bottom of page