関数をつくる

関数とは

関数とは、プログラムの世界では1つのまとまった処理のことを指します。
今までprintf関数とかscanf関数、Asc関数なんかを使いました。
関数を使うことで決まった処理を簡単に使うことができます。
ちなみに、 本家の講座のステップ3に解説があります。

ABの関数は戻り値のあるFunctionと戻り値の無いSubの2つがあります。
Function 関数名(変数 As 型...) As 型
関数の処理
End Function

Sub 関数名(引数 As 型...)
関数の処理
End Sub
Function/Subのあとに関数の名前を付けます。
次に()の中に引数となる変数を指定します。引数が無い関数では変数を指定しない()だけです。
Functionの場合は戻り値の型を指定します。

関数のサンプルです。
#console
#include<vcrt71.sbp>

'xのy乗を求める関数
Function mypower(x As Long , y As Long) As Long
Dim i As Long

If y < 0 Then Exit Function
mypower = 1
For i = 1 To y
    mypower = mypower * x
Next
End Function

Dim i As Long
For i = 0 To 10
    printf(Ex"2のi乗=%d\n" , mypower(2,i))
Next
関数内で宣言した変数は関数内のみ有効です。関数の外で宣言した関数はどこでも有効です。関数内に同じ名前の宣言があった場合は関数内の宣言が有効です。
戻り値は関数名になります。

値渡し、参照渡し

ABの関数は通常値渡しと言って、引数で関数にデータを渡した値を関数で操作しても、元の値が変化することはありません。
'前略
Function ataii(x As Long) As Long
x = 2
atai = x
End Function

Dim a As Long
a = 444
atai(a)
'後略
と関数を定義したばあい、aにどんな値をいれてもaは2になりません。(a=444の所をa=2にした場合は除きます)
これは引数の値を関数にコピーしているだけだからです。
つまり、2つの引数の値を交換するような関数を作るとき、値渡しでは行うことはできません。
一方参照渡しを使うと、引数の値を関数で操作できるようになります。それは、参照渡しが引数の値ではなくアドレスを渡しているからです。
参照渡しをするにはByRefを関数の変数宣言の前に付けます。
#console
#include<vcrt71.sbp>
'値渡し
Sub Vswap(a As Long , b As Long)
    Dim c
    c = a
    a = b
    b = c
End Sub

'参照渡し。ByRefを付けるだけです。
Sub Rswap(ByRef a As Long ,ByRef b As Long)
    Dim c
    c = a
    a = b
    b = c
End Sub
Dim x As Long,y As Long
x = 30
y = 10
Vswap(x, y)
printf(Ex"値渡し:x=%d y=%d\n" , x , y)

x = 30
y = 10
Rswap(x, y)
printf(Ex"参照渡し:x=%d y=%d\n" , x , y)
値渡しでは引数の変化がありませんが参照渡しで引数が入れ替わっているのが確認できるでしょう。
実は値渡しはByValがつきます。Function test(ByVal x As Long)のようになります。
でもByValは省略できるので書きませんでした。これからもByValは省略します。
ただしByRefは省略できません。省略するとByValになり値渡しになります。

整理すると以下のようになります。
キーワード意味
ByVal値渡し。引数に影響なし。省略可能。
ByRef参照渡し。引数を関数内で操作可能。省略ダメ。