和風スパゲティのレシピ

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

変数を日本語にすればプログラミングが上達する

変数名・関数名などの識別子は、
英語を使う明確な理由がない限り、すべて日本語で命名しましょう。


日本語を変数名に使うことで、

翻訳に無駄な労力を割かなくてよくなり、
コードが読みやすく、流し読みできるようになり、
処理1行1行よりも、コード全体のロジックに集中できるようになり、

プログラミングの上達が早くなります。


プログラミングを始めたころの私は、変数名に日本語を使うことついて、
「本来は英語で書くべきだけど、日本語で書いても動く」
「すべて英語で書けるようになったら一人前」
と思っていました。


でもそれは間違いでした。


リーダブルコードなどの、良著といわれる書籍たちには、
どれも↓のようなことが書いてあります。

  • プログラムは書くことよりも考えることのほうが重要である。
  • 考える力を最大限に引き出すのは読みやすいコードである。
  • 読みやすいコードにとって重要なのは、わかりやすい変数名である。
  • わかりやすい変数名とは、解読が不要な変数名である。
  • 変数名を必要以上に省略してはいけない。長くてもいいからわかりやすく。

今ではもう、基本中の基本って内容ですかね。


さてここで考えてみてください。


英語の変数を和訳するのは「解読」ではないですか?

すべての変数を、タイプが早いからと半角にしてるのは、
必要以上に省略しているうちに入りませんか?


日本人しか読まない変数は、本当は全部日本語で書くべきではないですか?


もちろん「多国籍のチームで一緒に仕事をする」という絶対的な目的があります。
外人さんがチームにいるなら、コードは「英語で」書くしかないです。

が、その必要がない環境においては、「半角文字で」書く意味はありません。


半角変数が主流なのは、コードに2バイト文字が使えなかった時代の名残です。
もうレガシーですよ、レガシー。


例えば部下に
「この書類が何の資料かわかるように、ラベルを貼っておいてくれ」
と指示したとします。


ラベルを全部ローマ字で書いてきたらなんて言います?

怒るでしょ(笑)


日本人しか見ないコードの変数名を英語にするって、
これと一緒のことだと思うんですよ。


冗談はさておき。

「日本語を使ってもいい」という考え方ではなく、
必ず日本語を使うべき」という命名規則を採用してみてください。

大袈裟でなく世界が変わります。


コードを流し読みして、なんとなく処理の流れをつかむ」という上級者のスキルが、
母国語の力によって、訓練しなくてもできるようになります。


「あー上級者ってこんな風にコードが見えてたんだ~」って実感します。

「あー英語圏の人って、こんな風にコードが見えるんだ~、そりゃ日本人は勝てないわけだ」って正直思います。


今日から心を入れ替えて、変数は全部日本語で名付けるようにしましょう。


※ 日本語で書くとは、変数名、関数名など、「識別子の命名のみ」を指します。
 「If」を「もし」にするような、いわゆる日本語プログラミング言語は推奨していません。

※ カウンタの「i」など、慣用句レベルの変数まで日本語にする必要はないです。
 これは英語変数ではなく、一種の予約語みたいなものです。

日本語変数・関数のメリット

翻訳に無駄な労力を割かなくて済む

なんといってもまずはこれです。
英訳に悩んだり、辞書を引く時間がごっそりなくなります。

Sub 医薬品購入伝票を購入歴データに取り込む _
    (ws伝票シート As Worksheet, ws購入歴シート As Worksheet)

こんなのを英語にするのは時間の無駄です。

結果、Denpyouという日本人からも外国人からも愛されない、
悲しきモンスターが生まれるわけです。


日本語ならそのまま命名できるし、意味もまっすぐ伝わります。

「購入種別」と「購入区分」にその会社独自の意味があったり、
伝票イ・ロ・ハみたいなものだったり、
「事実上英訳が存在しない単語」に困ることもありません。

コードの流し読みがものすごく速くなる

これが日本語の(母国語の)一番素晴らしい力です。

