これは、VBAインタビューで最もよく聞かれる質問の1つです。この記事では、ExcelVBAのByVal引数とByRef引数の違いを学習します。

定義:

ByRef引数:これは、参照による文字通りの短縮形です。引数がByRef引数として別のサブまたは関数に渡されると、実際の変数の参照が送信されます。変数のコピーに加えられた変更は、元の引数に反映されます。

値の代わりに、値の場所が関数へのByRefを使用して関数に送信されると言えます。

これはVBAのデフォルトの引数です。引数の前にByRefを記述する必要はありません。

構文:

Sub x(a as Variant)

‘またはSub x(ByRef a as Variant)

ByVal引数:これは、値による文字通りの短い形式です。引数がByVal引数として別のサブまたは関数に渡されると、引数の値のみが送信されます。元の引数はそのまま残されます。外部関数またはサブで行われた変更は、元の引数に反映されません。

引数をByValとして宣言するには、引数の前にByValキーワードを使用する必要があります。

構文:

Sub x(ByVal a as Variant)

これで定義がわかりました。例を見て、それを乗り越えましょう。

ByRefの例これは簡単なプログラムです。

Sub X(ByRef a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

したがって、ここには2つのサブルーチンがあります。最初のサブはXで、ByRefとしてバリアント引数を取ります。 (ByRefキーワードは省略できます。これがデフォルトです。)

次に、a = 20 endの値を設定し、aの値を出力します。

サブYは、サブルーチンXを呼び出すメインサブルーチンです。これは、a = 10の値を設定してから、サブルーチンXを呼び出し、引数としてaを渡します。

次に、Yのaの値を出力します。

Sub Yを実行すると、これが出力になります。

a = 20のサブX値でa = 20のサブY値で

0046

結論:元のaの値はサブXによって変更され、両方のサブで20に設定されます。 Sub Yを実行すると、aの初期値は10であることがわかります。YはX(a)を呼び出します。 Xはa = 20の値を設定します。 「a = 20のサブX値で」を出力します。

コントロールはyに戻り、a = 20のサブY値で出力します。

これはByRef引数の効果です。

ByValの例:

これはByValの例です

Sub X(ByVal a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

どちらの例も同じですが、引数の受け渡しが異なります。

ここXでは、引数はByValとして宣言されています。今回Yサブルーチンを実行すると、出力は次のようになります。

a = 20のサブX値a = 10のサブY値

0047

結論:元のaの値はサブXによって変更されません。Xの場合は20、Yの場合は10です。Yがaを使用してXを呼び出すと、aのアドレスではなくaの値のみが送信されます。

したがって、aで行われた変更は、元の変数には反映されません。

テストでは、20に設定する前にXのaの値を出力すると、10が出力されます。byValを使用してXのaに10が渡されるためです。 ByRefを使用して、YのaをXのaに送信しました。

0048

これは簡単な質問ですが、vbaインタビューの質問で、私たちの多くはこれを混乱させます。その理由は、あまり使用できないからです。ほとんどの場合、値を別の変数にコピーします。*そうですね、これがExcelVBAのbwByRef引数とByVal引数の違いです。このトピックまたは他のVBAまたはExcelのトピックについて疑問がある場合は、お知らせください。コメントセクションはすべてあなたのものです。

関連記事:

link:/ files-workbook-and-worksheets-in-vba-delete-sheets-without-confirmation-prompts-using-vba-in-microsoft-excel [MicrosoftExcelのVBAを使用して確認プロンプトなしでシートを削除する]

link:/ files-workbook-and-worksheets-in-vba-add-and-save-new-workbook-using-vba-in-microsoft-excel [Microsoft Excel2016でVBAを使用して新しいブックを追加および保存する]

link:/ menus-toolbars-status-bar-in-vba-display-a-message-on-the-statusbar-using-vba-in-microsoft-excel [ExcelのVBAステータスバーにメッセージを表示する]

link:/ general-topics-in-vba-turn-off-warning-messages-using-vba-in-microsoft-excel [Microsoft Excel2016でVBAを使用して警告メッセージをオフにする]

人気の記事:

link:/ forms-and-functions-introduction-of-vlookup-function [ExcelのVLOOKUP関数]

link:/ Tips-countif-in-microsoft-excel [COUNTIF in Excel 2016]

link:/ excel-formula-and-function-excel-sumif-function [ExcelでSUMIF関数を使用する方法]