VBAプロシージャ(Sub)の初級チュートリアルと実例

Excel VBA基礎VBA変数およびプログラム構造の基本を勉強した後、この記事のVBAプロシージャと関数では、VBAのもう1つの基本的な概念であるプロシージャ(Sub)について勉強します。

次の記事では、まずVBAプロシージャの基礎を学びます。引数の書き込み/渡し、引数の返す、プロシージャの実行/呼び出しなどが含まれます。

前言

VBAでは、プロシージャが最も大事なものです。ほとんどすべてのコードが1つまたは複数のプロシージャに記述されます。

開発の過程では、通常、1つのプロシージャが対応する目標のみを完了することをお勧めします。そのため、プログラムには複数の過程が含まれます。これが、VBAにプロシージャ概念が存在する理由の1つです。

プログラムでプロシージャを使用すると、プログラムがより簡潔で明確になり、中大規模のプロジェクトの開発過程でコードを管理しやすくなります。

プロシージャの基本的な構文

VBAプロシージャは、Subステートメントで始まり、End Subステートメントで終わり、特定の目標を達成するための1つ又は複数ステートメントが含まれています。

引数がないプロシージャ

引数がないVBAプロシージャの基礎構文は次となります。

Sub [プロシージャ]()
ステートメント1
ステートメント2
…
ステートメントn
End Sub

ご覧のとおり、プロシージャはSubステートメントで始まり、End Subステートメントで終わり、後に括弧 ()が付いた名前があります。

簡単な例を挙げます。

Sub SayHello()
Msgbox "Hello World"
End Sub

上記は簡単なプロシージャであり、プロシージャ名はSayHelloです。 このプロシージャにはステートメントが1つだけ含まれており、実行すると、ダイアログボックスがポップアップしてHelloWorldが表示されます。

引数があるプロシージャ

プロシージャは1つまたは複数の引数を受け入れることもでき、引数は定数、変数、条件式にすることができ、そして、各引数は名前を指定します。 プロシージャのステートメントでは、受け入れられた引数が名前を指定するやり方で使用されます。

引数を受け入れるプロシージャの基礎構文は次のとおりです。

Sub [プロシージャ名]([変数名1] As [データ型1],…[変数名n] As [データ型n])
ステートメント1
ステートメント2
…
ステートメント3
End Sub

引数がないプロシージャと比較して、引数があるプロシージャには、プロシージャ名の後に括弧 ()内に1つまたは複数の引数が含まれています。引数の書き方は、変数を宣言するやり方と似ていますが、相違点はDimを記述する必要がありません。

[変数名1] As [データ型1]

次の例をご覧ください。

'プロシージャを宣言する
Sub SayHello(name As String)
Msgbox "Hello" & name
End Sub

'他のプロシージャでは、上記のプロシージャを呼び出す。呼び出すときに、実際のname引数を指定する
Sub MyCode()
SayHello "World 2"
End Sub

MyCodeプロシージャを実行する場合に、name変数(World 2)が提供され、実行時にポップアップダイアログボックスにHello World2が表示されます。

サブプロシージャの呼び出し(Sub)

プログラムの開発では、コードを複数のサブプロシージャと関数に分けると、プロジェクトの管理、テスト及び実行が容易になります。VBAでも同じです。

実際の開発過程では、プロジェクトには通常、メインエントリプロシージャ(親プロシージャ)があります。 親プロシージャは、複数の子プロシージャと関数を呼び出すことにより、一連の複雑な操作を完了させます。 サブプロシージャと関数は、通常、1つの操作またはアクションに対応します。

次の例をご覧ください。

'メインエントリプロシージャ
Sub Main()
Dim name As String
Dim title As String
name = "本田"
title = "CEO"
WriteInfo name & "," & title
End Sub

'子プロシージャ、ワークシートのセルA1にデータを記述する
Sub WriteInfo(info As String)
Range("A1") = info
End Sub

上記の例では、メインプロシージャはメインエントリ(親プロシージャ)であり、プログラムはここから実行されます。まずname変数とtitle変数に値を割り当て、次にはWriteInfoサブプロシージャを呼び出して2つの情報を合併し、ワークシートのセルA1に記述します。

