2015年4月30日木曜日

[p]外から回しちゃいけないらしい

あんまり自分はプログラマーだとは思っていないけども、VBAのソースを見ていると、これってやっぱりプログラムなのかな…と悩んでいるワタクシです。
個人的にどうもスクリプトって感じがしてなりませんけど、どうなのでしょう?

今日は、空き時間にネットをつらつら見ていて(ただ仕事に関係ある所を見ていて)、ほほ~と思ったネタがあったので備忘です。
多分、元ネタ的には結構前に書かれてるかもしれませんので、そんなの業界的(?)に当然て話しかもしれませんが、最前線から離れている身としては「へぇ」を沢山押したくなったものでして。




今は仕事でAccessやらExcelやらのマクロと言うか、VBAを書いてます。(VBAを書いてますと言う日本語は正しいのかしら…)

これまでVBAはAccess VBAが主だったのですが、今回Excel VBAをがっつり触って、とは言うものの、主にはデータの入れ替え(?)的な事をやっているので、ロジックが組めれば、使ってる関数だったりは難しいものではないので、Excel VBAがほぼお初の自分にはとても勉強になっています。

特にExcelそのものの機能が使えるって何て素晴らしいんでしょう、みたいな感じです。AccessだとクエリとDBと画面(フォーム)操作って感じだったもので、Excelそのものって便利と思わざるを得ません。まぁそれぞれ一長一短ですね。

特にExcelではフォームをあんまり使わない代わりに(使わない訳じゃないけどAccessの比ではない)、セルそのものへの操作が多く、そうなると必然的に(私見ですが)配列の使い方が結構肝なんだなぁと思いました。(Accessでも勿論配列は使いますけど、総合的な部分だとSQL書いてなんぼみたいな所ありますからね)

そんな訳で配列に関するネタをほんと何の気なしに見ていたら、こんな教えての記事が載っていました。その記事もそうですが、その中に張ってあるリンク(リンク張っちゃいますが)を見て、ほほ~と。

私は大元をたどるとCのプログラマーをやっていて、それをやる時に受けた研修、がっつり3ヶ月間やらせてもらったのが今でも生きている訳ですが、そこで基礎をやった訳で、for文を使った2次元配列なんかは、リンク先のCode2にあるような

for (i=0; i<n; i++)
      for (j=0; j<n; j++)
 a[i][j] = 1;

こんな書き方を、いわゆる「外側から回す」(2桁だったら10の位が外で、1の位が中、みたいな感じ)事を基本に書いてました。

が、教えての記事の中で、VBAで試された方の結果を見てビックリ。逆の方が速度が早いなんて!軽くショックを受けました(^_^;)。

Excelなんかですと10万件位のデータ量をこなすなんて事は容易にあるので(つい先日やりました。ただ2次元でなくて良かったのであれですが)、こういう速度に直結する部分は微々たるものでも見逃せないなぁと思いました。

個人的にはC言語やってた頃、メモリアクセス云々がしょっちゅう出てくるのがちょっと苦手でしたが(^_^;)さすがに速度の件は体感として出てしまうので、今後気をつけたいと思いましたです。