読者です 読者をやめる 読者になる 読者になる

Mokosoft開発者ブログ

こんなブログ読んでも時間の無駄ですよ

プログラムの初歩の勉強は、Excelでやっちゃうってのはどうでしょう。Winユーザー向けプログラム勉強方法

http://www.flickr.com/photos/73806619@N00/2209185558

 

 

続きの記事を書きました

プログラミングを勉強したい人におすすめ!Excelプログラミング勉強法の真骨頂。 - Mokosoft開発者ブログ

 

プログラミング言語の習得というのは、とても敷居が高い、とよく言われます。

習得して理解してしまうと、一体何が分からなかったのか、それが分からなくなってしまいがちです。

そんなわけで、初歩のプログラミング勉強について躓いてしまう点を自分なりに分析してみました。

プログラミング環境の構築に躓く
勉強といってコードを書いても、具体性がわからないし応用の仕方がわからない
実用性がないので、続かない

 

なにげにこんな所が原因なのではないかと思います。

そこで、基本的にはWindowsユーザー限定にはなりますが、Excelを使って初歩のプログラミングを勉強する方法を提唱したいと思います。 

 Excelでプログラムを書くの?意味あるの?

マクロとか関数とかいうやつ?あれよくわかんないしなー。

プログラミングとは全然違うじゃん!

と、思う人もおられると思います。

 

しかしちゃんと、Excelを使ってプログラミングの勉強をすることは可能なのです。

私がExcelプログラミングを勧める理由は下記の通りです。

 

環境構築が楽

ExcelってだいたいのWindowsパソコンに入ってるんじゃないかなーと思うんです。

会社のパソコンとか。

家のパソコンでも買った時からインストールされてたりするじゃないですか。

そのExcelを起動すれば、即プログラミングが開始できるんです。便利でしょ?

最近はプログラミング環境の構築も簡単になっているとはいえど、VisualStudioってんなんぞ?とかLAMP環境ってなんぞ?とか

まずそこの敷居が高いし、インストールしたとしても使い方がよくわからん、やーめたってなっちゃったりしますよね。

でも、Excelだと違う。なんだExcelか、わかるよ使い方。簡単簡単。まかせといて、とこうなるでしょ。(わからんけどw)

 いつも使い慣れてるExcelだからこそいいーんです。

 

実はデータベースってExcelみたいなもんだから

データベースってなんか聞いたことあるなー、高度なプログラミングで使うんでしょ?あれなんなの?

実はデータベースってExcelみたいなもんなんです。

厳密には全然違うんですが、Excelのシート(表)はリレーショナル・データベースの「テーブル」に構造が似ている。

だからExcelに慣れていれば、データベースというものを利用するときに、わかりやすいんじゃないかな?と思うわけです。

 

実務で使える!

これが一番大きい。

プログラミングの勉強って、なんかよくわからん計算式で数学の問題解いたり、よくわからんアルゴリズムを無理やり覚えさせられたり、掲示板作ったり、これなんに使えるわけよって、なってしまって

勉強を挫折してしまうというケースが多いと思います。

しかし、Excelプログラミング勉強法は実務で役に立ちます。

その応用方法は無限の可能性を秘めていますw

Excelを元に、大量のファイルを生成しないといけない、とか、

シートを一個一個切り替えて、何か変更をかけないといけない、とか

Excelのデータを元に、たくさんのシートを作らないといけない、とか

Excel全く関係ない業務であっても、Excelのプログラミングを理解していると、今まで無駄手作業でやっていた時間を一気に削減することも可能です。

なんかテレビショッピングの売り文句みたいになってきた。

 

この処理どう書けばいいんだろう・・・?にすぐ答えを出せる

これに関してたぶん、後述しますが、プログラミングにおいて、

こういう処理をしたいけどどうやって書いていいのかわからん、って事になって

ググったりするんだけど、分からないってなって、詰まってしまうことも多いです。

Excelプログラミングの場合、これを比較的簡単に突破する方法があるので、

つまづきが少なくて済みます。

しかもそれを調べることで、余計勉強になるという二重の効果をもたらす、はずです。

 

 

んで、やり方は?

前置きが長くなりましたが、実践方法です。

f:id:mad_ochi:20140109184319p:plain

おもむろにExcelを立ち上げて、準備完了です。

いやー見慣れた画面、まったく不安感がないですね。

macの中で動いてるけどなんだこりゃ?あんまり気にしないでください。