適当に日本語の部分だけを読んでも処理の流れがつかめるので、
コードの流し読みがすさまじく速くなります。


例えば本を読んでいて、
「こいつが登場したシーンをもう一度読みたいなー」
ってありますよね?

そのとき、サーっとページをめくって、
目に映る単語だけで見たいページを探していると思います。


あの力を、コードを読むときに使えるようになります。


そうすると、コードの1行1行を注視する必要がなくなるので、
全体を見通しながらコーディングができるようになるし、
メインの処理と、長いだけでどうでもいい処理が、素早く判別できるようになります。
(書籍の言葉を借りれば、「無関係な下位問題」がすぐわかるようになる)


この力はコーディングの効率が良くなるだけでなく、プログラミングを学習する上でも強い味方になります。

例えば、
「全部の処理を1つのメソッドに書いてしまう初級者」が、
「関数ってどうやって分けたらいいの?」を学ぶとき、

If Is必須項目が正しく入力されているか確認する(ws伝票シート) = False Then
    Call 入力不備でスキップした伝票をログに記録する(ws伝票シート)
    Exit Sub
End If

これほど簡潔に「なんで関数を分けるの?」を実感できるコードを、母国語以外では作れないでしょう。

「条件式の関数化」や「例外処理の排出」という関数化の基本が、普通に日本語として読めます。


この力は、概念的・設計的な技術を理解する上で大きな助けになります。
母国語でサンプルコードを読めるなら、オブジェクト指向だって楽勝です。

短い文字数で多くの意味を込められる

漢字が表意文字(文字自体が意味を持つ)であり、
それをつなぐ助詞(の、に、を、が)や送り仮名が1~2文字なので、
日本語の変数は、短い文字数でたくさんの意味を込めることができます。

Dim 現在の処理フォルダ As String
Dim 抽出用の作業シート As Worksheet
Dim 前ループの最終行 As Long
Dim 処理したレコード数 As Long

どれも10文字未満ですが、わかりやすいですね。

いい具合に漢字とひらがなが混じるから、単語の区切りが見やすいですし、
表意文字の真骨頂である「未、済、前、現、次、元、先」のような1文字フラグも、変数名に向いていて、すごく便利です。

試しに↑の変数を英語にしてみようとすると、日本語がすごく名詞化に強い=変数向きな言語であることがわかります。


ただし、「処理レコード」とやってしまうと台無しです。
日本語変数では、助詞や送り仮名を省略してはいけません。

変数や関数を追いやすくなる

日本語 自分が書いたもの ⇒ 変数・自分で作った関数
英語 プログラミング言語のもの ⇒ 構文・標準の関数

とはっきり分かれるので、変数や関数が追いやすくなります。

日本語がアルファベットでない言語だからこそのメリットですね。

  • プログラムの構文をチェックしたいときは英語部分を読む。
  • 全体的な処理の流れを追いたいときは日本語部分を読む。

という「コードの読み分け」ができるようになるのも強みです。

コメントが減って質が上がる

翻訳しているだけのコメントが一掃されます。
よくある「関数の上に、引数の翻訳がズラズラ書いてある」やつもなくなります。
コードの意図とか、ロジックに関するコメントだけを書けるので、コメントの質が上がります。

作ったものを忘れにくくなる

どうやら日本語で書いたり読んだりしたもののほうが、記憶に残りやすいようです。

国語の教科書の話って、今でも覚えてますよね。
英語の教科書の話って、何か言えるものあります?

採用する場合は日本語に統一すること

冒頭でも書きましたが、日本語変数は「使ってもよい」ものではなく「使うべき」ものです。

使う以上は、なるべくすべての変数に日本語を入れましょう。
でないと、今まで挙げたメリットが中途半端になって、イマイチ効果がなくなってしまいます。


絶対やってはいけないのが、「自分が英訳できるものだけ英語」スタイルです。

「日本語「でも」いいけど、いつかはすべて英語にするのが理想」
という考えが生んだであろうこのスタイルは、

  1. 母国語が持つ、日常で研ぎ澄まされた読解力
  2. 英語が持つ、世界標準言語の普及率