次には、サブプロシージャと関数を呼び出す基礎構文を説明します。

サブプロシージャを呼び出すには、直接呼び出しとCallキーワードを使用した呼び出しの2つの方法があります。 2つの方法には、サブプロシージャの引数に対する要件が異なります。

直接呼び出し

直接呼び出し、プロシージャ名を直接記述して、プロシージャを呼び出せます。

Sub Main()
MySub
End Sub

Sub MySub()
'コード
End Sub

サブプロシージャに引数を入力する必要がある場合は、複数の引数をコンマ(,)で区切るだけでいいです。

Sub Main()
MySub 2019,"年"
End Sub

Sub MySub(val1 As Integer, val2 As String)
'コード
End Sub

Callキーワードを使用して、プロシージャを呼び出す

Callキーワードを使用して呼び出す場合、Callの後にプロシージャ名が続きます。

Sub Main()
Call MySub
End Sub

Sub MySub()
'コード
End Sub

サブプロシージャで引数が必要な場合は、引数を括弧で囲む必要があります。

Sub Main()
Call MySub(2019,"年")
End Sub

Sub MySub(val1 As Integer, val2 As String)
'コード
End Sub

ヒント:プログラム側から見ると、プロシージャを呼び出すときにCallキーワードは必要ないので、このやり方はお勧めしません。

プロシージャを強制終了

通常、VBAプロシージャはSubステートメントで始まり、End Subステートメントで終わります。 ただし、実際の状況によっては、プロシージャを強制終了する必要がある場合があります。 VBAには、プロシージャを強制終了ための2つのやり方、Exit SubとEndステートメントを提供します。

Exit Subステートメント

プロシージャでは、プログラムがExit Subステートメントまで実行されると、今のプロシージャが強制終了です。

Sub Main()
Call MySub
Msgbox "親プロシージャ"
End Sub

Sub MySub()
Exit Sub
Msgbox "子プロシージャ"
End Sub
'Mainプロシージャを実行し、結果を返す:
=> "親プロシージャ"

上記の例では、MainプロシージャはMySub子プロシージャを呼び出し、Exit Subステートメントを検出し、すぐに子プロシージャを強制終了し、親プロシージャMainに戻り、残ったステートメントを実行し続けます。

ここで、Exit Subステートメントは今のプロシージャのみ影響し、親プロシージャを呼び出すには影響しないことに注意してください。

Endステートメント

プロシージャでは、プログラムがEndステートメントまで実行されると、今実行中のすべてのVBAプロシージャが強制終了です。

Sub Main()
Call MySub
Msgbox "親プロシージャ"
End Sub

Sub MySub()
End
Msgbox "子プロシージャ"
End Sub

'Mainプロシージャを実行し、結果を返す:
=> "返す値なし"

上記の例では、MainプロシージャはMySubサブプロシージャを呼び出し、Endステートメントを検出すると、親プロシージャMainを含む今実行中のすべてのプロシージャを強制終了します。

実際の開発過程では、End終了ステートメントを慎重に使用する必要があります。 Endステートメントの効果は、コンピューターの強制シャットダウンコマンドに似ています。それを実行すると、値を保存せずにすべてのプログラムを強制終了します。VBAには次の効果があります。

  • プログラム内のオブジェクトの各イベントはトリガーされません;
  • 実行中のVBAプログラムはすべて強制終了します;
  • オブジェクト参照が無効になります;
  • 開いているウインドウはすべて閉じられます。

まとめ

プロセスはVBAの核心概念であり、ほとんどすべてのコードは1つ以上のプロシージャで記述されます。 プロシージャは任意数の引数を受け入れることができ、引数はプロシージャまたは関数で使用できます。 プロシージャでは、他のサブプロシージャを呼び出して、複雑なコードをいくつかのプロシージャに分けると、コードの管理と記述を容易にすることができます。 最後、すべてのステートメントを実行せずにプロシージャを強制終了できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です