これはOffice2013でやっていますが、それ以前のバージョンでもほぼ同等だと思います。たぶん。

 

 

さて、Excelが起動したら、Excelのウィンドウを選択して、「ALT+F11」キーを押します。

f:id:mad_ochi:20140109184506p:plain

なんかでてきましたね。

これがOfficeに内蔵されているVBA(Visual Basic for Application)と呼ばれるものなのです。

実はOfficeにはVisual Basicというプログラミング言語と同等の実行環境が内蔵されており、これを利用すると、Officeの各アプリケーションで実現できることを、プログラミングによって実現することができてしまうのです。

 

例えば、シート1を開き、マウスでC6のセルを選択して、コピーし、D8のセルへペーストする、なんて一連の動作もプログラムですべて書き、実行することも可能です。

 

この環境を使ってプログラミングの勉強をすれば、プログラムも覚えることができるし、Excelマスターにもなれる。これは一石二鳥。

 

実際になにかプログラムを書いてみましょう。

 

f:id:mad_ochi:20140109185832p:plain

 例えばこんなシートがあったとします。

これを性別を元に「男」シートと「女」シートに分配せよ、みたいな。

こんなん、手作業でやったほうが早いのはわかりきってますが、練習なんで、いいっしょ。

 

f:id:mad_ochi:20140109191457p:plain

 Excelプロジェクトに標準モジュールを追加して。

 

f:id:mad_ochi:20140109191525p:plain

 プログラムを記述します。

内容の解説とかはまた今度。

 

表示→イミディエイトウィンドウを出して、これを実行します。

f:id:mad_ochi:20140109191641p:plain

Sub で定義した名前を使って

call furiwake  と入力して Enterを押すと

「完了」と表示されます。

 

男、女シートを見てみると。

f:id:mad_ochi:20140109191809p:plain

f:id:mad_ochi:20140109191821p:plain

 

おお、本当にそれぞれのシートにデータが表示されました。

こんな感じです。簡単でしょう。便利でしょう。

 

 

よくわからない、解説

基本的にプログラムの構造は「順次」「選択」「反復」の3パターンしかありません。

言い方がややこしく感じるので言い換えると、

「順次」とはプログラムの順番のことで、プログラムは必ず1番上から処理され、順番に行を下って行くものである、ということを言っています。

プログラムコード上は関数というものの具合で、処理される場所は移動するわけですが、基本的には上から下へという構造は変わりません。

「選択」は条件分岐のことになります。特定の条件の場合はAルートへ向かい、そうでない場合はBルートへ向かう。それぞれのルートに達したら動作は「順次」で上から順に処理されます。

「反復」はループ(繰り返し)のことです。ループの場合においてのみ、「順次」処理は先ほど通った処理の場所へ舞い戻ることができます。

余計わからなくなってしまいそうですが、とにかくプログラムというのは

  • 上から順に下へ処理が行われていく
  • たまに分岐する
  • たまにループする

という構成でしかないのです。

後はそこでどういった処理をするのかという話になります。

 

さて、プログラムの解説になりますが、「順次」にしたがって上から読んでいきましょう。

Sub Furiwake()

 

    otoko_gyo = 1

    onna_gyo = 1

    

    '2行目から11行目までループ処理

    For i = 2 To 11

        

        'cell A,B,Cをそれぞれ変数へ読み込み

        mei = Sheets("リスト").Cells(i, "A")

        miyo = Sheets("リスト").Cells(i, "B")

        seibetu = Sheets("リスト").Cells(i, "C")

        

        

        If seibetu = "男" Then

        

            '性別が男の場合の処理

            

            Sheets("男").Cells(otoko_gyo, "A") = mei

            Sheets("男").Cells(otoko_gyo, "B") = miyo

            Sheets("男").Cells(otoko_gyo, "C") = seibetu

            

            otoko_gyo = otoko_gyo + 1 '行おくり

            

        Else

            

            'それ以外

            

            Sheets("女").Cells(onna_gyo, "A") = mei

            Sheets("女").Cells(onna_gyo, "B") = miyo

            Sheets("女").Cells(onna_gyo, "C") = seibetu

            

            onna_gyo = onna_gyo + 1 '行おくり

            

            

        End If

        

        

    Next

    

    

    Debug.Print "完了"

    

 

End Sub

 

 

 

Sub Furiwake()

とありますが、 これはサブルーチン(関数)を定義する書式になります。

Furiwakeという名前の処理の集合である関数を作成しています。

 

    otoko_gyo = 1

    onna_gyo = 1