このお互いが持つすばらしい長所を、どちらも喪失します。


「すべて日本語」「すべて英語」のどちらも理想ですので、
プロジェクトごとに、どちらかに統一していきましょう。


ただし、全部日本語にするといっても、
i、j や tmp など、構文と化しているものは、そのままにした方が良いです。

また、「Get入力最終行」「Delete対象外レコード」など、定型句や実行するメソッド名があるものは和訳せず、英語+日本語で命名したほうがいいです。

フラグなんかも、

If is集計対象 Then
If 集計対象かどうか Then

1の方がわかりやすいです。

この辺の「システムならではの固有名詞」は、
英語というより「プログラミング語」ですね。


日本語を使う理由は、「翻訳が無駄だから」でした。
当然「わざわざ日本語に翻訳するな」も守らなくてはいけません。
プログラミング語まで和訳しないようにしましょう。

もともと複数種類の文字を扱う日本語はfreedomなランゲージなので、英語とmixしたワードがあってもNo problemです。

日本語変数・関数のデメリット

ここまでは日本語サイコーって話を書いてきました。
ですがもちろんデメリットもあります。

使いこなすためにも、しっかりと弱点を知っておきましょう。

日本人にしかわからない

まずはあたりまえの話から。
開発チームに外人さんがいたら、日本語変数は使えません。

テストメソッドだけ日本語にするなど、「母国語の力が活きて、携わる人が限定できる箇所」にだけ使うといった工夫はできるみたいですね。

英語力が磨かれない

これが一番のデメリットです。

ここまで書いといてなんですが、
日本人以外との仕事が多い、いずれ多くなるようなグローバルな人は、
母国語に逃げてないで、英語をしっかり勉強したほうが良いです。

英語の文法的に自然で、かつ読みやすい変数名を付けることは、間違いなく重要なスキルです。


ただし、英語とプログラミングを同時に学ぶのは大変だし、非効率です。
複雑な処理を書いているときに、英語辞書を開くのは、どちらの学習にとっても悪影響でしょう。

  1. 分からない単語は日本語で命名して、質の高いコードを書くのに集中する。
  2. 日本語変数をすべて英語に置換して、質の高い英訳に集中する。

ような使い方はありだと思います。日本語は置換にすごく強いし。

英語と数学を勉強するとき、英語で書かれた数学の教科書を買うのは無茶です。
英語は英語の、数学は数学の教科書で勉強しましょう。

気持ち悪い

日本語だらけのコードは慣れないうちは気持ち悪いです。
私も最初は気持ち悪かったです。

しかし、「気持ち悪い日本語」と「美しい英語」があったとき、それでも前者のほうが理解は早いです。というか、現実は美しくない英語であふれているわけで…。

新しいものを使うと、それがどんなに便利でも、最初は気持ち悪かったりするじゃないですか。ケータイの機種変とか。
「気持ち悪くなくする」ことも、大事な学習だと思います。


がしかし、慣れると今度は英語変数を気持ち悪く感じてきます
こっちが真のデメリット。


「これ外人が触ること一生ねーだろ」「誰のための英語なんだよ」っていう、
半角変数にツッコミを入れるのに、脳のリソースを食い始めます。

他人のコードの解読や書き換え、ネットのサンプルコード探しなんかも多少効率が落ちるので、結構気になるデメリットです。

最初からみんなで日本語使っておけばこんなことにならなかったのに。

コーディングが遅い は嘘です

「キーボードの日本語入力をONOFFする分、コーディングスピードが落ちる」
という話がありますが、これは嘘です。

英語変数は、命名時に翻訳というタイムロスがあります。
よほどの英語力がないと、トータルでは日本語のほうがコーディングも早いです。

さらにはそのコードを読むとなると、英語力があっても母国語には勝てません。
コードは書く時間より読む時間の方が長いのです。

コーディングが面倒

