VBA - ネスティングマクロ
VBA - ネスティングマクロ
コム![](http://img.brin-designs.com/img/games/572/vba-nesting-macros.png)
前書き
Subを呼び出すのか関数を呼び出すのかに応じて、別のマクロからマクロを呼び出すために使用できる方法がいくつかあります。 また、イベントプロシージャを処理するとき、または別のワークブックからプロシージャを呼び出すときには、特に注意が必要です。SubからSubを呼び出す
- パラメータなし
- パラメータあり
- Subから関数を呼び出す
- 関数から関数を呼び出す
- 中間変数を使用する
- 中間変数を使用しないで
- イベントプロシージャを呼び出す
- Callステートメントを使って
- CallByName関数
- 別のワークブック内のプロシージャを呼び出す
- Subを呼び出す
- 関数を呼び出す
パラメータなし
両方のSubsは同じモジュール内にあり、パラメータはありません。 Macro2はMacro1を呼び出しています。Sub Macro1()MsgBox「こんにちは!」 End Sub Sub Macro2()Macro1 End Subを呼び出します。
Callステートメントを使いたくない場合は、
Sub Macro1()MsgBox「こんにちは!」 サブサブマクロ終了2()マクロ1終了サブ
ただし、Callステートメントを使用するとコードがはるかに読みやすくなるため、お勧めできません。
Subsが異なるモジュールに属し、パラメータを持たない場合は、モジュールを指定する必要はありません。 しかしそれでも、あなたはあなたのコードのメンテナンスについて考える必要があります。 どのモジュールが使用されているかを示すことで、コードをデバッグするときに貴重な時間を節約できます。 したがって、Macro1がModule1にあり、Macro2がModule2にあるとします。
Sub Macro1()MsgBox「こんにちは!」 End Sub Subマクロ2()Call Module1.Macro1 End Sub
パラメータあり
方法は同じです。 括弧内にパラメータを追加するだけです。Callステートメントを使って
Sub Macro1(Nb1の長さ、Nb2の長さ)範囲( "A1")= Nb1範囲( "A2")= Nb2 End Sub Sub Macro2()Call Macro1(18254、654897)End Sub
Callステートメントなし
サブマクロ1(長さNb1、長さNb2)範囲( "A1")= Nb1範囲( "A2")= Nb2終了サブマクロ2()マクロ1 18254321、654897終了サブ
マクロが異なるモジュールにある場合
Sub Macro2()Call Module1.Macro1(918254321、654897)End Sub
Subから関数を呼び出す
関数とは Subと関数を区別するものは何ですか? 関数は特定のパラメータに基づいて値を返す命令です。 Subもパラメータに依存する命令がある場合はその命令ですが、値を返しません。機能の例:
二重加算としての関数追加(二重としてNb1、二重としてNb2)= Nb1 + Nb2終了関数
この例では、関数は "As Double"として宣言されています(この型宣言はオプションです)。関数が返す値はDouble型になります。 関数が値を返すことを考えると、呼び出し側のSubにこの値を格納する必要があります。 これはExcelセル、変数、コントロールなどです。
サブマクロ2()ダブルソムとしてのディムソム=加算(1234.56、654.32)MsgBoxソムエンドサブ関数の加算(ダブルとしてNb1、ダブルとしてのNb2)=ダブル加算としてのNb1 + Nb2終了関数
Nb:パラメータを括弧で囲み、カンマで区切って指定します。
関数から関数を呼び出す
同じ原則を使います。中間変数を使用する
この例では、結果を中間変数に格納します。サブマクロ2()ダブルソムとしてのディムソム=加算(1234.56、654.32)ダブルボックスとしてのサブ関数の加算(Nb1としてダブル、Nb2として)ダブルVarNbとしてのVarNb = MultiplieParDeux(Nb2)加算= Nb1 + VarNb関数MultiplieParDeux(Nb As Double)倍精度MultiplieParDeux = Nb * 2終了関数
中間変数を使用しないで
Sub Macro2()Dim Somme as Double Somme =加算(1234.56、654.32)MsgBox Somme End Sub関数の加算(Nb1としてDouble、Nb2としてDouble)Double加算として= Nb1 + MultiplieParDeux(Nb2)終了関数関数MultiplieParDeux(Nb As Double)ダブルMultiplieParDeux = Nb * 2終了関数として
イベントプロシージャを呼び出す
イベント手続きとは何ですか? イベントプロシージャは、ユーザーが特定のオブジェクトと対話すると自動的にアクティブになるステートメントです。 オブジェクトはシート、ワークブック、コントロールのいずれかです。イベントの例:ワークブックの開閉、シートの変更、リストからの選択、コントロールの入力など。例:
ユーザーはセルA1の値を変更します。A1が10より大きい場合、B1に "pas mal"が表示されます。
===実装:====
- シートを選択
- シートタブ/コードの表示を右クリックします。
- コードウィンドウに次の行を挿入します。
プライベートサブワークシートの変更(ByVal Target As Range) 'シラセルの懸念の一部は変更されていませんA1 => quitteの場合Target.Address "$ A $ 1"を終了してから、サブシラのシラセル(donc A1)を終了します。 "Pas mal!"という場所に10人のアロールがいます。 ja B1 Target.Value> 10の場合、Target.Offset(0、1)= "Pas mal!" それ以外の場合はTarget.Offset(0、1)= "ひどい!" 終了サブ
Callステートメントを使って
呼び出されたプロシージャがイベントプロシージャと同じモジュール内にある場合プライベートサブワークシートの変更(ByVal Target As Range) 'シラセルの懸念の一部は変更されていませんA1 => quitteの場合Target.Address "$ A $ 1"を終了してから、サブシラのシラセル(donc A1)を終了します。 "Pas mal!"という場所に10人のアロールがいます。 ja B1 Target.Value> 10の場合、Target.Offset(0、1)= "Pas mal!" それ以外の場合はTarget.Offset(0、1)= "ひどい!" Sub Sub Sub MaMacro()範囲セットとしてのmonRangeを暗くするmonRange = Sheets( "Feuil1")。Range( "A1")Worksheet_Change(monRange)を呼び出しますEnd Sub
反対に、呼び出し元の手続きが同じモジュール内にない場合は、次のエラーが発生します。
- コンパイルエラー:SubまたはFunctionが定義されていません
VBAはイベントプロシージャにアクセスできません。 これを直すには:
CallByName関数
構文:CallByName(オブジェクト、名前、TypeAppel、Args())- オブジェクト:必須 オブジェクト型 プロシージャに含まれるオブジェクトを指定します。
- 命名法:必須です。 文字列 呼び出されたプロシージャの名前
- TypeAppel:必須です。 CallType:Method、Set、Let、またはGet。
- Args():オプションです。 呼び出された関数に渡されるパラメータ
この例では、maMacroをModule1に配置し、Worksheet_Change Subを呼び出します。 しかし、最初に、私たちのイベント手続きを宣言する必要があります(非公開として宣言されたとき、それはモジュール内で使用することはできません)
Sub Worksheet_Change(ByVal Target As Range) 'Si lacelluleに関する詳細な変更がありません。A1 => quitteの場合Target.Address "$ A $ 1"を終了して、Sub' Si la cellule(donc A1)を終了します。 「Pas mal!」という場所に ja B1 Target.Value> 10の場合、Target.Offset(0、1)= "Pas mal!" それ以外の場合はTarget.Offset(0、1)= "ひどい!" 終了サブ
MyMacro Subをモジュール2に配置します。
Sub MaMacro()範囲設定としての薄いmonRange monRange = Sheets( "Feuil1")。Range( "A1")CallByNameワークシート( "Feuil1")、 "Worksheet_Change"、VbMethod、monRange End Sub
もう一つの例:
UserForm(UserForm2)のボタンをクリックすると、UserForm1のCombobox1_Changeイベントが発生します。
プライベートSub CommandButton1_Click()CallByName UserForm1、 "ComboBox1_Change"、VbMethod End Sub
別のワークブック内のプロシージャを呼び出す
Runメソッドを使用します。 呼び出されるプロシージャを含むワークブックとプロシージャの名前を含めて指定されます。Subを呼び出す
ケース1:ファイルは既に開かれています。 この場合、パスを指定する必要はありません。Sub TestRun()Application.Run "'Classeur1.xlsm'!Module2.Macro2" End Sub
ケース2:ファイルが閉じられています。 この場合、フルパスを指定する必要があります。
Sub TestRun()Application.Run "'C:\ Users \ franck \ Desktop \ Classeur1.xlsm'!Module2.Macro2" End Sub
関数を呼び出す
同じワークブックから関数を呼び出すときは、戻り値を格納するための変数が必要になります。 変数。 呼び出し側のSubから関数に渡されるすべてのパラメータも伝達する必要があります。Classeur1.xlsmにある加算関数を使用します。
二重加算としての関数追加(二重としてNb1、二重としてNb2)= Nb1 + Nb2終了関数
ワークブック[Classeur2.xlsm]のメインプロシージャー[Principale()]を呼び出すには、次のコードが必要です。
ワークブックは既に開かれています
Sub Principale()薄暗いSommeをダブルSomme = Run( "'Classeur1.xlsm'!Module2.Addition"、1234.56、654.32)MsgBox Somme End Sub
ワークブックは閉じています
Sub Principale()Dim Somme as Double Somme =実行( "'C:\ Users \ franck \ Desktop \ Classeur1.xlsm'!Module2.Addition"、1234.56、654.32)MsgBox Somme End Sub
注意:ワークブックが以前に閉じられていた場合は、マクロの実行後に開きます。 コードを使用して、もう一度閉じてください。
Sub TestRun()ダブルSomme = Run( "'Classeur1.xlsm'!Module2.Addition"、1234.56、654.32)ワークブック( "Classeur1.xlsm")のような薄暗いSomme End Sub MsgBox Somme End Sub