今回は日本語変数に関するお話です。
単刀直入に、というかもうタイトルに書いてありますが、
シート名が日本語だった場合に、その変数名をわざわざ英訳してはいけません。
「企業一覧」という名前のシートがあった時に、
「CompanyList」という変数名・オブジェクト名にする行為です。
これはやっちゃいかん!!
という想いを、ズラズラ綴っていきますね。
ちなみに、先に断っておきますが、ダメなのは英「訳」です。
データを帳票に出力するマクロにおいて、
「wsData」と「wsOutput」という変数を使ったり、
データの流れが明確である場合に、
「ToSheet」と「FromSheet」という変数を使ったりするのは、
もちろんいいことです。
これはシート名を翻訳しているのではなく、
「処理上の役割で命名」している訳ですからね。
シートの固有名詞を使わず、処理上の動きが分かるように名付け直すことで、
シート間の関係で脳のリソースを食わないように配慮できている、
とてもいい命名だと思います。
もちろん日本語変数をテーマにしている当サイトでは、
日本人しか見ないのであれば、これらも
「wsデータシート」「ws出力シート」
「Toシート」「Fromシート」
と命名することを推奨しますけどね。
- どれが自分が作ったもので、どれがVBA備え付けのものかが、一目瞭然
- 「シート」という単語が、shなどに比べて見やすい → 変数を追いやすい
- 頭文字をwsに統一すれば、ws+Ctrl+Spaceで入力でき、日本語入力不要
あたりがメリットですが、特にWorksheetオブジェクトでは1.が便利です。
WorksheetやRangeのような、多数のプロパティ・メソッドが使えるオブジェクトは、どれが変数で、どれがプロパティか瞬時に分かるようになるまで時間がかかります。
新しいプロパティを勉強するときに、
「まずどれが機能でどれが変数かわからん!!」
と思った経験のある方は、是非日本語変数・関数の採用をご検討ください。
母国語がアルファベットでない民族だけが享受できる特権ですよ?
と、いつもの布教活動を終えたところで本題に入りますね。
同じものは同じものと分かるように命名する
さて本題は、
「企業一覧」という名前のシートがあった時に、
「CompanyList」という変数にする行為はダメ。ゼッタイ。
という話でした。
これは私が日本語信者だからという話ではありません。(たぶん)
言いたいことは、「日本語にすべき」ではなく「一致させるべき」です。
日本語変数を採用しない方であっても、これだけは「ws企業一覧」という変数・オブジェクト名にすべきなのではないかと思う部分です。
その理由は簡単で、
「ExcelVBAでは、ワークシート名もソースコードの一部」
だと思うからです。
ワークシートはExcelVBAにとっての主役です。
データの取込出力はもちろんのこと、加工中の中間データから、ユーザーに入力してもらう入力欄まで、他のプログラミング言語では配列やフォームなどが登場する場面でも、VBAではワークシートが使用されます。
フォームモジュールや配列をマスターし、ワークシートは仕上げに登場するだけ的なエリートプログラマさん達はどうでもいいので置いておきます。
業務を効率化したいだけの、大多数の一般事務VBAユーザーにとっては、
ワークシートとソースコードは一蓮托生、二人三脚で動く存在なんですよ。
例えば「デバッグで、マクロを1行ずつ実行するとき」を思い浮かべてください。
ソースコードとずっとにらめっこなんて、実はしてなくないですか?
おそらく「ソースコードとワークシートを交互に見ながら実行」するくらい、
多くの人のマクロにとって、ワークシートはプログラムの一部なはずです。
要するにですね。
マクロが複雑=ブックの構造が複雑であるほど、
こいつもソースコードなんですよ。
わざわざこれと変数名を不一致させる意味はありませんのでやめましょう。
というお話です。
例えば「帳票の出力マクロ」で出てくる変数・関数名が、
- OutputとPrintが混在
- PaperとReportが混在
みたいに、同じものの表記が揺れるとマズいですよね?
「同じ処理、同じオブジェクトは、同じ単語に統一して命名しなければいけない」
のは、識別子を何語で書いていても重要な命名規則だと思います。
ということで、「同じシートを指す単語」は、プロジェクト全体で同じものが割り当てられる必要があるのですが、
しかし、ワークシート名だけは、ユーザーが絡む分、どうしたって半角英字にできないことがあります。
シート名にフリガナみたいに英訳をかけたり、
ヘッダーにオブジェクト名を表示できるなら別に英語でもいいのかもしれませんが、
残念ながらそんな機能はありません。
変数は半角がいいという方も、シート名側を半角英字に出来ないのであれば、
仕方ないですから変数名側は妥協してください。
もちろん私も、シートが英字なのをわざわざ和訳はしませんよ?
よくある「Data」という名前のシートは、「wsData」というオブジェクト名にします。「wsデータ」なんて命名にはしません。
変数名を日本語にしろ!というと、反論の余地がたくさんあると思いますが、
同じオブジェクトの命名は統一しろ!と言われると、「ぐぬぬ」ってなるでしょ?
本音は「だから最初から全部日本語使っておけばいいんだよ」なんですけどね。
それが嫌でも、せめてシート上の単語はそのまま使ってほしい。
それこそシート本体だけは、どうしても同じ単語にしてほしい。
という願いです。
外人さんにとってもうれしくないのでは?
例えば「東京駅」の構内に、1つたりとも「Tokyo」という記載がなかったとします。
そんな世界で、電車内でだけ「The next station is Tokyo」って表示されたらどうでしょう?
逆に不親切ですよね。
例えば来社された外人さんに、「総務課をお訪ねください」とお伝えする際、
どこにも書いてない「General Affairs Divisionへどうぞ」という案内では、
外人さん泣いちゃいます。
「総務」という漢字を見せて、「これと同じ表札の部屋に行ってくれ」って言った方が、ギリギリ親切です。(ギリギリ泣く気もしますけど)
結局のところ、単語さえ英語にすればいいというものではないんですよ。
指し示すものがあって初めて、言葉に意味が宿るんじゃないかなと思います。
入力が面倒は理由にならん!
Worksheetに関しては、日本語は入力が面倒というのがあまりデメリットになりません。
全部wsから始めるルールにしておけば、
ここから選んで入力するため、日本語を入力する必要はないからです。
キーボードも半角のままでOK。
しかもこの選択肢は、さっきの
こいつと候補が一致するため、ものすごく選びやすいです。
素早く正確に選択できる分、取り違え時の修正まで含めれば、トータルでは半角英数より早く入力できると思いますよ。
ちなみに、この「WS + シート名」というオブジェクト名にする作業は、
機械的な作業であるため、マクロにやらせることもできます。
興味がありましたら、こちらの記事をどうぞ
おまけ:何故第1位なのか
なんでこんなことを言うのかというとですね。
人のマクロを引き継ぐ際、どの変数がどのシートに対応してるか考えるところから始めるのは結構地獄なんですよ。
みなさんそんな経験ないですか?(笑)
特に「中間シートを複数介して、最終結果を出しているようなマクロ」では、
シートの名前が元々似ていることもあって、悲劇的なメンテになります。
「元データ ⇒ 中間データ ⇒ 作業シート ⇒ 集計表」
みたいなやつ。これ英訳できます?
真ん中2つの中間処理を配列でやる他のプログラミング言語と違い、
VBAでは全部Worksheetなのは別に珍しくないでしょう。
私は「配列のお勉強は、Excelのいろんな機能を勉強した後でいいよ」派なので、
一般事務VBAerが全部シートでやること自体は、むしろ推奨したいと思っています。
でも、だからこそ、名前だけはちゃんと統一してください。
英語のお勉強は、配列を勉強した後でいいよ。
一番ひどいやつでは、作業をWorkと訳していたので、殺意を覚えました。
作業シート ⇒ Worksheet はいかんでしょ…。
日本語変数を使えとまではいいません。(嘘ですいいます)
同じオブジェクトの命名は、関連変数含めて、同じ単語を使ってください。
お願いします。何でもしますから。゚(゚´ω`゚)゚。
おまけ:関連変数とは
そのシート内のセルアドレスを扱う、変数や定数が主に該当します。
この表を定数化するときの、
Const FirstRowくだもの売上データ = 4 Enum CNoくだもの売上データ 品物 = 2 価格 個数 売上 End Enum
これらの命名がそうです。
特に列番号のEnumは、英訳されていると苦労します。
「eくだもの売上データ列」でも「Columnくだもの売上データ」でもなんでもいいのですが、
「eFruitsData」とか「ColFruitsData」にするのは、取り違えの元なのでやめましょう。
さてもうわかったと思います。
英訳してはいけない変数名第2位は「列見出し名」です。
↑のEnumの各要素のことですね。
要するに、
これもソースコードの一部なんですよ。
実際そうでしょ?
売上をSalesにしたり、価格をValueにしたり。
頼むからやめてくれ。
その翻訳は誰のためにやっとるんや(ノ#`Д´)ノ⌒┻━┻
せめてPriceにしてくれ。何故Valueのようなプロパティと被る用語を使うのだ。
日本語が「絶対に予約語とかぶらない」ことに、もっと誇りを持ってくれ…。
論理名と物理名を設定できるデータベースじゃないんだからさ。
あきらめて列名には日本語変数使ってくださいよ。
お願いします。何でもしますから。゚(゚´ω`゚)゚。