第8回目:11月11日

プログラミング(基礎)

今週と来週の演習では皆さんに実際にプログラミングを行なってもらい,どのようにすればより計算機を自在に操ることができるかを体験してもらうことを目的とする.

プログラミングって?

今までの演習では計算機上で様々なソフトウェアを使っていろいろな情報処理を行なってきた.これらの情報処理は計算機が勝手にやっているように見えるが、実は計算機は与えられた手順に従って処理を行なっているに過ぎない.つまり,計算機は命令通りの作業しかできない.

では,その命令はどうやって計算機に指示しているか.それは,あらかじめ計算機へ命令の手順書が組み込まれており,あるボタンが押されたらそのボタンに対応している手順書を実行している.この手順書は人間が作成しており,この計算機への命令の手順書を作成することをプログラミングという.

まず,計算機への命令とはどういうものであるかを考えてみよう.計算機とは文字通り計算を行なうものである.つまり,計算機は実際には数値しか理解できない.人間が計算機に命令を与えるためには,命令を数値として表現しなければならない.

もし,人間が計算機の命令の手順書を数値として書くとしたらどうなるだろうか?非常に手間のかかる作業になる.そこで,人間が書き易い言語にて命令を書き,それを数値に翻訳するという方法が考えられた.この人間が書き易い言語のことをプログラミング言語という.いままでに様々なプログラミング言語が作られてきた.

一般にプログラミング言語にて記述された命令手順書のことをソースコードという.ソースコードを計算機が理解できる数値列に翻訳する方法には,大きく分けて2 種類ある.1つは計算機がソースコードに書かれている命令群を実行できるようにあらかじめ翻訳しておく方式であり,これはコンパイル方式と呼ばれる.もう1つはソースコードを翻訳しながら実行する方式であり,これはインタプリタ方式と呼ばれる.

この演習で用いるプログラミング言語は?

この演習で用いるプログラミング言語は,表計算ソフトExcelの上で動作するVisual Basic for Application(VBA)をとする.これはVisu al Basicという言語のサブセットになっている.VBAではインタプリタ方式を採用している.VBAは,Excelなどのアプリケーションにおいてユーザが行うべき操作をユーザに代わって自動的に実行してくれるマクロを作成するために作られた.従って,VBAのソースコードは,エクセル形式のファイル(ブック)の一部となる.

VBAでは,ソースコードの作成やその実行にVisual Basic Editor(VBE)という統合環境を使うことができる.このVBEはExcelの一部分となっている.まず始めにVBEの基本操作を覚えよう.

VBEの基本操作

VBEを起動するためには,まずExcelが起動していなくてはならない.ここでは,プログラミングの学習が目的であるため、始めにExcel形式のファイル(ブック)を新規作成しておくこと.新規のExcel形式のファイルを開いている,すなわち,Excelが起動している状態で,[ツール]メニューの[マクロ]を選択し,その中[Visual Basic Editor]を選択することで,VBEが起動する(手引書 図11.2 p.282参照).

新しくプログラムを作成するには,VBE ウインドウの[挿入]メニューの[標準モジュール]を選択する(手引書 図11.3 p.282参照)と,手引書の図11.4(p.283)のような画面になる.この右側のウインドウ(モジュールシート)はメモ帳と同じようにテキストエディタになっており,ここにソースコードを書く.

では,実際にソースコードを入力してみる.まずは以下のソースコードを右側のウィンドウで入力してみる.(注:--------は入力しなくてよい.)

例題1

------------------------------------------------------------
Sub example1()
    Dim intA As Integer
    Dim intB As Integer
    Dim intC As Integer
    intA = 3
    intB = Application.InputBox("数値を入力してください。")
    intC = intA + intB
    MsgBox (intC)
End Sub
------------------------------------------------------------

ソースコードの入力が終了したら実行する前に必ず保存すること.

次にそのソースコードを実行してみる.実行する方法にはいくつかあるが,ここでは簡単な方法を学習する.まず上のソースコードを入力したモジュールシート中の

Sub ....
という行と
End Sub
という行の間にカーソルを移動し,[実行]メニューの[サブ/ユーザフォームの実行]を選択する(もしくは,カーソルを移動した後にF5キーを押す).これにより,解釈が開始され,命令が実行される.上の例を正しく入力した場合,「数値を入れて下さい」というダイアログボックスが表示され,そこに数字を入力すると,入力した値に3を加えた値が書かれたダイアログボックスが表示されるはずである. もし,入力に間違いがあると,間違っている場所にカーソルが移動し,修正するように要求される.

プログラミングの基本

多くのプログラミング言語は文から構成されている.ソースコードに書かれている各文は,原則として書かれた順番,すなわち上から下に実行される.

例題1のソースコードの各文を実行される順番に従ってみてみることにする.

    Dim intA As Integer
    Dim intB As Integer
    Dim intC As Integer

