和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Cells(R, ○)←○を入力するスピードを極めろ!

横に長い表
↑この「個数」列を処理するコードを書くとします。
 

Cells(R,)

VBAをやっている限り入力し続けることになるであろうこのコードですが、
例えばこの○を、普段どうやって入力していますか?


答えとしてはP列なので16です。



A B C D E F G~♪

とメロディーが始まった方もいるでしょう。


J(yuu)=10 を覚えておいて、そこから数えるのもアリですし、

Bメロ(サビ?)が始まるOが15と覚えておいて、
O P Q R ~♪ から歌えるようにしておくのもいい感じです。


※ 実は原曲は LMNOP(早口)~♪ までがAメロで、
Bメロが Q R S ~♪ から始まるのを最近知って衝撃を受けました。



Excelの機能を使うなら、A1セルからマウスを引っ張ってきて、

列数表示

これを表示させて16!というテクニックや、



空白であるP1セルに「=column()」を入力して

COLUMN関数

こうやってカンニングする方法がありますね。



VBAの機能を使うならイミディエイトウィンドウに、

 ?Selection.Column
 16

とやって、選択セルの列番号を聞くのが早いでしょうか。



事前にマクロを作って用意するのがOKなら、

Sub 列見出し表示をABC⇔123で切り替える()
    If Application.ReferenceStyle = xlA1 Then
        Application.ReferenceStyle = xlR1C1
    Else
        Application.ReferenceStyle = xlA1
    End If
End Sub

こんなマクロを用意しておいて、

列見出しの表示切替

と、もう列の見出し表示を「123」にしてしまうという奥義もあります。



奥義といえば、実はCellsプロパティはアルファベットを渡しても動きますので、

Cells(R, "P")

と、開き直ってこれで書いてしまうという方法もあるでしょう。


Cells(R, ○)の入力を早める方法は、
思いつくだけでもたくさんの方法がありますね。



さてここまでは、アルファベット→数字の対応をいかにして早く求めるかを追及してきました。


Cells(R, ○)の○を入力するスピードは、

  • 個数 → P列 → 16

この変換スピードが命ですから当然の取り組みです。



ですが、上記の方法は残念ながらまだ遅いです。


最後の方は「P列 → 16」の変換にかかる時間を0にできていましたが、
それでもまだ遅いのです。



なぜか?


  • 個数 「→」 ⇐こいつ

この矢印が消せていないからです。



要するに、

Cells(R, 個数)

こう書けるならこれが最速なんですよ。


ワークシートを見に行く必要がなくなり、
コード画面だけを見ていればよくなりますからね。


しかもこの機能を実装するのはものすごく簡単で、

Enum CNoくだもの売上表
    品物 = 14
    価格     ' ←ここから先は15,16…とかってに連番になるよ!
    個数
    売上
End Enum

と、列番号の定数を列挙型Enumで設定するだけでOKです。


実際のCellsのコードは

Cells(R, CNoくだもの売上表.個数)

これを書くことになります。


これだけ見ると「えー16って打った方が早くない?」と思うかもしれません。

しかしやってみるとわかりますが、
ワークシートを見に行かなくてよくなる
というのは、タイピングは誤差といっていいくらい、絶大な効果です。


しかもこの「CNoくだもの売上表.個数」という入力は短縮でき、まずは、

Enum選択肢
と、表の名前を入力すれば選択肢から選べるようになります。



「表の名前の入力が面倒じゃない?」

と思うかもしれませんが、今回の「CNo」のように、
列番号のEnumを必ず特定の英文字から始まるようにしておけば、

CNo選択リスト

と、「CNo + Ctrl + Space」からどの表の列番号を使うかも選べるようになります。


Enum以外のすべてのレイアウト定数で「先頭につける英文字」を決めておけば、
キーボードの日本語入力すらONにならず、入力が超速になります↓

アプリケーションハンガリアン日本語変数の入力アニメ

処理するシートが複数あってもExcelの画面を見に行く必要がなくなるため、
Pと16を考えて歌うのを、鼻で笑えるスピードを手にできますよ。

定数の真価はコーディングスピードでも発揮される

定数(Constや列番号ならEnum)を使う最も重要な効果は、
書き換えが発生したときに対応が楽勝なことです。
 
例えば、

Cells(R, 16)

↑これが30ヶ所でてくるコードで

B列に新しい列を挿入するね ^ω^

とか言われたら白目になります。


しかし、列番号をEnumで定義していれば、

Enum CNoくだもの売上表
    品物 = 15 ' ← このスタート位置の設定を14から1増やすだけ
    価格
    個数     ' ← 自動で連番になるので17になっている。
    売上
