VBAプログラムがどんどん大きくなると、多くのコード行を適切に維持することが非常に難しくなります。 プログラムの作成、理解、変更を容易にするには、整然とした構造化プログラミングを使用する必要があります。 構造化プログラミングはどうやって作成しますか? 大きな問題を、同時に実行できる小さな問題に分けるだけです。VBAでは、メインプロシージャと1つ以上のサブプロシージャを作成することでそれを実現できます。 メインプロシージャとサブプロシージャはメインプログラミングであるため、キーワードSubを使用してそれらを宣言できます。 メインプロシージャは、必要なサブプロシージャを呼び出して、それらに引数を渡すことができます。関数を呼び出すこともできます。次の例は、AboutUserプロシージャを示しています。このプロシージャでは、ユーザーの姓と名が必要であり、姓と名を分けて、最後の結果は、ユーザーの姓が表示され、その後にコンマと名が続きます。 読み進めると、このプロシージャはいくつかのタスクに分割され、メインプロシージャ、サブプロシージャ、および関数の使用概念を示します。
Sub AboutUser()
Dim fullName As String
Dim firstName As String
Dim lastName As String
Dim space As Integer
'get input from user ユーザーから情報を取得する
fullName = InputBox("Enter first and last name:")
'get first and last name strings 姓と名の文字列を取得する
space = InStr(fullName, " ")
firstName = Left(fullName, space – 1)
lastName = Right(fullName, Len(fullName) – space)
'display last name, first name 姓と名を表示する
MsgBox lastName & ", " & firstName
End Sub
AboutUserプロシージャは、いくつかの小さなタスクに分割できます。 最初のタスクはユーザーの姓名を取得することです。次のタスクでは、ユーザーから提供されたデータを姓と名、2つの文字列に分割します。これらのタスクは異なる関数(例えば、GetLastとGetFirst)に割り当てることができます。最後のタスクは、再配置された姓と名の文字列情報を表示します。焦点を当てるべきタスクがわかったので、次に各タスクを実行する方法をご覧ください。
1、現在のVBAプロジェクトにモジュールを追加し、名前をSample9に変更します
2、Sample9モジュールウィンドウに次のプロシージャAboutUserMasterを入力します。
Sub AboutUserMaster()
Dim first As String, last As String, full As String
Call GetUserName(full)
first = GetFirst(full)
last = GetLast(full)
Call DisplayLastFirst(first, last)
End Sub
上記のメインプロシージャは、適切なサブプログラミングと関数を呼び出すことにより、プログラミングのメインフローを制御します。メインプロシージャは変数宣言から始まり、最初のステートメントCall GetUserName (full)は、サブプロシージャGetUserName(ステップ3を参照してください。)を呼び出し、それを引数(変数fullの内容)に渡します。
変数にはcallステートメントを実行する前に値が割り当てられていないため、その値は空白の文字列(“”)です。 サブプロシージャ名はCallの後にあることに注意してください。 プロシージャを呼び出すときにキーワードCallを使用する必要はありませんが、引数を必要とするプロシージャを呼び出すときに使用する必要があります。 引数リストは括弧で囲む必要があります。
3、次のサブプロシージャGetUserNameを入力します。
Sub GetUserName(fullName As String)
fullName = InputBox("Enter first and last name:")
End Sub
プロシージャGetUserNameは、2つの非常に重要なVBプログラミングの概念を示しています。引数をサブプロシージャに渡す方法と、値をサブプロシージャからメインプロシージャに渡し返す方法です。
メインプロシージャ(ステップ2を参照してください。)では、プロシージャGetUserNameを呼び出し、それを引数として渡します。変数fullは、引数fullNameに受け渡され、この引数のサブプロシージャGetUserNameのSubステートメントで宣言されています。VBがGetUserNameサブプロシージャを呼び出すと、変数fullには空白の文字列が含まれ、引数fullNameもこの空白の文字列を受け渡します。 VBがダイアログボックスを表示してユーザー名を取得すると、このユーザー名が引数fullNameに割り当てられます。引数に割り当てられた値は、サブプロシージャが実行した後に一致する引数に渡されます。これより、VBがメインプロシージャに戻る時、変数fullにはユーザー名が含まれます。
サブプロシージャに渡された独立変数は、その引数に受け渡されます。引数名(fullName)の直後にデータ型の宣言(AsString)が続くことに注意してください。引数のデータ型は、一致する独立変数のデータ型と一致している必要がありますが、独立変数とそれに対応する引数に異なるの引数名を使用することもできます。
テクニック:独立変数(Arguments)と引数(Parameters)
独立変数は、サブプロシージャに渡される変数、定数、または式です。
引数は、値を受けてサブプロシージャに渡す変数です
4、下記の関数GetFirstを入力します。
Function GetFirst(fullName As String)
Dim space As Integer
space = InStr(fullName, " ")
GetFirst = Left(fullName, space - 1)
End Function
メインプロシージャの2番目のステートメント(ステップ2を参照してください。)first=GetFirst(full)は、変数fullの値を関数GetFirstに渡します。関数の引数fullNameは、この値を受け取ります。ユーザーが提供するデータから姓と名を区別するには、姓と名の間にあるスペースを見つける必要があります。これより、関数の先頭はローカル変数spaceの宣言であり、次のステートメントはVBA組み込み関数InStrを使用して、文字列fullName内のスペース(” “)の位置を返します。次に、取得した数値を変数spaceに割り当てます。最後に、Left関数を使用して、文字列fullNameを左から特定の文字数(space-1)まで抽出します。名字の長さは、変数spaceに格納されている値より1文字短いです。関数の結果(ユーザー名)が関数名に割り当てられます。 VBがメインプロシージャに戻る時、結果が変数firstに配置されます。
5、下記の関数GetLastを入力します。
Function GetLast(fullName As String)
Dim space As Integer
space = InStr(fullName, " ")
GetLast = Right(fullName, Len(fullName) - space)
End Function
メインプロシージャの3番目のステートメント(ステップ2を参照してください。)last=GetLast(full)は、変数fullの値を関数GetLastに渡します。この関数は主に、ユーザーが提供したデータから取得したユーザー名の姓です。関数GetLastは、組み込み関数Lenを使用して、文字列fullNameの合計文字数を計算します。関数Rightは、右側の特定の文字(Len(fullName)–space)から始まる文字列fullNameの文字を抽出します。次に、取得した文字列を関数名に割り当て、メインプロシージャに戻ると、変数lastに格納されます。
6、下記のサブプロシージDisplayLastFirstを入力します。
Sub DisplayLastFirst(firstName As String, lastName As String)
MsgBox lastName & ", " & firstName
End Sub
メインプロシージャの4番目にあるCallステートメント(ステップ2を参照してください。)
DisplayLastFirst(first, last)、サブプロシージャを呼び出します。
DisplayLastFirstには、firstとlast、2つの独立変数があります。 これらの独立変数を受け取るために、サブプロシージャDisplayLastFirstと2つの一致する引数(firstNameとlastName)と一緒に宣言されています。
上記に述べように、異なる引数名は独立変数と対応する引数に使用でき、サブプロシージャDisplayLastFirstは[ユーザーの姓、コンマ、ユーザーの名]を表示します。
テクニック:サブプロシージャのメリット
複数のサブプロシージャを維持するには、1つのメインプロシージャを維持するより簡単です。
1つのサブプロシージャで実行されるタスクは、複数のプロシージャに使用できます。
各サブプロシージャは、メインプロシージャに入る前に単独にテストされます。
複数のプログラマーが独自のサブプロシージャを担当することができ、これらのサブプロシージャによってメインプログラミングを作成します。
この記事では、サブプロシージャと関数の違いを勉強しました。サブプロシージャは操作を実行し、関数は値を返します。また、プロセスの記録またはコードの入力によってサブプロシージャを作成できますが、関数を記録することはできません。引数が必要である場合に、手動で入力する必要があります。 ワークシートまたは他のVBプロシージャから呼び出された関数の例が表示されます。
関数に独立変数の渡し方と、関数が実行した結果のデータ型を決定する方法を学びました。 ByVal、ByRef、OptionalなどのキーワードをVBAキーワードリストに追加しました。また、プログラミングを理解しやすくするために、問題をより小さく簡単なタスクに分割する方法も勉強しました。 最後に、サブプロシージャが引数を使用して値をメインプロシージャに渡し返す方法を学びました。
この記事を掌握すると、自分のニーズに対応するカスタム関数を作成できるようになります。 MsgBox関数とInputBox関数を使用すると、ユーザーと簡単にインターアクションができるはずです。
コメントを残す