これら3文では変数の宣言を行なっている.変数とは「値を保持しておく箱」のようなものである.その箱に名前をつけて箱の識別を行なう.この箱の名前のことを変数名という.変数名として使える名前には制限がある.

箱毎に,その箱が保持できる値の種類を決めることができる.保持できる値の種類のことをとよぶ.型の種類には,整数型や文字列型などがある.

VBAにおいて,変数宣言は以下のような形で記述する.

Dim 変数名 As 変数の型

例題1では,変数名intAという整数型の変数,変数名intBという整数型の変数,そして変数名intCという整数型の変数を使うことを宣言している.

なお,変数宣言は,ソースコードを解釈するプログラムへの命令である.

では,その次の行をみてみることにする.

    intA = 3

多くのプログラミング言語では,文として数学で使われるような計算式を用いる.その計算式に従った数値計算や文字列処理を計算機に行なわせる.具体的には,等式の右辺で指定している計算式で得られる結果を左辺で指定している変数に代入させる.

VBAにおいて,代入文は以下のような形で記述する.

変数名 = 計算式

数学では等式は左辺と右辺とが等しいことを表しているが,プログラミング言語では等式は代入を表す.注意しよう.

例題1では,右辺の計算結果である3を左辺で指定している変数 intA に 代入することを指示している.

    intB = Application.InputBox("数値を入力してください。")

計算機が人間から値を受け取ることを入力という.VBAでは入力方法としてはApplication.InputBoxという命令を用いる.

例題1では,人間から数値を入力し,それをintBという変数に格納するように指示している.これは,Application.InputBoxという関数の計算結果をintBという変数に代入させていると捉えることができる.

    intC = intA + intB

例題1では,変数intAに格納されている値と変数intBに格納されている値の和を,変数intCに格納することを指示している.

    MsgBox (intC)

計算機から人間へ値を受け渡すことを出力という.VBAでは出力方法としてMsgBoxという命令を用いる.

例題1では,intCという変数に格納されている値を出力するように指示をしている.

プロシージャ

VBAではいくつかの文(命令)を集めたものをプロシージャとよぶ.VBEから実行する際の最小の命令単位となる.プロシージャは名前を用いて識別している.

プロシージャの始まりは

Sub プロシージャ名
であり,プロシージャの終りは
End Sub
である.

問1

例題1のソースコードを参考にして,2つの値を入力し(すなわち人間がら受け取り)その2つの値の積を出力するプログラムを作成してみよう.

関数

数学の関数と同様にある処理をした結果,その結果の値を返すものを関数とよぶ.関数の返す値のことを戻り値という.VBAにおいて,関数は以下のような形で記述する.

Function 名前 (引数リスト) As 戻り値の型
    処理内容
End Function

以下に例題1の足し算を関数として記述した例題2を示す.この例題をVBEの右側のウィンドに追加して入力し,実行してみよう.関数の記述(定義)は上に示した形に従っていることがわかる.また,定義した関数の使い方については,等式の左辺側で使うことができる.

例題2

------------------------------------------------------------
Sub example2()
    Dim intA As Integer
    Dim intB As Integer
    Dim intC As Integer
    intA = 3
    intB = Application.InputBox("数値を入力してください。")
    intC = Tasizan( intA , intB )
    MsgBox (intC)
End Sub

Function Tasizan( intA As Integer, intB As Integer) As Integer
  Tasizan = intA + intB 
End Function
------------------------------------------------------------

問2

例題2を参考にして,2つの数の積を求める関数を定義し,人間が入力した2つの値の積を求めるプログラムを作成してみよう.(課題1の積を求める部分を関数に変更する.)

実行制御

実行される順番は原則として上から下と説明したが,その原則だけでは,状況に応じて対応する処理を変えることができない.多くのプログラミング言語では,条件に応じて実行を分岐させる条件分岐や,条件を満たす限り処理を繰り返す繰り返し文といった実行制御を行なう制御文が存在する.VBAではIf文,Select文,Do Loop文,For文などの制御文がある.

If 文を使う条件分岐

If文は以下のような形で記述される.

If 条件1 Then
   処理1
ElseIf 条件2 Then
   処理2
...
(ElseIf を繰り返し利用可)
...
Else
   処理n
End If

条件1が成立するならば処理1が実行される.条件1が不成立でかつ条件2が成立すれば処理2が実行される.以下すべての条件が不成立なら処理nが実行される.各条件には等式(=),不等式(< 未満,<= 以下,> より大きい,>= 以上,<> 等しくない)を記述できる.

例題3にIf文を用いた例を示す.このプログラムは,人間から入力された値が負数かどうかを判定するプログラムである.

例題3

