2016/10/30発行(増刊号)より
本日表題のテーマですが、いつもやっているループの
「 For i の i は、a でも c でも cnt でもいいじゃないか?」
との疑問です。
これまた、前回の「変数はなぜ変値とは呼ばないのか?」に続いて、
実に斬新かつ素朴な疑問ですね。(笑)
で、これも結論から言ってしまうと、
前回の「変数のなぜ?」と同様に、VBAの歴史的な問題です。
今回の話を知ると、
「VBAのループで i を使う人は、通(ツウ)だ!」
ということがよく分かる思いますので、
VBAのツウになりたい人はぜひこの先読んでみてください。
そもそも、VBAを含めてプログラミング言語というものは、
色々な進化を遂げて現在に至っています。
私も好きでよく観ている芸能人のルーツ(先祖の歴史)を辿る
「ファミリーヒストリー」というNHKの番組がありますが、
(観てますか?)
人は、自分のルーツを知ると思わず皆(芸能人でも)号泣せずには
いられないぐらいに感動するものですね。
祖先の誰か一人でもいなかったら、いまの自分はこの世に存在しません
から、命は脈脈と受け継がれ自分が存在していることの奇跡を実感し、
命の大切さを知るからだと思います。
話し、大きくそれました。すみません。
それで、今この講座で皆さんと一緒に毎回勉強している
エクセルのマクロ作りに用いるVBAというプログラミング言語
ですが、
これも文字通り、そのルーツはこのVBAの3文字の中心のB、
すなわち、ベーシック(BASIC)言語です。
ベーシック言語とは、私の年代以上(50代以上)の人であれば、
ほんと誰でも記憶にあるというほどポピュラーな言語だった・・・
というもので、
誰でも習得しやすいように教育用のプログラミング言語として
開発されたというものです。
ちなみに、この「ベーシック」という単語を辞書で調べてみると、
「基本的なこと」「初歩的なこと」と説明されていますが、
用途の例でも「ーな知識」「ーな着こなし」などとなっています。
その名の通り、昔は皆が手軽に組んでいたベーシック言語という
ものは本当、誰でも組める親しみやすい大衆的な言語でありました。
(当時を知らない若い方でそんなの嘘だ!誰でも組めるわけがない!
そう疑う人は、是非お父さんに聞いてみてくださいね。(笑))
それで、VBA(やVB)というのは、その「ベーシック」という
言語を元に開発された言語になりますので、
言わば、VBAのお父さんはこの「ベーシック」です。
なので、本来VBAは誰でも組めるベーシックな言語である
はずのものなので、その原点に立ち帰って私はVBA言語は
ベーシック言語のレベルで勉強すべし!そう言い続けています。
前置き長くなりましたが、ここからが今日の本題です。
では、VBAのお父さんである「ベーシック」の
そのまたお父さんは誰?(要するにVBAのルーツを探れ!)
それは誰かと言うと、(諸説はありますが、定説では・・)
フォートラン(FORTRAN)と呼ばれる言語だと言われています。
この「フォートラン」という言語は、私の年代の理系出身者であれば
ほぼ誰でも必ず大学で最初に教わるプログラム言語だったですので、
私もコンピュータとの最初の出会いは、この言語だったです。
この言語は、主には科学技術計算(複雑な数値計算)に適したもので、
たとえば、宇宙開発で有名なNASAのような高度な数値解析を行う
研究所等で組むプログラムは必ずと言っていいほど、このフォートラン
言語というもので書かれています。
元々は私もフォートランのエンジニアでした。(遠い昔ですが。(笑))
一方で、現在でもコンピュータに多少なりと詳しい人であれば誰でも
知っている「コボル」という言語がありますが、
技術系は「フォートラン」で、事務系は「コボル」で、
その昔は(パソコンが全盛になる前の大型コンピュータの時代は・・)
という棲み分けが定番で、その他大勢の人が小さいコンピュータで
手軽に組むという言語が「ベーシック」、そんな分類でありました。
技術系は「フォートラン」、
事務系は「コボル」、
小さいコンピュータでは「ベーシック」
これが昔の定番。
またまた少々脱線しましたので話を戻しますが、
それで、今日のテーマ「ループで i を使うわけ」なんですが、
ルーツから言うとVBAの祖父に当たるそのフォートラン言語での
仕様(プログラムの書き方の決まり事)の中に、
「頭文字が i ~ n で始まる変数名は整数型である。」
という決まりがあったからになります。
ちなみに、フォートランを含め昔の言語のデータ型というのは
整数か実数か(小数点がないのとあるの、の数字のみ)その2種類
しかなかったですので、頭 i ~ n 以外の変数は全部(特に定義
しない限り・・)実数型の変数になるのがルールになります。
なので、a でも c でも cnt でも、デフォルトでこれらはみな実数
となります。ループの回数は小数点のある実数(0.01回など)では
成り立ちませんので、必ず整数(1回2回3回など)である必要が
ありますので、こうした a や c や cnt や、は使われなかった、
ということになります。
VBAでループを回す際の For文 というのは、そのまま
祖父のフォートランから父のベーシックへ、父のベーシックから
VBやVBAへと受け継がれて来たものになりますので、
先祖代々からの仕様に乗っ取って、For には i ~ n を使う、
というのが言わば伝統となっているわけです。
他方、現在プロのプログラマーの世界で多分一番ポピュラーに
使われているC言語という言語があるんですが、
(このC言語というのは、車や家電に入っているプログラムの
大部分で使われている機械関係を制御するのに適した言語です。)
最初に出てきた cnt というのは、この「C言語」の流派(?!)
に属します。C言語では伝統的にこの変数名を使う人が多いです。
要するに、「VBAのループで i を使う人」それは、
そのルーツである「フォートラン」や「ベーシック」の流儀や、
その伝統をちゃんと知っていて、それ守って書いてる人だ・・・。
という事になるわけです。
これ、まさにクールです。クールジャパンですね。(?笑)
大叔父からの伝統をちゃんと受け継いで守っている人です。
だから、それゆえに
「VBAのループで i を使う人は通(ツウ)だ!」
そう言えるわけです。
これは言わば、日本の伝統文化を守る「京都人」のような人だ
と言えるでしょう。
それが、本日テーマ「ループはなぜ i で回すのか?」
その結論になります。
特に日本人は結構(京都人でなくても)伝統を守る、
守っていきたい、そう考える人が多い国と思いますから、
VBAの場合であっても、先祖から受け継いだ For は i で回す、
それが伝統であり、王道であり、クール(カッコいい)である、
というわけであります。
それに比べて、そんな歴史文化を知らずに、
VBAのForで a や c や cnt で回す人いうのは、私に言わせると
それはまさに「邪道」です。(笑)
だから、VBAのFor文のループ処理では i を使ういうのが
「カッコよくて、クールで、センスがいい!」
ちゃんと歴史や伝統を知る人にはそう見えますので、
当メルマガ紙面上では必ず、その伝統を守って教えている次第です。
あと、いつも気になっているのが、手軽に誰にでも組める目的で
開発されたはずのベーシック系の言語(VBAも含めて)で、
いちいちわざわざ、全部の変数を定義して無意味な Dim Dim Dim Dim
書いてやってるプログラムを目にすると、実に「邪道」ですね。
「かっこ悪い、歴史知らない、全然通じゃない、」
(あくまで個人の感想です。笑)
少なくても、ベーシックで数十行程度の事務計算をするプログラムを
組む際にするべき事では到底ないですので、変数定義は日付を意味する
DATE型 だけで十分だと私はそう教えている次第です。
(変数名のスペルチャックにDim使えだなんて、本当みっともない
かっこ悪すぎ。)
Dim については話しだすと、これもまた大変長い歴史の話となります
ので、いづれまた機会ありましたらお話したい思います。
(Dim が辿って来た大変面白い歴史の秘話になります。。)
あと、と言うわけで(VBAの祖父の代からの歴史的な伝統で・・)、
2重のループの場合は i と j で、3重なら i と j と k で、
そのようなループの回し方をするというが、伝統を知る通(ツウ)の
間ではその書き方が多いわけです。
なお、変数頭文字の i ~ n のうちの l(エル)ですが、
先々代のフォートランが全盛だった時代のコンピュータは、
ハードは大型計算機&ソフト(プログラム)はキーパンチするもの
(画面に打つものではなく、紙に穴を開けるもの)だった頃には
問題なく使われてはおりましたが、
今のパソコンの画面だと見た目、l(エル)は数字のイチと見分けが
付き難いものとなりましたので、現代では殆ど使われなくなりましたね。
ついでに、i ~ n のうちの m と n は、
特にエクセルのVBAの場合には、行数や列数に使う(データの数を
入れておく変数の場合に m と n を使う)というのも、これもまぁ
通(ツウ)の王道の一つですね。(未だExcelが無いベーシック時代
からの伝統です。)
もう一つついでに、先ほどのC言語系統でよく使われる cnt という
のはカウント(count)の略ですが、同じくよく使われる ret や rtn
といったものも(これはリターンの略号)、同じC言語系統のコン
ピュータ言語でよく用いられる変数名になりますが、
これ混同して、VBAで(ベーシック系言語で)下記のように使う
いうのは(気持ちは分かるんですが)ちょっとダサイように見えます。
(これもあくまで個人の感想です。笑)
++++++++++─
cnt = 0
For i 1 to 10
cnt = cnt + 1
・
・
Next i
++++++++++─
(これは、C言語ではこの場合
cnt = cnt + 1 → cnt++; と書きますから、
C言語系の言語では cnt を用いる i++; など1文字変数ではちょっと
見ずらい・・というわけです。)
たとえばですが、これってお茶の世界でも
表千家や裏千家や○○千家など、茶道にも色々な流派というのがあって
個々にお茶を楽しむための伝統作法の違いというのがあるかと思いますが、
私なんかの茶道の素人には、全くその違いというのは分かりません。
けど、ちょっと茶道に詳しい見る人から見たら、
茶室で正座して和服着て、にもかかわらず流派ごちゃ混ぜの作法で
お茶嗜んでる人見たら、すぐ素人だとわかってしまう思いますので、、
何事にも、伝統や流派を知らずに知った振りしてやるいうのは、
実にかっこ悪いことになる思います。
ベーシックは、「とにかく簡単に作れる」というのが根本的な流儀
になりますから、その子供「VBA」の場合でも、口を開くとすぐ
「○○オブジェクトの△△メソッドは・・・」とか言い出す人よりも、
「マクロの記録」に毛の生えた程度の修正でさらっと作れる・・・
というほうが、ベーシック流派の世界では「断然カッコよい人」
に映るはずです。
というわけでまとめますと、見る人から見れば
「この人、ベーシックの何たるかを良くわかってるなー」
そう一目でわかるVBAを組むのが、クールでカッコいいですね。
「基本的なこと」「初歩的なこと」という意味でつけられているものではありません。
「Beginner's All-purpose Symbolic Instruction Code」(初心者向け汎用記号命令コード)の頭文字で、それがbasicになるのは当然シャレとして狙ってはいるものの、全く本来の意味ではありません。
また、C言語でインクリメンタル変数にcntを使うのが一般的であるなど、どう考えても偏見です。
むしろ、iを使うほうが当たり前です。
C言語の考案者のQ&Aだって普通にi使ってます。
フォートランの仕様だって、i~nはインクリメンタル変数に使用されることを事前に想定していたから、 incremental variable だからiからはじまるわけです。
確かに、時系列としてはフォートランで使われていたのがそのまま受け継がれている形ですが、それは意味なくそうしているのではなく、頭文字からとった意味のある慣習だからです。
これを説明するならなぜフォートランで常に整数型である変数がiから確保されていたのかの理由としてこれを説明しなければ、片手落ちもいいところです。
けど、それは総じて間違っていますね。人間には、必ず本音と建前とがあるわけです。
basicがたまたまのシャレだなんて、確率論から言ってそのような事は在り得ません!
BASICとはまず間違いなくBASICありきで付けられた名称であって、
「Beginner's All-purpose Symbolic Instruction Code」の方が後付けの建前でしかない思いますよ。
確率論わかるようでしたら計算してみるとよくわかる思いますが、
例えば、子供の名前の場合でも殆どの親がその意味聞かれた時ように後付けで体裁良く考えた理由を周囲にも、物心付いた本人にも、必ず言うわけですね。違います?
第一、BASICなんてそんなシンプルな言語を考えた人間が、
「Beginner's All-purpose Symbolic Instruction Code」だなんて、そのような長ったらしい複雑な名前を考えた言う方が余りにもそれは不自然過ぎますね。
だから、BASICとは最初からBASICありきで、後から、それに合うような単語を並べたというだけ言うのが真相でしょうね。
また、C言語の考案者にしても、です。
慣習いうのは考案者が決めるものではありません。使ってる人達の中から自然と生まれ出てくる(スポーツのルールと一緒で時代と共に変わっていく)ものですね。
と言うことで、このご意見くださったJohn Doeさん、文面からお年を召された方と思いますから、くれぐれも人の言う事を真に受けて(本心だと信じ込んでしまって、)振り込め詐欺など合わぬよう、くれぐれもお気を付けくださいね。
自分は絶対騙されない言ってる頑固者がより騙されやすい言いますから。。。