Collectionを投げ捨てろ!

今回は仕事で使っているVBAについてです。
ツイッターから見た人は既に存じ上げているかとは思いますが、VBAはモダンパラダイムが無いとか、継承が無くて似たようなクラスを作れないとか、めんどくさいことが多いデス
あとは他言語にあるListとかそういうアレがデフォルトで実装されている(Collection)ものの……欠点が多いです。
連想配列は便利だけどぶっちゃけそこまで求めてないし……

具体的には

  • 機能が貧弱(値の追加・削除、コレクションの要素数取得くらい。配列の要素を突っ込めない)
  • インデックスが0から始まらない気持ち悪さ(他言語経験故のアレ)
  • ジェネリクスがないせいで何でも入っちゃう型安全行方不明

だったら自作すればいいじゃない!
というわけでざっくりとした案。String限定ですけど

  • 初期の配列長は1かつインデックス0から開始(Option Base 0)
  • 新たに値を追加するとPreserve ReDimで再定義して末端に挿入。
    • 配列を突っ込んだ場合は突っ込む分だけ余白を作って再定義
  • 配列の要素を削除すると後ろから要素が詰めてきて配列を再定義。
    • いっそ特定の区間の要素を削除するとかもやっちゃおうぜ
  • Attribute弄らなきゃForEachできない? だったら格納してる配列返せばええねん
  • 値が存在するか確認したい? よろしいならばContainsだ(格納してる配列をForEachして値があるかどうか判別してBoolean返すだけー)
  • いっそLINQみたいに配列丸ごと文字列操作できるようにしちまおうぜ。(前後に文字列を付け加える、置き換える))
  • ポリモーフィズムが存在しないので引数VariantでArray()して変なのが突っ込んで来られてもいいようにVarTypeして判定を取る(多分これが一番重いと思います)
    • なお、この結果で数値系だとしても文字列化して捻じ込む可能性があります

ぶっちゃけた話、これぐらいやってもシートに描画しまくるほうが時間かかるわけで大して問題は発生しないと思います(汗
そしてこの自作ライブラリを作ったとして、後任者に変な操作されないように異常検知機構を組み込むわけですが、VBAだとTry-Catchとか例外処理がないからGoToとか事前検証で値が妥当であるかとか検証しないといけないんですよねー(焦
車輪の再生産ですが、車輪を買う場所が無い(外部からデータを入れるための情報媒体持ち込めない)から仕方ないデスねハイ。