1200万人のプログラミング（VBA編）

## ＜第1回＞プロローグ

その昔、「百万人の英語」というラジオ講座がありましたが、それに肖ったタイトルにしてみました。読んで字のごとく、**日本人の10人に1人はプログラミングができる**、そんな社会を目指そうというエントリーです。

**AI** を抜きに語ることが難しくなりつつある今の世の中で、プログラミングの知識が今後いかに重要かということは今さらここで語るまでもありません。

国際競争力の強い日本の復活を目指し、早速本題に入りましょう。


### ■プログラミングとは何か

まず、プログラミングのスキルをつけるために必須の知識があります。
以下の4つです。

**① 関数／引数／戻り値**
**② 変数／型／配列**
**③ オブジェクト／メソッド／プロパティ**
**④ 順次／分岐／繰り返し**

この4つを理解することができれば、そこそこ有用なプログラムを作ることができますし、プログラミングの初級は卒業と言っていいでしょう。

ところが、これらを厳密に理解しようとすると何百時間もの学習が必要になります。そのような学習は「苦行」以外の何ものでもなく、プログラミングの楽しさを感じることも難しいでしょう。（まぁ、世の中には「苦行が楽しい」という人もいますが…(^_^;)）

そこで、このエントリーでは言葉の厳密な定義にはとらわれずに、プログラミングというものの骨格がイメージできることをはじめの一歩とします。

上記4つの中でも最も重要なのは、①の

- **関数**

です。

プログラミングとは何か、ということをあえてひと言で言うと

　**『関数』を書くこと**
	
です。 

なので、プログラミングは関数を理解するところから始めなければなりません。

そして、関数の次に重要なのが、②の

- **配列**
    
です。

③と④は、関数と配列をどのように使うか、という「方法」にすぎません。

ということで、このエントリーでも、関数のイメージをつかむことから始めたいと思います。

とはいえ、関数という言葉を聞くだけでアレルギー反応を示す人も多いでしょう。おそらく、関数を難しいものにしてしまったのは中学校の数学の授業（および教科書）です。そもそも、関数のコンセプト自体は決して難しいものではありません。

中学時代の嫌な思い出はきれいさっぱり忘れて、ここではあまり厳密性にこだわらずに関数の考え方をおさらいしてみましょう。


###■関数とは
関数は、元々「函数」と書いていました。数学の古い教科書にはこの字が使われているものが多いです。函数の「函」は「函館（はこだて）」の「函」ですね。つまり「はこ」です。

そう、関数のイメージは**箱**です。「**ブロック**」と言ってもいいかもしれません。

どういうブロックかというと、

　**「何かを渡せば何かを返すブロック」**

です。

たとえば、あなたが今小銭入れを持っているとします。その小銭入れには日本の硬貨を一つだけ入れることができるとしましょう。
小銭入れをお母さんに渡すと、お母さんは、小銭入れの中のお金を10倍にしたお金をお小遣い袋に入れてあなたに返してくれます。
この「渡されたお金を10倍にして返す」という「ひとかたまりの処理（のブロック）」を

　**『関数』（Function）**
    
といいます。

![function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146265/fe977143-c661-6f8b-5120-398ed167de61.png)

とくに、プログラミングにおいては、関数に渡すものを

　**『引数（ひきすう）』（argument）**

といい、返ってくるものを

　**『戻り値（もどりち）』（return value）**

といいます。

上の例で言えば、「小銭入れ」が引数で、「お小遣い袋」が戻り値です。

ただ、実際のプログラミングでは、引数を取らない関数や、戻り値を返さない関数などもあるので、それらを使い分けたり、組み合わせたりしながらプログラミングすることになります。


### ■変数（variable）とデータ型

上記の例では、仮に小銭入れに`10円`を入れて`お母さん`に渡した場合、`100円`が入っているお小遣い袋が返ってきます。
あなたが受け取った**`100円`は`お母さん`に`10円`渡した結果返ってきた**お金なわけです。

これを式にすると、

    100円 = お母さん(10円)
	
と書きます。

さらに一般化して、返ってくるお金を`y`、お母さんの処理を`f`、お母さんに渡すお金を`x`とおくと、

	y = f(x)

という、数学の授業で習ったおなじみの式になるわけです。

また、ここでの`f(x)`は`x`を`10倍`することなので、

	f(x) = x × 10
	
となります。 数学の授業では、この`x`は「**変数**」だと習いました。

変数とは、その名のとおり「変化する値」のことなのですが、「**定数**」（**constant**）との対比で考えると理解しやすいと思います。

上の例で言うと、`x × 10`の`10`が定数です。

お母さんは、渡されたお金を5倍にしたり20倍にしたりしません。常に10倍です。
このように固定された値が「定数」です。

