OriosのActiveBasic講座(1-3):プロシージャ

今回は「プロシージャ」というのを扱います。 実際の話、プログラミングはプロシージャで成り立っていると言っても過言ではないほどプロシージャが使われています。 またこのプロシージャを使うことでよりファイルサイズの小さい、また効率的なプログラミングが組めるようになります。 ではこの章で「プロシージャ」を学習することでよりActiveBasicで実用的なプログラミングができるようになりましょう。

1.Subブロック

【目標】「Sub」を使ってプログラムをまとまった効率のよいものにできるようにしましょう。

このプロシージャとはある複数の作業をブロック化し、プログラム中のどこからでも呼べるようにしたものです。 この説明だけでは分からないかもしれませんが、これを使えばプログラムをまとまった見やすいものにし、 また、プログラムを効率化することができます。 それではプログラムのかなめともいえるプロシージャの最初、Subブロックを早速はじめましょう。

'lesson1-3-1
#console
Dim a As Long
Input "西暦を入力してください。",a
ADtoGng(a)
Sleep(3000)
End

Sub ADtoGng(ByVal a As Long)
Dim b As Long
If a>=1989 Then
b=a-1988
Print "西暦";a;"年は平成";b;"年です。"
ElseIf a>=1926 Then
b=a-1925
Print "西暦";a;"年は昭和";b;"年です。"
Else
Print "西暦";a;"年の元号は面倒なので表示しません。"
EndIf
EndSub

C:\ActiveBasicCourse\lesson1-3-1...
西暦を入力してください。1988
西暦 1988 年は昭和 63 年です。

大正以前がないのは気にしないでください。 (いちいち調べるのが面倒。しかも明治以前になると数年おきに元号が変わるのでとてもプログラムできない。) で、実際にソースのほうを見てみると、Endの後にも書いてあるので変に感じたかもしれません。 この部分が「プロシージャ」です。 では実際に詳しくソースを見てみましょう。

-*-*-*-*-説明-*-*-*-*-

【使い方】
Sub プロシージャ名 (引数の種類 引数名 As 引数の型 ) command  EndSub

【備考】
(1) ")" と"command "、"command "と"EndSub"の間には改行を入れます。
(2)「引数の種類 引数名 As 引数の型 」のかたまりは、「,」で区切ることによって括弧内に何個でも作れます。 またこのかたまりを書かずに"()"という風にすることも可能です。
(3)EndSubの間は空けても空けなくてもOKです。

【意味】
引数を引数の種類 ・引数の型 である引数名で受け取り、command を実行するプロシージャ名 というサブルーチンを作ります。

【解説】
(1)概説
これ(サブルーチン)を含むプロシージャと呼ばれるものは言わば「プログラムのパッケージ」です。 つまり、このブロックをプログラム中のどこかに作っておけば、 プログラムのどこからでもこのパッケージを呼び出す、すなわちブロック内のcommand が実行できるのです。 これが何の役に立つの?と不思議に思うかもしれません。 しかしパッケージ化すれば……、
  • 同じことや似たようなことをパッケージにすればいちいち書く必要がなくなる
  • プログラムにまとまりが出て見やすくなる。またプログラムのサイズも小さくなる。
  • 同じようなことを繰り返しているところにバグがあると、いちいち全部直さないといけないが、パッケージにすればその中を一回だけ直せばいい。
  など、さまざまな利点があります。 このためプロシージャはプログラミングにおいて重要な位置を占めています。

(2)プロシージャの置き方
プロシージャをプロシージャの中に置くことはできません (command の中にさらにSubEndSubを書くことはできないということです)。 しかしそれ以外の場所ならプログラム本体の前・後・途中のどこにでも置くことができます。

(3)プロシージャ名
ずばりそのブロックにつける名前です。 これは実際にそのプロシージャを呼び出すときに使います。 名前の付け方は変数の名前の付け方と同じですが、加えて以下の場合は使えません。
  • 既に存在している変数と同じ名前
  • 既に存在している別のプロシージャの名前 (これは変数も同じ。ただし変数のところではまだプロシージャは扱っていなかったのでここに書きました。)

(4)引数
プロシージャを呼び出すときには、ついでにプロシージャに数字や文字列を与えることができます。 そしてプロシージャにはもらった数字や文字列に合わせた動作をさせることができます。 このプロシージャに渡す数字や文字列のことを引数と言います。 そしてプロシージャを作るときには、どんな引数をもらうかの準備をあらかじめさせる必要があります。 その準備が「引数の種類 引数名 As 引数の型 」のかたまりにあたるわけです。