End Enum

という変更だけで、すべての

Cells(R, CNoくだもの売上表.個数)

↑このコードは、Cells(R, 16)からCells(R, 17)に変わります。

これが本来の定数の役割ですね。


さらにExcelVBAの世界においては、この効果に加えて、
定数化がコーディングスピードにもかなり影響するということです。


理由は何度も書きましたが、
ワークシートとVBEのにらめっこの回数が減る」からです。



定数化のスキルを身に着けると、
メンテナンス性だけでなく、コーディングスピードがかなり速くなります。

まあもちろん慣れるまでは

Enum CNoくだもの売上表
    品物 = 15
    価格
    個数
    売上
End Enum

これを書くのに時間がかかるため、
すぐに超速を手に入れられるわけではないですけどね。


スタート位置である「15」を入力する必要があるため、
どうしても1回は A B C D ~♪ を歌う運命からは逃れられません。


しかし、それでも定数を使ったせいで遅くなることは稀です。

万が一「コードを書き上げるまでの時間」で負けたとしても、
「コードを書き換える時間」で圧勝できますからね。



ということで、Pを16にするスピードの鍛錬はこの辺にして、
列名である「個数」そのものを指してコードを書く訓練を始めましょう。


コーディングスピード・可読性・メンテ性が圧倒的に向上します。


対象を直接指定する感覚がオブジェクトを扱う力を磨いてくれるので、
割と真面目に、コーディングの世界が広がります。

カッコつけた言い方ですが、なんか扉を開いた感覚になりますよ。


是非トライしてみてください。


そもそも定数を使っていなかった方はこちら

www.limecode.jp


定数は知ってたけどEnumは知らなかった方はこちら

www.limecode.jp


あたりをどうぞ。



列番号のEnum化をマスターした後は、
テーブルや自作クラスを使ってさらに便利にもできます。


ですが、どこまで行っても目指す場所は、
「個数」を直接指してコードを書く
ことで変わりませんので、これを忘れないでくださいね!

おまけ:だから「対応」を考えるから遅くなるんだってあれほど

この記事を要約すると、

  • 個数 → P列 → 16

この右の「→」を頑張るんじゃなくて、左の「→」をなくしてしまおう!

というお話でした。


「対応」とか「変換」とか、余計な事考えてるから遅いんですよ~ってことです。



このサイトがどんなサイトか知っている方は、
もう何が言いたいかわかったかもしれません。

 

Enum CNoFruitsSalesRep
    Product = 14
    Price
    Quantity
    Sales
End Enum

↑絶対にやめてください。
もちろん外国人とチーム開発してるなら仕方ないですけど。

 

  • 個数 → Quantity

 
「→」減らせっつったのになんで新しい「→」増やすんや!(ノ#`Д´)ノ⌒┻━┻


ワークシートを見に行かなくて済むようにしたのに、
ブラウザでGoogle翻訳開いて何がしたいんや!(ノ#`Д´)ノ⌒┻━┻



私は日本語変数信者ですが、
変数に日本語/英語どっち使うかは個人の自由派です。


どっちも使えるようにして、場面によって使い分けることができるプログラマが最強だよね派です。


でもこの「場面によって使い分ける」という観点で、
「シート名」や「列見出し=データの種類名」を英訳するのは愚策の極みです。


ぶっちゃけ外国人とチーム開発をするときですら、
「シートと見比べる必要がある識別子なのでシートと同名にした方がいい」
と思っています。

その外国人さんだって、実行テストでシートを見るときには「個数」という文字を見ることになりますからね。


旅行ガイドに「ニューヨークに行け」って書いてあっても困るんですよ。
現地に行ってもそんな標識がないから。

「New Yorkに行け」って書いてあった方がうれしいですよね?
我々日本人にとっても。


プログラミング的にこの話を表現すると、

ユーザーインターフェース上にあるオブジェクトを指す識別子は、
英語/日本語どっちという話でなく、指し示すものと同名にしないといけません。

という話です。


まあこの辺の話は、

www.limecode.jp


この辺に書いてあるので、もし読みたいという酔狂な方がいらっしゃいましたら是非どうぞ。


それよりも私が言いたいのは、

余計な対応を考える時間を減らすことで、
ロジックに集中してコードを書くことができるようになり、
それがプログラミングを上達させてくれる。

ということです。


そして、プログラミング初学者にとって最も余計な対応は「翻訳」だと思っています。



別に英語変数を使いたいなら、扉を開いた後で英語の勉強をすればいいのです。

扉を開くまでは、母国語の方がはるかに簡単ですよ(´∀`)

www.limecode.jp