Weekend Mathematics/情報/「プログラミング基礎」の授業
はじめに
総合学科を先取りして、今年から「プログラミング基礎」という科目を3年の自由選択科目として
開講しました。
今年度の3年生は1年次の「情報A」も経験していない生徒ですし、我々も未体験ゾーンということで、
本格的なプログラミングではなく、Excel VBAを使ったマクロ処理を中心に扱っていこうと考えています。
選択してくれた生徒は男子生徒ばかり12人です。
教員2人(数学、地歴)に教員補助員の方を加え、3人で担当します。
授業は月曜日の午後の2時間連続です。
第1回・表計算ソフトの概要
第1回目の授業では、まず授業の概要を説明しました。
授業の目標、内容、評価などについてです。
情報処理室を使う上で注意する点
(飲食厳禁、携帯電話等の使用禁止、FDの持ち込み禁止など)についても説明をしました。
ほとんどの生徒が「情報A」(3年生向け自由選択)を平行して選択しているため、
このあたりは簡単にしました。
今年の3年生は情報関連の科目は初めてですし、どのくらいの経験を持っているのか
個人差もあるだろうなあとの予想もありました。
そこで最初に以下のようなアンケートを取ってみました。
|
Excelを使うのはまったく初めてという生徒も多いので、
この時間は、Excelがどういうもので、どういうことが
できるのかを知ってもらうことにしました。
簡単なデータを入力してもらい、そのデータを使って、計算式、関数(=sum)、
再計算、オートフィル、
セルのサイズ変更、セルの結合、文字サイズの変更、文字位置の指定、罫線、
保存、呼び出し、印刷、そしてグラフの作成とひととおりやってもらいました。
思った以上に生徒たちは、すんなりついてきてくれましたので、次回からはもう少しスピードアップしても
大丈夫かな?
第2回・関数について(1)
Excelの関数の扱いを勉強しました。
合計(=sum)、平均(=average)、最高(=max)、最低(=min)、順位(=rank)などです。
見やすい表の工夫(罫線、センタリング、列幅、セルの書式設定等)は
適宜自分で判断しなさいとしました。
グラフについても模範例は示さず、「割合がわかるようなグラフを作成しなさい。」、
「価格差が比較できるようなグラフを作成しなさい。」という指示にしました。
それぞれ、どのデータを使ったらいいか、
どんなグラフにしたらいいか考えながら取り組んでいました。
全体に対する個々のデータの割合を出すという課題を与えました。
生徒たちは、関数で考えようとします。
これは関数ではなく、数式、わり算だよねと確認、
更にコピーをさせると「#DIV/0!」というエラーが出ます。
これは0でのわり算エラーで、どうしてこのエラーが出るのかを考えさせ、
それをふまえて絶対番地(行のみ、列のみ、両方)の説明をしました。
次に順位付け(=rank)ですが、この関数の説明だけして様子を見ていたら、
コピーをした結果を見て悩んでいる生徒もいますし、一方範囲指定のところで
きちんと行だけの絶対番地指定ができている生徒もいました。
最後にその確認をして2回目の授業を終わりました。
第3回・関数について(2)
数式や、合計(=sum)などを復習した後、条件判断の関数(=if)についての学習をしました。
論理式の書き方、値の返し方、文字列の扱いなどです。
条件判断によって、"○"または、"×"を返すという課題の設定にしたのですが、
要領がわかってくると、メッセージに変えている生徒もいました。
(=if)を使うことで処理の分岐ができるわけですが、
更にこれを重ねることで多分岐が可能であるということも説明しました。
その後、ワークシートのコピーをし、並べ替え(ソート)をしました。
元に戻せるように左端に列を挿入し、オートフィルで通し番号を振りました。
そして、優先キー、降順・昇順などを説明して、並べ替えをしたり、元にもどしたりという
実習をしました。
後半は参照関数(=vlookup)を扱いました。
コードを入力すると、予め用意してある表を参照して値を返すという
できあがりのワークシートを最初に提示しました。
イメージをつかんでもらった後、具体的に参照関数(=vlookup)の説明をして、
実際に関数を記述してもらいました。
更に参照した値を用いて数式による計算、前段の復習で条件判断なども課しました。
更に応用としてエラー表示を消す工夫の説明もしました。つまり、コードが入力されていない状態では、
それは値0と見なされ、参照する表の方に該当するものがないと、エラーがでます。
それを(=if)を使って消すということです。具体的には、「=if(B3="","",処理)」ですが、(=if)がこのような
形で使われるということが、ちょっと意外だったようです。
発展問題として、駅コードと駅名、距離、時間の表を与え、
発駅のコードと、着駅のコードを入力すると、駅名と2駅間の距離、
所要時間を表示させるというワークシートを作成しなさいという課題を与えました。
2駅間の距離と所要時間については、(=vlookup)の引き算になります。
更に時間については、データの表示形式に気をつけなければなりません。
エラー表示を消す為には、(=if)を2つ重ねなければなりません。
それなりにむずかしい課題だと思うのですが、何人かは時間内にこなしていました。
データの入力にかなり時間差が生じるということで、
今回はすべてデータが用意されたファイルを配り、処理に専念してもらいました。
最後に全国商業高等学校協会の
コンピュータ利用技術検定の昨年の問題(2級と3級)を配りました。
本校では今年度から、技能審査の成果による単位認定の制度が導入されましたので、
それを含めて説明し、是非挑戦してみてごらんと話しました。
第4回・VBAの基礎知識
いよいよVBAです。全員がどんなものか知らないということでしたので、
VBAを使うとどんなことができるかイメージを持ってもらうことにしました。
1つ目の例は、名簿をボタン1つでいろいろな観点でソートできる、色分けできるなどの例、
これは次の時間に実際に作成してもらおうと思っています。
2つ目の例は、私が以前に作ったパスカルの三角形を紹介しました。これは、ボタンを押すと、
パスカルの三角形を表示したり、ある数の倍数に色をつけたりしてくれるというものです。
実際にやってみようということで、まずは記録マクロの使い方を実習しました。
具体的には、アクティブなセルに入力された文字を装飾する(フォントや大きさ、色など)ためのマクロを記録マクロで作りました。
記録を取る前に、処理内容をきちんと整理すること、間違えてしまったら取り直すなどの注意をしました。
できたら、そのマクロを実行して確かめてみる。
またVBEを起動して、作成したマクロのプログラムコードがどうなっているか確認し、不要な行を削除したりもしました。
休憩をはさんで、フォントや大きさの指定を変えて同様のものを作ってごらん、と言うとほとんどの生徒が
5分とかからず作成できました。そしてそれをボタンに登録しました。
一連の手順を記録させ、ボタン1つで実行というところまではできました。
次に、それを拡張して繰り返しの構造を入れることにしました。
まず、セルに色をつけるというだけのマクロを記録し、ボタンに登録し、
それを元に、以下のように書き直してもらいました。
Sub カラー() Dim i As Integer For i = 1 To 50 Cells(i, 4).Select With Selection.Interior .ColorIndex = i .Pattern = xlSolid End With Next i End Sub |
D列を指さして、「なぜここに表示されるの?」という質問がでました。「Cells(i, 4).Select」で4列目に指定したからであって、
「Cells(i, 3).Select」にすればC列ね、では、「Cells(i, i).Select」にしたらどうなると思う?
この結果を予想するのはむずかしかったようです。
実際に実行してみると対角線に並びます、それを見て納得していました。
実際に動かしてみるというのは大切なことだなあと感じました。
「色ナンバーは50よりもう少し多いみたいよ、誰か確かめてくれない?」というと、何人かが確認してくれました。
「先生、ラストは56みたいです。それ以上にするとエラーになります。」
For 〜Next文の「step *」についても説明し、試してもらいました。
色を並べただけではなく、色見本として使うためにナンバーも添えることにしましょうというわけで、
更に以下のように改良しました。C列にナンバーが入ります。
Sub カラー() Dim i As Integer For i = 1 To 50 Cells(i, 3).Value = i Cells(i, 4).Select With Selection.Interior .ColorIndex = i .Pattern = xlSolid End With Next i End Sub |
第5回・VBAによる処理の自動化(1)
ボタン1つで並べ替えができるマクロを作成することにしました。
時節柄(?)ワールドカップの日本代表選手のデータをインターネットで(不完全ながら)収集し、
これを材料として使うことにしました。
最初は背番号順ですが、記録マクロを使い、それをボタンに登録しました。
A1のセルをアクティブにし、並べ替え、そしてまたA1のセルをアクティブにして終えます。
こうすると、範囲指定をしなくても並べ替えができます。かつ、並べ替えの範囲を自動的に
読みとってくれるので、データを追加しても有効に使えます。
できあがったものの末尾に自分のデータを追加して、マクロの動作を確認してもらいました。
同様にして年齢順の並べ替えマクロを作ってもらいましたが、 ほとんどの生徒がE列(年齢)をキーに使います。 同年齢の場合はどうするの? D列(生年月日)をキーにした方がいいのではないかなあ・・・とアドバイス。
ポジション別は、第2キーを背番号という指示をしました。
早い生徒は、身長順とか、体重順などのマクロも作っていました。
後半は、ボタン1つで所属チーム別に色分けするというマクロを、作りました。
最初に完成品を生徒に提示してから1つづつプログラムを拡張していきました。
記録マクロを使って、セルに色をつけるところから始まります。
「If 〜 Then 〜 Else 〜 End If」の構文を説明し、
「清水」だけ青くするように書き換えました。
Sub 色分け() If ActiveCell.Value="清水" Then Selection.Interior.ColorIndex=5 Else Selection.Interior.ColorIndex=xlNone End If End Sub |
次にプログラムを構造化するために、処理を独立させるということをしました。
Sub 青色() Selection.Interior.ColorIndex=5 End Sub Sub 色なし() Selection.Interior.ColorIndex=xlNone End Sub Sub 色分け() If ActiveCell.Value="清水" Then Call 青色 Else Call 色なし End If End Sub |
更に分岐を増やすために、
「If 〜 Then 〜 ElseIf 〜Then 〜 Else 〜 End If」の構文を説明し、
「鹿島」を赤くする処理を追加しました。
早い生徒は色分けの処理を更に細かく設定していました。
Sub 色分け() If ActiveCell.Value="清水" Then Call 青色 ElseIf ActiveCell.Value="鹿島" Then Call 赤 Else Call 色なし End If End Sub <サブプロシージャの追加> Sub 赤() Selection.Interior.ColorIndex=3 End Sub |
マクロを書き換えるたびに、実行して動きを確認します。
ここまでで、アクティブセルについての色分けができることになります。
しかしこのままだと、1つづつすべてのセルについて実行しなければならないので、それを自動化することにします。
新しく「色分け繰り返し」というマクロを作成し、
アクティブセルについてチェックが済んだら1つ下のセルに移動するというプログラムにしました。
更に、ボタンに登録するマクロを「色分け」から「色分け繰り返し」に切り替えました。
Sub 色分け繰り返し() Call 色分け ActiveCell.Offset(1,0).Activate End Sub |
最後にすべて自動化するために、繰り返しの処理を入れました。
所属チームが入力されている「H2」のセルをスタート地点として、セルの内容が空になるまで、
色分け処理を繰り返しながら、下に下がっていきます。
Sub 色分け繰り返し() Range("H2").Activate Do While Not IsEmpty(ActiveCell) Call 色分け ActiveCell.Offset(1,0).Activate Loop Range("A1").Select End Sub |
というわけで完成です。ボタン1つで色分けをしてくれます。
中には、チームカラーで色分けをしてくれている生徒もいました。
「"G大阪"は黒だから文字が読めなくなっちゃう! 」というので、
「そこだけ文字の色を白くしたら? どう記述していいかわからない時は、その部分だけ記録マクロでとってみるといいよ。」
とアドバイス。
驚いたことに「色消し」のマクロを作っている生徒がいました。
もちろん組み合わせるだけでいいのですが、これが発想できるということは、
処理を独立させた意味がわかってもらえたってことかな?
Sub 色消し() Range("H2").Activate Do While Not IsEmpty(ActiveCell) Call 色なし ActiveCell.Offset(1,0).Activate Loop Range("A1").Select End Sub |
第6回・VBAによる処理の自動化(2)
VBAによって様々な処理が自動化できるということで、一覧表から該当のデータを取りだして
単票にする、グラフを描いて印刷をするということを学習しました。
実教出版の「30時間マスターVBA」を参考にさせていただきました。
このような表を配り、平均や合計を関数を使って求めてもらいました。
次に、別のワークシートに単票の枠を作り、F2のセルの支店番号を入れると、
該当の支店のデータが表示されるようにしました。
これには「vlookup」関数を用いますが、
何ヶ所かありますので、この関数の使い方を含めて順に丁寧に説明しました。
グラフの作成は問題なくいきますが、データによって軸の目盛りが動くのは煩わしいので、固定します。
次に記録マクロを利用して、この単票を印刷(印刷プレビュー)するマクロを作成し、ボタンに登録します。
記録内容:シートを指定 → F2に値を代入 → 印刷プレビュー
データのある分だけ一括印刷できるように、これを加工します。
Sub 印刷() Dim k As Integer Sheets("支店別売上票").Select For k = 1 To 5 step 1 Range("F2").Value = k ActiveWindow.SelectedSheets.PrintPreview Next k End Sub |
2時間目はこれを元にさらにバリエーションを広げていきました。
1つ目は、条件に合うものだけを印刷するということで、
売り上げ高が、3,500,000に満たないものだけに対して、適当な場所のコメントをつけて印刷するという課題にしました。
先程の「Sub 印刷()」をコピーし、名称を変えて記述していきます。
生徒に対しては以下のようなものを提示して、( )の中に何を記述すればいいか考えなさいということにしました。
Sub 抽出印刷() Dim k As Integer Sheets("支店別売上票").Select For k = 1 To 5 Range("F2").Value = k ( ) Range("c24").Value = "もっとしっかりやりなさい!!" ActiveWindow.SelectedSheets.PrintPreview Range("c24").Value = "" End If Next k End Sub |
2つ目は、指定したページだけ印刷するということです。
ワークシートの方には開始ページと終了ページを入力する覧を作り、
スピンボタンも添えました。
コードの方は、やはり次のようなものを提示してしてし( )の中を考えてもらいました。
Sub 部分印刷() Dim k As Integer Sheets("支店別売上票").Select ( ) Range("F2").Value = k ActiveWindow.SelectedSheets.PrintPreview Next k End Sub |
こういった課題の出し方は、プログラムの構造とそれぞれの意味を考えなければならないという点で効果的だなと思っています。
第7回・VBAによる処理の自動化(3)
前回の復習をしました。
生徒には、体力テスト一覧表を配りました。
合計・平均を出した後、vlookupを活用して個人票を作成、
指定した番号の分だけ一括印刷できるようなマクロを作成しなさいとしました。
前回の授業内容を思い出しながら、各自取り組んでいました。
特に指示したわけではないのですが、印刷の範囲指定からボタンの位置をはずすなど、結構気を使っているようでした。
後半は上の表から、請求日時を過ぎてもまだ入金されていないところにだけ請求書を発行する
マクロの作成に取り組みました。
D4のセルには今日の日付が表示され、A5のセルに入力された番号に応じて各商店あての請求書が
作成されます。
そして、条件に合うものだけを印刷するようなマクロを作り、ボタンに登録します。
Sub 印刷() Dim i As Integer Dim itiran As Range Set itiran = Range("商店台帳!A3:E12") Sheets("請求書").Select For i = 1 To 10 Range("A5").Value = i If Range("c11") < Range("D4") And IsEmpty(itiran.Rows(i).Cells(5)) Then ActiveWindow.SelectedSheets.PrintPreview End If Next i End Sub |
日付の扱いなど、新しい要素もあったので、やや難航していました。
第8回・1学期実技テスト
1学期のまとめの意味もあって、実技テストを実施しました。
問題1は、関数や、絶対番地の扱いです。
合計(sum)、順位(rank)、割合を求めて%表示させるなど。
問題2は、VBAによるマクロの作成です。
並べ替えのマクロを2種類、該当データだけ色づけするマクロの作成。
問題3は、成績一覧表の集計をした後、各自の単票(含むグラフ)を作成。
さらに全員分の一括印刷と指定した番号のみを印刷するマクロの作成。
正味40分くらいですから、すべてをやるのは無理で、 好きなところ、得意なところから取り組んでもらいました。 少ない生徒でも1題、早い生徒では2題程度終わらせていました。
評価については、皆真剣に取り組んでくれましたし、
欠席もほとんどないという状態なので、全員合格点ということで、この実技テストも参考にして
つけました。