引数の種類 引数名 As 引数の型 」のかたまりは受け取る引数の数だけ準備します。 複数書くときや引数を受け取らないときの書き方は備考に書いています。 ちなみに後で書きますが、プロシージャを呼び出すときに引数はこのかたまりと同じ順番で書くようになります。 で、ここからは具体的なことを書きます。
  1. 引数の種類……「ByVal」と「ByRef」の2つがあります。 これらの違いは次回に詳しくやりますが、普通は「ByVal」を指定します。 なお「ByVal」の場合に限ってこれを省略することができます。
  2. 引数名……渡された引数をプロシージャ内で何という名前の変数に置き換えるかを指定します。
  3. 引数の型……何という型(LongやIntegerなど)で受け取る引数を準備するかを指定します。
  また引数名 には既にプログラムの他のところで宣言されている変数名を使っても構いません。 この場合サブルーチンの中では渡された値のほうとして扱われ、 サブルーチンの外ではサブルーチンの外で使われていたほうの値として扱われます。 またこの場合、サブルーチンの中でその変数の値を変えてもサブルーチンの外でその同じ名前の変数を使うときの値に影響しません。 つまり名前は同じだけど全く別の変数として扱われると言うことです。



【使い方】
プロシージャ名 (引数 )

【備考】
引数が複数必要な場合は「,」で区切って必要な数だけ書きます。また引数がいらない場合は引数を書かずに"()"のようにします。

【意味】
プロシージャ名 を呼び出します。

【解説】
(1)概説
実際にSubでサブルーチン(プロシージャの一種)を作っても、実際に使わなかったら意味がありません。 そこでここでは実際にどうやって呼び出して使うのかについて書きます。

(2)呼び出し方
呼び出し方は簡単です。 プログラムの中の使いたいところで、使いたいプロシージャの名前と、それに続く括弧の中にそのプロシージャに渡す引数を書けばいいだけです。

(3)引数
引数として数字や文字列を渡すときに知っておいてもらいたいことは次のとおりです。
  • 引数として渡せるものは数字でも文字列でも変数でも値があるものなら何でもいいです。
    例:「2」を渡すなら「プロシージャ名 (2)」,文字列"aaa"なら「プロシージャ名 ("aaa")」,変数「aaa」なら「プロシージャ名 (aaa)」
  • 引数を渡すときはサブルーチンを作ったときに準備した引数の型 に合わせてください。
    例えばString型で準備したところにLong型を渡すことはできません。 また数値の場合はサブルーチンを準備している変数の型の範囲よりも大きい数値を渡そうとしても正しく渡せません。 例えばInteger型<-32768〜32767>に60000を渡そうとしても正しく渡せません。「-5536」になります。 さらに整数型(Long,Integerなど)に小数点がついた値(1.5)などを渡そうとすると四捨五入されてしまいます。
  • 複数の引数を渡さないといけない場合はサブルーチンを作るときに書いた引数の順番に書きます。
    例えば「Sub untoka(a As Long,b As String) 〜」と宣言されていた場合に、 aに「2」、bに"abc"を当てはめたいときには「untoka(2,"abc")」のように宣言された順番通りに書きます。


【意味】
サブルーチンの中で変数の宣言を行うとローカル変数として扱われます。

【解説】
《ローカル変数》
これはサブルーチンなどプロシージャ内のみで使える変数のことです。 特徴は次のとおりです。
  • その変数を使うプロシージャ内部でDimを使い宣言する
  • そのプロシージャを抜けると自動的に破棄される。よってそのプロシージャの外では使えない。 つまりそのプロシージャ専用の特別な変数である。
  • ローカル変数とそのプロシージャの外で宣言されている変数の名前が同じ場合、 そのプロシージャの中ではローカル変数の方として扱われ、 そのプロシージャの外ではローカルの方が破棄されるためプロシージャの外の変数として扱われます。 このようなローカル変数と他のプログラムの部分で宣言されている同じ変数は、外見は同じですが、 プログラムの内部では別物として扱われます。 よってプロシージャの中と外の同じ名前の変数は互いにもう一方の変数のほうに全く影響を与えません。
  これに対して「グローバル変数」というものがあります。これは次回に詳しくやります。



今回のサブルーチンはどうでしたか? まだよくわからなかったりするかもしれませんが、実際、プログラムのほとんどはプロシージャで成り立っています。 しっかり理解をしましょう。 また説明ばかりで頭がこんがらがってきたら実際に自分で簡単なプログラムを作って実験してみましょう。 こっちのほうが私のこむずかしい説明でイメージするよりも簡単に頭に入ると思います。 分からないことがあれば気軽に掲示板で質問してください。 ではお約束の「やってみよう」です。

-*-*-*-*- -*-*-*-*-

2つの引数を受け取りその2つの和を表示するサブルーチンを作り、 実際にユーザーに2つの数字を入力してもらい、その2数の和を表示するプログラムを作ってみよう。




ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

前に戻る - 次に進む

ホーム > OriosのActiveBasic講座(トップページ) >