私、便利なので配列をガンガン使うタイプなのですが、関数の引数として動的配列を使う場合は注意が必要ですよね。要素数が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が発生して「インデックスが有効範囲~的なエラー」だったら…的な判定をしたほうが良いかもー
まぁ、でも安定して動くようなので、これで一旦完了です。^^
■ まとめ
いかがでしたでしょうか?
任意の関数を介して動的配列を操作する場合は、重宝しそうですよね、この考え方。ベストな方式がエラー発生を逆手にとって…というのがしっくりこない気もしますが、これはこれでありだと思います! 次回以降も、苦労した点を備忘録しようと思います。
Comments