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を組むのが、クールでカッコいいですね。
ほんと、先日の大分県で起きた突然の山崩れというのは、
山岳地帯に住んでる人にとっては元よりですが、そんな山合いにある田舎の集落ではなくても(結構な都会の中でも・・)、家の裏に崖や丘や小山等々のあるところに住んでるという人にとってみたら非常な恐怖で、実に恐ろしいとしか言いようのない自然災害ですね。
それで、今回の山崩れの被害現場(大分県中津市耶馬渓町金吉付近)の標高地図というのを、当社の地図ソフト(これもエクセルのマクロです。)で作ってみました。
この図は、これで縦横5メートル毎の3次メッシュ(縦150メッシュ×横225メッシュ)の1区画分のデータを、エクセルに(その1メッシュを1セルに)表示したというものになりますので、これはこの全体で、縦(南北方向)に750m、横(東西方向)に1125mの地形を現しています。
「なお、この地図の作成公開に当たっては、国土地理院長の承認を得て、同院発行の基盤地図情報を使用しています。(承認番号 平29情使、 第1485号)」
ちなみに、この現場付近を国土地理院のWeb地図、並びにGoogleの衛星写真で見てみるとこのような場所になります。
(両地図共、崩落現場は右上方の川の曲がった所の左岸辺りになります。)
最初の図のExcelは、国のビックデータの有効活用ということで国土理院のホームページにて無料公開されている「5mメッシュ標高」という高精度な3次元地形データを元に、そのデータをExcelシート上に展開するマクロを用いて描いた(標高別にセルを色分けした・・)というものになっています。
以前(かれこれ十数年前)に、国土理院から有料で販売されていた同類の「50m」&「250m」メッシュ版のデータに対応したソフトを、最近、大幅な改修をして「5mメッシュ」用に作り変えたというものです。
この拡大機能で詳しい現場の標高差を数値で見てみると、
このように数値も見えるソフトとなっています。
で、このソフトの活用例としては、以下のような「我が家の防災マップ」的なものも、普段から使い慣れたExcel上でこうした地図に描けるかと思います。
実は、昨年オープンした長野で2つ目の当社サテライトオフィスも、川沿いの小高い崖の上に(市指定の危険区域内に・・)建ってありますので、いざという時の為にこのようなExcelの標高マップに避難経路等を書き込んだ防災マップを作ってみました。
なにぶんにも、国や自治体から(ネットで)提供されている防災地図(いわゆる「ハザードマップ」)というものがあるかと思いますが、何故だかそれらは皆「PDFのファイル」になっている思いますので、パソコン上では見辛く、書き込みもできませんですし、大きすぎて(範囲広すぎで)家庭用のA4プリンターでは印刷するのも困難かと思います。わたし、
「考えること=何か思いついた事を書き込むこと。」だと思いますから、、
「自分の家の防災を考える」ツールとして、特に普段からExcelを使い慣れてるという人には、是非このマクロ活用して欲しい(これに色々書き込みながら自分家周辺の防災についてを考えて欲しい・・・)そう願って、この地形図作成マクロというのを開発しました、といった経緯がこのソフトにはあります。
これは、エクセルのシートにこういったメモが「自分で自由に書き込める・・・」というのが最大の特長となっています。(なお、「IT技術で社会に貢献する」というのが当社創業時の理念にもなっていますので、後々準備が整いましたら、このマクロもまた無料配布していきたい思っております。)
最後に、今回の山崩れでお亡くなりになられた方のご冥福をお祈りするとともに、まだ見つかっていない女性には妊婦さんもいるということで、今からでも奇跡的に救出されることを、願ってやみません。
自然災害の多い日本列島に住んでいる限りにおいては、決して他人ごとでは済まない思いますから、「防災意識」ぜひ皆で高めていきたいものですね。