かなり前の記事にコメントして申し訳ないけど
一応インターフェイス使えばポリモーフィズム使えますよ
hoge as IHoge はインターフェイスとして
Select Case TypeName(hoge)
Case "CHoge"
Case "CHoge2"
End Select
ちょっとルビーっぽい?
いちいちタイプ名の文字列でわかれてるのがウザいですが
>higeさん
なるほどこんな技があるのですね。TypeNameってC++のキーワードにもありますが、使い方が全然違うので混乱しそうです。
今の職場だとExcel2000のVBAぐらいしか使えないので・・・
色んな言語を渡り歩くと、protected,private,publicとかのスコープの違いなんか気になりますよね
VBAで私が泣いたのは
・イテレータがcollectionと配列ぐらいにしか使えない
・関数がオーバーロードできない
・コンストラクタの引数が固定←書かれてますね
・Excelのバグや、変な仕様を気にするあまり大量のエラートラップが・・・
・フォームのイベントがいまいち使えない
・そもそもExcel2000ではオートシェイプがズレル→ブックを開く人によって、内容がかわる・・・汗 それに伴って、ズレ量をごまかしたり、オートシェイプのバウンドボックスが回転が入るとまったく使えないだとか、グループ化されたオブジェクトの座標が良くわからないとか←デバッガで見ると、整数型・・・Singleじゃなかったのか・・・だとか
良いところは
・会社で使える(笑 前はborlandのコンパイラ入れてましたが・・・IDEまで何も準備せずに使えるVBAが結局・・・)
・Excelの関数等はヘルプを見るだけで使える(インターネットも使えない環境)
・Win32APIならそれなりに使える
まぁ、妥協の塊のようなメリットですが・・・
オブジェクト志向で困ったといえば、SingleTonなクラスが実現できないとか モジュールもクラスみたいなものなんだから、オブジェクトとして扱わせてくれよ・・・と思ったり・・・
オブジェクト指向使わないでVBAプログラムしてる人って、ポインタも何も無い状況で、データ構造どう扱ってるんでしょうね・・・笑
クラスを使えばデータ構造作れるので、Cの構造体使ってクラスを実現するのを逆にしたと思えば・・・
気持ち悪いコードがたくさん出てきますよ
実行速度でも
Win32のDIBitmapを使った
メモリマップドビットマップなんて、死ぬほど重くて使えた物では無かったですが、GDIに限定すれば使えます
ここまで書いておいて何ですが
C++のコンパイラが使える環境なら、dll作ってExcelで呼んで使用しますね・・・
Excel上で動く というニーズがあるんですよね・・・
VBAで泣かないためには、WindowsAPIを学んだ時のような・・・哀しい覚悟が必要ですね・・・
>higeさん
長文のコメントからご苦労が伺えます。
Excelで動くメリットが社会的にはかなり重要だ、というのは同感です。現場によってはExcelがWordとして使われているようですから。改行するかわりにセルで文章を組む、とか本当に見ていて痛々しい限りです。ITがまさに雇用を創生しているのが頷けます(笑)。
Setについてですが確かに面倒ですね。
VBAの各種オブジェクトのデフォルト・プロパティが単なる代入式(Let)で代入可能なのでSetが欠かせないという羽目になったと私は思っています。個人的にはデフォルト・プロパティなんかいらんのにと思う次第。
DIM foo as Range
set foo = Range("A1")
foo = Range("B2") '' (1)
こう書かれていて、これをどう解釈するかが、Setなしには立ち行かなくなるのが痛い。デフォルト・プロパティがなければ、(1) では foo に Range("B2") の参照が代入されるとVBA側が解釈すればよいのですが、実際にはデフォルト・プロパティであるvalueがあるために、 foo.value = Range("B2").value という結果と同じになってしまいますよね。Set の有無で解釈が変わってしまう(動作が変わってしまう)のもいただけません。デフォルトがあると便利だろうと考えてそのようにしたのかもしれませんが、おかげで Set を余儀なくされてしまいました。 仕様と言えばそれまでですが、個人的には使用するプロパティは明示されるべきだと思います。
foo.value = Range("B2").value
これでいいじゃないかと。デフォルト・プロパティを考えた人は、「ナイス!」って思ったんでしょうね。。。トホホです。
>ironyaさん
コメントありがとうございます。随分と過去のことなので記憶とともにVBAは葬り去りましたが、なるほど『ナイス』って思っちゃったことによる弊害なんでしょうね… 確かにSetなしでは立ち行きませんね。