------------------------------------------------------------
Sub example3()
    Dim intA As Integer
    intA = Application.InputBox("数値を入力してください。")
    If intA < 0 Then
       MsgBox ("負の数です")
    Else
       MsgBox ("正の数または0です")
    End If    
End Sub
------------------------------------------------------------

問3

例題3を参考にして,人間から入力された値を点数(成績)とみなして,ABCDの判定を行なうプログラムを作成してみよう.なおAは80点以上,B は80点未満70点以上,Cは70未満60点以上,D は60点未満である.

Select 文を使う条件分岐

Select文は以下のような形で記述される.

Select Case 式
   Case 値1
      処理1
   Case 値2
      処理2
   ...
   (Case を繰り返し利用可)
   ...
   Case Else
      処理n
End Select

式の値をを求め,その値が値1と等しい場合は処理1が実行され,値2と等しい場合は処理2が実行され,すべての値と等しくない場合は処理nが実行される.これはIf文を使っても同じ処理を書くことができる.

Do Loop文を用いた繰り返し

ある条件を調べてその結果に基づいて処理を繰り返したい場合にDo Loop文を用いる.繰り返したい処理をDo文とLoop文の間に書く。条件が成り立っている間,処理を繰り返したい場合はWhileを用い,条件が成りたつまで(すなわち成り立たない間),処理を繰り返したい場合はUntilを用いる.また、繰り返したい処理を1度実行した後に条件判定をすることも,条件判定をした後に繰り返し処理をすることもできる.従って,以下に示す4つの形で記述することになる.

Do While 条件
  処理
Loop

Do
  処理
Loop While 条件

Do Until 条件
  処理
Loop

Do
  処理
Loop Until 条件

For文を用いた繰り返し

ある処理をあらかじめ決まっている回数だけ繰り返したい場合はFor文を使うことができる.

For カウンタ変数 = 初期値 To 最終値 Step 増分
  処理
Next カウンタ変数

例題4に人間から与えられた数だけ処理を繰り返す例を示す.このプログラムでは,繰り返し処理として,繰り返しの回数を数える変数をある変数に足しているため,結果的には,1から与えられた数までの和を求めることができている.

例題4

------------------------------------------------------------
Sub example4()
    Dim counter As Integer
    Dim intA As Integer
    Dim intSum As Integer
    intA = Application.InputBox("数値を入力してください。")
    intSum = 0 
    For counter = 1 To intA
       intSum = intSum + counter
    Next counter   
    MsgBox (intSum)
End Sub
------------------------------------------------------------

問4

例題4を参考にして,人間から与えられた数の階乗を求めるプログラムを作成してみよう.(ヒント:総和の場合は初期値は0であり繰り返しの中で足し算をしていた.階乗の場合は初期値を1として繰り返しの中で掛け算をすればよい.)

レポート

問1から問4および以下に示す問5について以下のような条件でプロシージャを作成し,それらのプロシージャのソースコードを含んだExcel形式ファイルを作成し,出来上がっファイルを電子メールに添付して提出する.

  1. 問1」のプロシージャ名はexam1とすること.3と4を入力したら12が出力されること.

  2. 問2」のプロシージャ名はexam2とすること.また,関数名はKakezanとすること.3と4を入力したら12が出力されること.

  3. 問3」のプロシージャ名はexam3とすること.75を入力したらBが出力されること.

  4. 問4」のプロシージャ名はexam4とすること.4を入力したら24が出力されること.

  5. 「問5」のプロシージャ名はexam5とすること.問5では例題4および問4を参考にして以下に示すプログラムを作成すること.また,4を入力したら24が出力されること.

    数学的にはnの階乗f(n)は以下のように定義される。

    		  f(0)=1
    		  f(n)=n x f(n-1)  (但し n > 0 )
              

    この関数定義に基づいて階乗を計算するVBAの関数を作成し、その関数の名前をKaijouとする.そして,人間から与えられた値の階乗を計算し出力する。

提出期限 2003年11月17日午後10時
宛先 akira-report-08@ipe.tsukuba.ac.jp 佐藤
件名 Report 08 全て半角で入力
CC 自分のアドレス 自分にもメールが届く

採点基準(合計10点)

電子メール以外での提出は採点対象にならない.

  1. exam1というプロシージャが存在し,それを実行し,2つの数を入力するとそれらの積が出力される.2点
  2. exam2というプロシージャおよびKakezanという関数が存在し,exam2を実行し,2つの数を入力するとそれらの積が出力される.2点
  3. exam3というプロシージャが存在し,それを実行し,数を入力するとABCDの判定結果が出力される.2点
  4. exam4というプロシージャが存在し,それを実行し,数を入力するとその階乗が出力される.2点
  5. exam5というプロシージャおよびKaijouという関数が存在し,exam5を実行し,数を入力するとその階乗が出力される.2点

授業のページに戻る

第7回のページへ戻る

第9回のページへ進む