これに対し、小銭入れの中身は、5円のときもあれば、100円のときもあります。
日本の硬貨の範囲であれば、どのような値でもとることができます。
なので、具体的な値がはっきりするまでは、とりあえず`x`としておくわけです。

これが我々が習った数学における変数の考え方で、プログラミングにおいてもだいたいそういう理解で問題ないのですが、プログラム上での変数とは、より具体的にはコンピュータの「**メモリ上に確保される領域**（箱）」のことなのです。

![memory01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146265/6cc8b8b0-f917-6cf2-60ab-87e0821c159f.png)

よく、「変数とは値を入れておく箱（入れ物）のようなもの」という説明をしている書籍やWebサイトがありますが、プログラミングにおいてはそのように理解したほうが良いでしょう。 `x`は「小銭入れ」という入れ物である、という理解でいいと思います。

また、プログラム上で変数が与えられたとき、単に`x`と書いただけでは、それがどういった種類の変数で、どれくらいの領域をメモリ上に確保すればいいのか、コンピュータにはわかりません。

なので、「この変数にはこういう種類の値が入るから、それが入る領域を確保しておいてね」とコンピュータに伝えてあげる必要があります。

上の例でも、小銭入れに入れることができるのは日本の硬貨1枚だけという前提なので、500円玉が入る大きさであれば十分なわけです。
このように、変数が取りうる値の種類（ないしは範囲）のことを、その変数の『**データ型**』といいます。

関数`f`に`x`を渡したときの戻り値`f(x)`も`x`の値によって変化しますから変数として扱います。
なので`f(x)`にもデータ型があります。 それどころか、定数の`10`にもデータ型があるのです。

このように、プログラム上で扱うデータにはすべてデータ型があり、コンピュータはそのデータ型（もしくは値）に必要なメモリ領域を次々と確保していくわけです。


###■そもそもの話

そもそも、プログラミングにはなぜ「関数」や「変数」、あるいは「データ型」などといったものがあるのでしょうか？

それは、ある処理を実行するのに、より速く、より簡潔に、より分かりやすく、効率的に記述したいからです。

たとえば、上記の小銭入れに型がない場合、どのようなお金でも入れることができてしまいますから、お母さんはその10倍のお金を返すために、ありとあらゆる国のお金をたくさん用意しておかなければなりません。
そこで、小銭入れの中身を日本の硬貨1枚と限定しておけば、お母さんは最大五千円分の日本のお金を用意しておくだけでいいわけです。

また、もし関数がなければ、同じ処理を行うのに再度一からプログラムを書かなければなりませんが、その処理を関数にしておけば、関数を呼び出す1行を書くだけでいいのです。

このように、プログラミング言語はその効率性を目指して発展してきた経緯があります。プログラミング言語が持つすべての機能は効率性のためにあるといっても過言ではありません。

そのようなプログラミング言語の歴史の中で、プログラミングの学習用に開発された言語があります。
それが「**BASIC**」です。

ビル・ゲイツは BASIC が大好きです。マーク・ザッカーバーグも BASIC でプログラミングを始めました。
その BASIC を、ビル・ゲイツ率いる Microsoft が「**Visual Basic**」（以下、**VB**）として発展させました。

プログラミング言語には、すべてのソースコードを機械語に翻訳してから実行する「**コンパイル型**」の言語と、1行1行機械語に翻訳しながら実行する「**インタプリタ型**」の言語があります。

コンパイル型は、ソースコードをいったん **exe** ファイルにコンパイル（ビルドと言う場合もあります）してから実行する言語、インタプリタ型は書いたコードを即座に実行できる言語、という理解でいいと思います。（このあたりの言葉の使い方にこだわるのは時間の無駄です。厳密な定義は本職のエンジニアに任せましょう）

処理速度的にはコンパイル型が有利ですが、プログラムの動作をその場で確認しながら書き進めることのできるインタプリタ型のほうがコードの修正もしやすく、初学者向きと言えます。

VB 自体はコンパイル型のプログラミング言語ですが、VB から派生したスクリプト言語である **VBA**（Visual Basic for Applications）と **VBScript**（Microsoft Visual Basic Scripting Edition）はインタプリタ型です。

さらに、VBA の大きな利点の一つに、

　**面倒くさい環境構築が不要**

ということがあります。

C言語や Java でプログラミングの学習を始めようとして、プログラミング環境のインストール作業の時点で挫折してしまう人がいます。
また、会社の PC にプログラミング環境をインストールするには手間のかかる申請手続きが必要だったりします。

VBA は、PC に **Microsoft Office** が入っていればすぐにプログラミングを始めることができます。今どき、Office が入っていない PC のほうが珍しいぐらいですよね。
さらに、VBScript に至っては、Office さえも必要とせず、**WindowsPC であればいつでもプログラミングを始めることができる**のです。