この書き方は、変数の代入となります。

イコールってのは、左と右が同じことだよ、なんて算数では教えられたと思いますが、プログラムにおいては、左側に右側の値を入れる、という意味になります。

この変数がよくわからない、タンスの引き出しなんて言われてもなあと思うかもしれませんが、Excelでもよく、コピーしたいデータを範囲選択してコピーして、

一旦、Excelのまっさらなところにペーストして一旦保存しておいてから、

本当に貼り付けたいところへペーストする 、なんてことをしたことないですかね?

この一旦保存しておく場所がすなわち変数だと考えてもいいんじゃないかと思います。

 

    '2行目から11行目までループ処理

    For i = 2 To 11

ここで出ました「反復」です。

説明忘れてましたがVBAではVBScriptという言語を利用していますが、このVBScriptでループ処理を行うときには、このFor構文を使います。

他にもループのやりかたはあるのですが、For構文の場合は

For と書いてる場所から、 Next とかかれた所までを、決められた条件分ループします。

ここでは 変数 i の値が 2 から 11  になるまで、ループをする、ということになります。

実際には i の値はループされる毎に 1ずつ増えていき、いくつずつ増えるのかという指定の書き方があるのですが、省略すると1ずつ増えるということになります。

 

 'cell A,B,Cをそれぞれ変数へ読み込み

        mei = Sheets("リスト").Cells(i, "A")

        miyo = Sheets("リスト").Cells(i, "B")

        seibetu = Sheets("リスト").Cells(i, "C") 

 ここがExcelVBAのキモとなる場所です。

’ (シングルコーテーション)で始まっている行はコメント行なので

プログラム的には無視されます。

Sheets("リスト").Cells(i, "A")  というのが何を指すのか、なんとなくわかる感じがしますが、口語に訳すと

「リストというシートの中の、i行目、A列のセルの値」

という意味になります。 i は 2から11までが順繰りにループされるので、

1回目のループでは2が入っているはずです。

では、リストという名前のシートの 2-A のセルには何が入っているかというと、

「エレン」という文字が入っているわけです。

これを代入処理で、 mei という変数に一旦保存をしておきます。

同様に、姓の「イェーガー」と性別の「男」をそれぞれ、miyo、seibetuに一旦保存を行います。

 

  

If seibetu = "男" Then

        

            '性別が男の場合の処理

            

            Sheets("男").Cells(otoko_gyo, "A") = mei

            Sheets("男").Cells(otoko_gyo, "B") = miyo

            Sheets("男").Cells(otoko_gyo, "C") = seibetu

            

            otoko_gyo = otoko_gyo + 1 '行おくり

            

        Else

            

            'それ以外

            

            Sheets("女").Cells(onna_gyo, "A") = mei

            Sheets("女").Cells(onna_gyo, "B") = miyo

            Sheets("女").Cells(onna_gyo, "C") = seibetu

            

            onna_gyo = onna_gyo + 1 '行おくり

            

            

        End If

ここで「選択」が出てきます。条件分岐です。

先ほどシートのセルから取り出した、性別の値が男であるかどうか、をチェックしています。

 

If  条件  Then

 

  条件を満たした場合の処理

 

Else

 

  条件を満たさなかった場合の処理

 

End If

 こういう読み取りになります。

そして、条件を満たした場合は「男」という名前のシートのセルに、先ほど一旦保存した値をペーストしていくという処理。

条件を満たさなかった場合は「女」という名前のシートのセルに、先ほど一旦保存した値をペーストする処理。

ということになっています。

 

    Next

ここでNextがきます。

ループ処理は For から Next までを処理しますので、

ここで、また、For 構文の所まで移動し、処理の開始となります。

このとき、 i の値は 1追加されて i = 3 の状態で、処理が始まります。

これで、11になるまで9回のループが行われて、やっと、ループを抜けるわけです。

そうしてる間に、リストの名簿データは、男と女のシートに分けられているということになります。

 

なんとまあ説明が下手なのでしょうか。

でも、これがこのプログラムの解説です。簡単でしょう?

 

どうですか、Excel VBA プログラミングは。

これを使って、プログラミングの勉強を初めてみるのはいかがでしょうか。

 

反響があるようであれば、その他の機能など、また記事を書かせてもらえればと思います。

時間がないので今日はこのへんで。

 

 

続き書きました

プログラミングを勉強したい人におすすめ!Excelプログラミング勉強法の真骨頂。 - Mokosoft開発者ブログ