こちらの続きです。
Excelのマクロ - C#ATIA
続きって程でもないんですけどね。
結局、最初の納期には間に合わず、断念。
次のデータを待っている間に突貫で作りましたが、あまりに
特定の客先向けなので、公開出来ません。(本音は恥ずかしい)
結局作ったのは、ExcelのBookを2つ開き、CATIAのファイルを扱うという
何とも面倒なものとなりました。
CATIA側は大した処理は無いのですが、Excelに苦戦。5:1ぐらいの比率で
手間がかかりました。コード的にはちっともExcelっぽくないはず。
苦しんだ理由の一つが、2つのBookを扱っていたので、「Cells」とか
機能するのですが、「お前、何やつ?」(どっちのBookのやつ?)とか
迷っちゃいます。
CATIAだとDocumentから丹念に下りて行って取得するのですが、いきなり
「Cells」とか「Rows」とかだとビックリしちゃいます。
(人によっては便利と感じるのでしょうが・・・個人的にはスコープのでかい
変数がドカンって置かれているようで不気味です)
もう一つがコレクション。必要なセルを読み取ってかき集め・・・と言うのを
何度か行わなきゃならなかったのですが、後の処理を考えると辞書(ディクショナリ)
が欲しかったんですよ。VBAのコレクションはキー付きでの格納が出来て
単なるコンテナより呼び出しが速かった事を覚えていたので、コレクションを
辞書としてコード書き始めたんですが、コレクションの代入って
Collection.Add value, key
なんですね。 もう違和感しかなかったです。(途中で間違えたし・・・)
確かにKey無しでも使えるのを考えると、key側はオプション引数だから
前にはもっていけないんだろうなぁ とは、変な納得はしました。
後はキーの重複を避ける、isExistのようなものが無いんですね。
「On Error Resume Next」使いながら逃げましたよ。
でも2/3ぐらいまで書いた上で事件が。
コレクションはvalueの列挙は出来るのですが、keyの列挙って出来ないですよね?
ちょっと検索したけど見つかりませんでした。keyの列挙って需要無いこと無いと
思うのですがねぇ。
結局、愕然としながらScripting.Dictionaryに書き換えました、涙流しながら。
2度とコレクションを辞書としては使わない と決めました。
40個ぐらいモジュールがあって、全て「Option Explicit」無しで、スコープの
デカい変数がいっぱいあって、ほとんどの関数がPublicで、定数が全くなくて、
10個弱のクラスモジュールがあって、中身はプロパティぐらいでメソッド
ほぼ無しで、コメント化された古いコードが半分ぐらいあったので、
読み解くモチベーションが出てこなかったです。
出来上がったものは満足出来ていないので、最低限にすらちょっと足りない
レベルですが、多少の変更にもコードを修正しないでシートの値を修正する
だけで対応出来るようにしたし、オリジナルより処理が速いはず。