Microsoft Access Club >AccessTips >このページ >次頁 < 前項  サイト内検索


Subプロシージャは値を返さない:AccessTips110



SubプロシージャについてAccessヘルプでは、以下のように定義されています。
 
Sub プロシージャは、処理を実行するだけで値は返しません。 Sub プロシージャは、呼び出したプロシージャを通じて定数、変数、または式などの引数を取得できます。

また、FunctionプロシージャについてAccessヘルプでは、以下のように定義されています。

Function プロシージャは Sub プロシージャと似ていますが、Function プロシージャは値を返すこともできます。Function プロシージャは、呼び出したプロシージャを通じて定数、変数、式などの引数を取得できます。

しかし、VBAに取り組みはじめたときには、中々この違いが分かりませんね。今回は、簡単な事例を元にして、この違いを見ていきましょう。

 VBA例題

下記のSubプロシージャは、今月末日の曜日を返す目的で作成したプロシージャです。

Sub TestPro()

    Dim strmsg As String
    Dim str曜日 As String
    
    str曜日 = Format(DateSerial(Year(Date), Month(Date) + 1, 1) - 1, "aaaa")
    strmsg = "今月末日は、" & str曜日 & "です。"
    
    MsgBox strmsg

End Sub
イミディエイト画面上で実行する

このプロシージャをイミディエイト画面で、下記のように記述し実行してみます。

?TestPro → ここでEnterを押します。

下記のようなメッセージが現れプロシージャの実行が中断します。

解決策

Subプロシージャをイミディエイト画面で実行する場合は、先頭に ? を付けません。

TestPro → ここでEnterを押します。

結論
  • FunctionプロシージャとSubプロシージャのイミディエイト画面上での実行方法が異なる。

プロシージャ内でプロシージャを用いる

プロシージャ内でプロシージャを用いることを、「入れ子」と呼んだりします。

下記のサンプルは、SubプロシージャをFunctionプロシージャ内に取り込んでいます。
# Callステートメントは、省略しています。

Function SamplePro()
    
    TestPro 'subプロシージャです。
    
End Function

留意点

Subプロシージャは、ユーザー側に何かアクションを与えることができません。この場合はFunctionプロシージャ内で実現させるようことになります。入れ子については、以下のような利点があります。

  • 長いプロシージャを分散するために、 Subプロシージャで個々のアクションを独立させます。この結果、プロシージャは見易くなります。

 Accessヘルプの引用

Sub プロシージャを使って、複数のプロシージャをまとめて記述することにより、コードを理解しやすく、簡単にデバッグできるようにすることができます。

次のコード例では、Sub プロシージャ Mainは Sub プロシージャ MultiCounterを呼び出し、引数として値 33 を引き渡します。

MultiCounter が実行されると、制御は Main に戻り、Main は、Sub プロシージャ Message を呼び出します。Message は、メッセージ ボックスを表示します。ユーザーが [OK] をクリックすると、制御は Main に戻り、Main は終了します。

Function Main()

    MultiCounter (33)
    Message
    
End Function
Sub MultiCounter(IntNumb)

    Dim intcounter As Integer
    
    intNO = 0
    For intcounter = 1 To numbeeps
        intNO = intNO + 1
    Next intcounter
    
End Sub
Sub Message()

    MsgBox intNO & "回、実行しました。"

End Sub

2003/07/23

ページの先頭へ 前ページへ戻る

 


Subプロシージャは値を返さない:AccessTips110


 

-Microsoft Access Club-