
以下のコードをご覧ください
変数について
aに1が入ります
その後、function sansyouに変数 a=1 が渡され bに1が入ります
ここの流れがわかりません。変数aに1が入っているのに、なぜ、b という違う
変数に 1を渡せるのでしょうか? 同じ 文字列の変数a なら渡せる意味が
分かります
ご存じの方、教えて下さい
(コード)
Sub 参照渡し()
Dim a As Long
a = 1
Call sansyou(a)
MsgBox a
End Sub
Function sansyou(ByRef b As Long)
b = b * 2
End Function
No.3ベストアンサー
- 回答日時:
多くのプログラミング言語には、変数名等の有効な範囲というものがあります。
詳しくは「グローバル変数」「ローカル変数」「スコープ」といったキーワードで検索。
VBAの場合、sub 〜() から End Subまでや、Function 〜()からEnd Functionの中でDimで宣言した変数やByRefやByValで指定した引数用の変数等は、そのEnd〜までの中だけで有効です。
有効範囲外のものを使うことはできません。
今回のプログラムだと、変数aは Sub 参照渡し()からEnd Subの中で宣言されているので、有効範囲はその中だけです。
同様に引数bはFunction sansyou〜End Functionの中だけで有効です。
このため、sanyou関数の中から 「sub 参照渡しの中の変数a」を直接操作することはできません。
このことからも「同じ 文字列の変数a なら渡せる意味が分かります」というのが間違った考えだと言えます。
なお、VBAの場合、「Option Explicit」を指定しないときは、未使用の変数を使おうとするとDimで宣言されたと見做されます。
このため、一見エラーが無く動いたように見えて、全然違う動きをしてしまうことがあります。
Function sansyou(ByRef b As Long)
a = a * 2
End Function
で、Sub 参照渡し()のaを操作しているつもりでいても、
実際には
Function sansyou(ByRef b As Long)
Dim a As Variant
a = a * 2
End Function
と同じになっています。
No.2
- 回答日時:
最初に。
MsgBoxは関数です。
https://learn.microsoft.com/ja-jp/office/vba/lan …
これによれば、最初ほ引数名は「prompt」です。
「変数aに1が入っているのに、なぜ、b という違う変数に1を渡せるのでしょうか? 同じ 文字列の変数a なら渡せる意味が分かります」
という考えだと、
MsgBox a
は
「変数aに1が入っているのに、なぜ、prompt という違う変数に1を渡せるのでしょうか? 同じ 文字列の変数a なら渡せる意味が分かります」
ということになります。
関数の仮引数というのは、呼び出し側で別々で指定されるものを、関数内で同じ名前で処理するための仕組みです。
MsgBox a だったら 仮引数prompt に 実引数a を渡した状態で MsgBoxを実行する
MsgBox "こんにちは" だったら 仮引数prompt に 実引数"こんにちは" を渡した状態で MsgBoxを実行する
Call sansyou(a) でも同様に、仮引数bに 実引数として a を渡した状態で sansyou関数を実行する、ということです。
その上で、値渡しと参照渡しとで動作が違います。
○値渡し:
Function sansyou(ByVal b As Long) としたき
・仮引数b は「 Longの値」を覚える変数になります。
・Call sansyou(a) で渡されるのは「aの値、つまり『1』」が渡されます。
仮引数b は 「値1」を受け取り記憶します。
・b = b * 2 で 「変数bの値である1」を2倍して「変数b」に記憶します。
・関数内の変数であるbと、関数外の変数aとの関係は無いので、実行後も変数aは1のままです。
○参照渡し:
Function sansyou(ByRef b As Long) としたき
・仮引数b は 「Long型変数への参照」を覚える変数になります。
このとき、bの値を読むときは「参照している変数の値」を読み出し、書き込むときは「参照している変数」へ書き込もうとします。
・Call sansyou(a) で渡されるのは「変数aそのもの(への参照)」が渡されます。
仮引数b は 「変数aそのもの(への参照)」」を受け取り記憶します。
・b = b * 2 で 「『変数bが参照している変数aの値』である1」を2倍して「変数bが参照している変数a」に記憶します。
これにより、実行後は変数aは2に変化します。
解説ありがとうございます。少しずつ理解できました
○値渡しについてなのですが
・関数内の変数であるbと、関数外の変数aとの関係は無いので、実行後も変数aは1のままです
ここでいう、関数内と関数外とは具体的に、何と何のことを
いっているのですようか?ご教授いただければと思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Excel(エクセル) 【マクロ】VLOOKUPにて参照元にデータが無い場合【該当なし】と表示したい 3 2024/06/08 16:45
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) 【マクロ】Fon nextステートメントによる変数への数値格納、2回以上について 3 2024/08/10 20:00
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) WORD VBA プログラム修正をお願いします。 2 2024/04/25 23:43
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル 入力があった場合のみ隣の関数を表示
Excel(エクセル)
-
(マクロ)値を返す時は subでもfunctionでもどちらでも良いのでしょうか?
Excel(エクセル)
-
Excelの時刻の不思議
Excel(エクセル)
-
-
4
考えた式の戻り値が期待通りにならない
Excel(エクセル)
-
5
Excelの計算が合いません。 諸事情で会計の簡素な購入・販売諸元表を作っているのですが、一つの項目
Excel(エクセル)
-
6
Excelでの勤怠表の関数を教えてください
Excel(エクセル)
-
7
大容量があつかえるソフトを探しています
Excel(エクセル)
-
8
excelVBAについて。
Excel(エクセル)
-
9
ExcelでASCを使って全角を半角にするとカタカナも半角になってしまいます。
Excel(エクセル)
-
10
if関数。半角文字や全角文字で分ける事ができますか?
Excel(エクセル)
-
11
Excelの区切り文字について質問です。 Excel機能にある、区切り文字を使う時に区切ったあとの書
Excel(エクセル)
-
12
Excelでの文字色
Excel(エクセル)
-
13
今まで文字化けなく開けていたcsvファイルが、文字化けするようになりました。 解決策を教えて頂きたい
Excel(エクセル)
-
14
【Excel】効率的な関数式の組み方について
Excel(エクセル)
-
15
【ExcelVBA】5万行以上のデータ比較の効率的な処理方法について
Visual Basic(VBA)
-
16
45490がどうして
Excel(エクセル)
-
17
エクセルを使ってQRコードを作成したい。
Excel(エクセル)
-
18
Excel 標準フォントについて教えてください
Excel(エクセル)
-
19
excelVBAについて。
Excel(エクセル)
-
20
8:40までの出勤は全て8:30にする関数を教えて下さい!!
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセルのVBAで集計をしたい
-
【関数】同じ関数なのに、エラ...
-
Office2021のエクセルで米国株...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
エクセルのdatedif関数を使って...
-
【画像あり】オートフィルター...
-
【マクロ】アクティブセルの時...
-
【マクロ】列を折りたたみ非表...
-
他のシートの検索
-
【マクロ】3行に上から下に並...
-
【条件付き書式】シートの中で...
-
ページが変なふうに切れる
-
【マクロ】実行時エラー '424':...
-
9月17日でサービス終了らし...
-
エクセル ドロップダウンリスト...
-
【マクロ】オートフィルターの...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】【相談】Excelブック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報