2009/6/3
Cells.Select !
‘Cells.Select’は、表計算ソフト・エクセルのプログラミング言語であるVBAの命令文です。
エクセルに慣れて来て計算機能をある程度使いこなせるようになってくると、更に便利さを求めるときにぶち当たるのが、VBAです。VBAは、これまで何度か挑戦してきたのですが、ある程度のレベルでいつもストップしていました。でも、今回は、結構長続きしていて、それなりのレベルに達しました。
そこで出くわしたのが、命令文’Cells.Select’です。きっかけは、エクセルのシート数枚をコピーして、他のエクセルファイルに貼り付ける場面でした。‘Cells.Select’は、シートのセルをすべて選択する命令文です。マニュアル本には、そう書いてあります。
シート全体のセルを一度に選択できる便利な命令文なのです。そこで早速命令を実行したのですが、エラーが出ます。やたらと処理に時間がかかった後のエラーです。
シート中のデータが多過ぎて処理しきれなくなった・・・?そう思い、行と列に処理を分けて、それぞれコピーして形式を選択して貼り付け、後に値を貼り付ける処理に変えてみました。この場合、列に関しては、列幅を一度に指定する関数が存在します。しかし、行の高さについては一発指定の関数はないため、一行ずつ、移動元シートと移動先シートのセルの高さを調べ、同じ場合はそのまま、違う場合は元のセルの高さに合わせる、という処理が必要になります。
これで、望みどおりの動きは実現できました!・・・しかし、一行毎にいちいち移動元シートのあるファイルと移動先シートのあるファイルを行ったり来たりしなければいけないため、やたらと時間がかかります。実用には耐えないレベルの速さでした。
何か、もっといい方法はないものか・・・何気なくネットサーフィンしていたら、見つけました!‘Cells.Select’のクセです。‘Cells.Select’を実行した後に図形を選択し、さらに’Cells.Select’といった動作を繰り返していると、どういう訳か、エクセルが選択する対象を見失ってしまうらしいのです。この問題に対処するため、このサイトではその回避策が披露されていました。しかしその回避策は私には難しすぎたので、単純に’Cells.Select’→貼り付け後、一旦各シートの一番左上のセル’A1’を選択してから図形を選択するようにしました。
これにて一件落着!耐えられる速さでプログラムが動くようになりました。
このプログラムという代物、作成を依頼するクライアントからすれば、プログラマーから専門用語を持ち出されて遅延理由を説明されたりすると、何だか煙に巻かれたような気分になってしまいます。「本当はやる気がないだけでは?」とか。
たしかに、そういうときもあるでしょう。しかし、表からは見えない細かい所で、少しでも効率的な良いプログラムをつくろうと努力している職人気質のプログラマーもいるのだと思います。
細部にこだわりすぎることを揶揄して「木を見て森を見ず」という言葉があります。しかし、逆に、「神は細部に宿る」とも言われます。要はバランスです。全体観を持ちながらも、見えない細かい所にこそ技術の結晶が凝縮されているということをいつも胆に落としておくことだと思います。
もっとも、私の’Cells.Select’策、もっと優れた手法がきっとあるはずです。更に言えば、VBAの世界だけでも、構造体とかクラスモジュールとか、私が全く触れたことのない奥深い世界が更に更に広がっています。しかも、プログラミング言語はエクセルVBAに留まりません。アクセスVBA、Pearl、C・・・日々勉強、修業は続きます・・・