こっちは本当です。

  • 変数ごとにキーボードの日本語入力ONOFFを切り替え
  • 1文字目が漢字だと、変換するまでインテリセンス(予測機能)が出ない
  • 「.」が打ちづらくて、クラスのメソッドが呼びづらい

こんな感じで、わずらわしさは間違いなくあります。
書いていてめんどくさいのは否定しません。


ちなみに、一番話題に上がる「キーボードの日本語入力ONOFF」は、
↓の対策があります。


①日本語入力OFFのまま日本語を入力する(アプリケーションハンガリアンを利用)

「英語の接頭詞+日本語」の変数名にすると、↓のような選択肢から入力でき、キーボードは半角のままで、日本語変数を扱えます。
日本語変数のハンガリアンによる入力補完

↓一度も日本語入力をONにしないで日本語変数を扱う図
アプリケーションハンガリアンでの入力例



②日本語入力ONのまま英語を入力する(ユーザー辞書による変換を利用)

  • fn ⇒ Function 
  • ws ⇒ Worksheets
  • pg ⇒ Property Get
  • おえr ⇒ On Error Resume Next

みたいに、ユーザー辞書に頻出コードを登録しておき、
「変換機能」を使ってコードを書きます。


日本語入力ONのまま、むしろOFF時より高速でコーディングできますね。

ちなみに↑の通り、実は変換の読みには(子音なら)英文字も使えます。

VBAにおけるデメリット

ExcelVBAにおいては、これまでに挙げたデメリットが、かなり緩和されます。

「チームどころかほぼ自分しか触らないマクロ」だったり、
「ワークシートが日本語だらけで、VBAだけ英訳したところで外人さんには理解不能」だったりと、
英語変数のメリットがほとんど活きないVBAは、日本語変数と相性のいいプログラミング言語です。

あなたがプロのプログラマでなく、日本の企業の、エクセルの雑務で楽をしたいだけのVBAエンジニアであるならば、英語の変数は使う必要がありません。

おまけ:VBAを日本語で書くことの意義

今まで書いてきた日本語変数の話は、すべてのプログラミング言語に当てはまる話だと思っていますが、最後に「ExcelVBAならではの日本語変数の良さ」を書いてこの記事を締めます。


私は医療系企業の、非IT部署の人間です。
本職はプログラマでは、ありません。

医療用語を英語にすることの愚かさに気づくまでは、血圧をBloodPressという変数に格納していました。

その血圧に関するコードを書きます。

If 収縮期血圧 >= 140 Or 拡張期血圧 >= 90 Then
    isいずれかの精密検査に該当 = True
    Call 精密検査の案内用紙を出力する("高血圧")
End If

 
なんてことないコードですが、これは素晴らしいコードでした。

マクロ記録まではやったことがあるレベルの現場スタッフが、
「これをみてVBAを勉強した」と言ってくれたからです。


プログラミングはできなかったこのスタッフは、もちろん高血圧の条件はわかります。
その人にとって、これ以上のIf文の教科書ってないですよね?

  1. エクセルの関数を使う
  2. マクロ記録を使う
  3. マクロ記録の中身をいじる

というすばらしい手すり付き階段があるVBAにとって、これはすごいメリットじゃないでしょうか。

あとは変数と、条件分岐と、ループ処理が使えれば立派にプログラマなわけで、
その変数が日常業務と同じ単語で表現されているというのは、この手すり付き階段の、最後の1段にふさわしいと思います。


そしてもう一つ、私はプログラムは書けますが、検査は熟知していません。

高血圧の条件は覚えていないので、何か見ないといけないのですが、調べるときはこの関数を見ます。下手な資料を探すよりよっぽど早くてわかりやすい。


VBAを読みなれている皆さんにとってもそうじゃないでしょうか?

仰々しい厚生労働省のガイドラインを読み解くよりも、見慣れたIf文を読んだほうが、高血圧が何なのかわかると思います。

システム側の人間が現場を理解するうえでも、現場の言葉で書かれたコードは強い味方になります。


母国語で書かれたエクセルマクロは、現場とエンジニアを繋いでくれると思います。
このブログがその一助になれば、幸いです。