VBA のもう一つの利点は、

　**プログラミングのネタに困らない**
	
ということで、むしろこれが最大の利点かもしれません。

プログラミング上達のコツはとにかく「**書く（アウトプットする）こと**」です。
外国語の習得が「話す（アウトプットする）こと」で上達するのと同様に、プログラミングもアウトプットしないと上達しません。プログラミングの教則本を目を皿のようにして読んだところでプログラミングができるようにはならないのです。
プログラミング関連の本は、むしろある程度プログラムが書けるようになってから読んだほうが得るものは大きいです。**初心者のうちはとにかく書く**、これに尽きます。


###■何を書くか
プログラミングと言えば C言語です。C言語と言う言葉が格好いいですよね。厨2病をくすぐる言葉です。
ところが、C言語や Java で実用的なプログラムを作れるようになるまでには相当な時間と根気を必要としますし、どのようなプログラムを作りたいのかさえ分からない人もいるでしょう。

つまり、**職業プログラマでもない限り、そもそも C や Java で「プログラムを書く機会がない」** のです。

それに比べ、VBA においては、Excel の日常業務を自動化したい、とか、ファイルの操作を一瞬で終わらせたい、というようなネタには事欠きません。

たとえば、複数の CSV ファイルをボタン一発で一括して Excel に取り込みたいとか、あるフォルダに保存されている PDF ファイルを別々のフォルダに振り分けたいとか、ファイル名の一覧をクリップボードにコピーしてテキストデータとして一瞬で貼り付けられるようにしたいとか、PC を使った日常業務のありとあらゆることがプログラミングのネタとなり得ます。

C や Java を勉強するのは VBA を習得してからでも決して遅くはありません。むしろ、VBA でプログラミングの基礎を理解してから他のプログラミング言語を勉強したほうが却って近道かもしれないのです。


###■ノー残業？ 楽勝、楽勝。 予算達成しなくていいならね。

という、キャッチコピーをどこかで見かけたことがあります。
今どきのサラリーマン事情を端的に表していて、秀逸ですね（笑）。

「**働き方改革**」によって残業時間は減らされたが、業務量は変わらず。結局家に仕事を持ち帰る、という人も多いのではないでしょうか。
**サービス残業の場所が「会社」から「自宅」に変わっただけ**で、プライベートな時間はむしろ減ったという人もいるでしょう。会社と自宅では仕事の効率も違うはずです。
じゃあ、何のための働き方改革なのか？

そう、**「働き方改革」の真の目的は「人件費（コスト）の削減」** ですね。
これは別に悪いことではありません。会社が倒産するよりも全然いいですよね。企業において、最も大きな固定費は人件費です。
人件費の削減によって会社の利益率が上がれば、会社の体力を維持することができますし、国としても法人税収を確保することができます。
もちろん、人件費に限らず、働き方改革によって削減できるコストは他にもあるはずです。

しかしながら、業務の効率化を図らない限り、自宅でのサビ残が増えるばかりです。どうすればよいでしょうか？

1. **人を増やす**
これはダメですね。人件費が増加しますから。むやみな人件費の増加は企業の体力を削ります。

1. **社員全員のスキルアップ**
企業が本当の意味での体力をつけるにはこれが欠かせません。
ただ、一朝一夕に実現できることではないのでそれなりの時間が必要です。
企業における永遠のテーマといってもよいでしょう。

1. **遊んでいるものを働かせる**
すぐにでも私たちにできることはこれしかないと思います。
将棋でも遊んでいる駒が多いと勝負には勝てません。

では今、職場で最も遊んでいるものは何でしょうか？

　実は、**パソコン（PC）** なんです。

現在の日本企業のオフィスでは、ほぼ一人に一台 PC が支給されているでしょうし、しかも数年ごとに入れ換えたりもするので、相当な費用が発生しているはずですが、にも関わらず、ほとんどの PC がその能力の 1% も使っていはいないのです。

もっと PC を働かせましょう。PC にできることはすべて PC にやらせる。
業務の内容によっては人間よりも PC のほうが速く、しかもミスなく確実に実行してくれますからね。

PC が得意とするのは、大量のデータを扱う繰り返し処理と、ルーティンワークの自動化です。とくにルーティンワークを PC にやらせると大幅な業務効率化を期待できます。
これを簡単に実現してくれるのが VBA と VBScript です。ぜひチャレンジしてみてください。

次回は、VBA を題材に具体的なコードを書いていきたいと思います。

---
[第2回に続く ＞＞](https://qiita.com/istoyo/items/35fedc92956c7db59409)