以下のコードをご覧ください
変数について
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
最近、いつ泣きましたか?
泣いてストレス発散! なんて言いますよね。 あなたは最近いつ、どんなシチュエーションで泣きましたか?
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
考えた式の戻り値が期待通りにならない
Excel(エクセル)
-
エクセル 入力があった場合のみ隣の関数を表示
Excel(エクセル)
-
数字入力後他の文字等が表示される方法について
Excel(エクセル)
-
-
4
(マクロ)値を返す時は subでもfunctionでもどちらでも良いのでしょうか?
Excel(エクセル)
-
5
【マクロ】functionプロシージャの、変数について
Excel(エクセル)
-
6
Excelの時刻の不思議
Excel(エクセル)
-
7
【マクロ】Ifとwith ステートメントにて分からない部分があります
Excel(エクセル)
-
8
エクセル IF計算式?でしょうか?
Excel(エクセル)
-
9
Excelでの勤怠表の関数を教えてください
Excel(エクセル)
-
10
大容量があつかえるソフトを探しています
Excel(エクセル)
-
11
【関数】スペースがいくつ入った後の文字列を取り出したい
Excel(エクセル)
-
12
エクセルを使っていて2024/5/15と入力したのに令和元年とかででるのでしょうか?何か設定分かる方
Excel(エクセル)
-
13
エクセルの計算
Excel(エクセル)
-
14
【マクロ】ファイル名の変更について
Excel(エクセル)
-
15
CSVファイルについて質問です。
Excel(エクセル)
-
16
特定の文字列を含む、住所を抽出する
Excel(エクセル)
-
17
エクセルでCtrl+Tでテーブルの作成ができますが、これがピボットテーブルですか?
Excel(エクセル)
-
18
【マクロ】アクティブセルにブックやシートを指定する方法
Excel(エクセル)
-
19
【マクロ】2回実行したら、エラーにならずに、既に実行済みメッセージを出したい
Excel(エクセル)
-
20
エクセルのクイックアクセスツールバーには何を登録したら良いですか?罫線を引く「格子・枠なし・外枠」と
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの区切り文字について質問...
-
エクセルマクロについて教えて...
-
45490がどうして
-
エクセルの数式バーのフォント...
-
Excelの警告について
-
エクセルの2つの表の値を照合す...
-
【マクロ】callステートメント...
-
【VBA】使ってたクエリの接続を...
-
【Excel VBA】 テキストファイ...
-
8:40までの出勤は全て8:30に...
-
Excelで<a>,<b>の入ったセルをc...
-
エクセル VBA 参照設定とイ...
-
excelVBAについて。
-
excelファイルの内容検索
-
Excelファイルのすべての更新日...
-
EXCELの散布図で日付が1900年に...
-
大容量があつかえるソフトを探...
-
【再投稿】レイアウトが異なる...
-
エクセルの計算式について(COU...
-
エクセルにて時間帯にて自動で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
エクセルデーターから必要な項...
-
エクセルでファイルの最終更新...
-
複数のテキストファイルをexcel...
-
Excelの複数条件の関数
-
【マクロ】ファイル名の一括変...
-
EXCELの散布図で日付が1900年に...
-
マクロの処理が遅くなった
-
Excelの時刻の不思議
-
エクセルでの2項目比較および...
-
Excelマクロで空白セルを詰めて...
-
エクセルの数式バーのフォント...
-
ExcelでASCを使って全角を半角...
-
エクセルで80万行、50列位のデ...
-
今まで文字化けなく開けていたc...
-
エクセルのことで教えてくださ...
-
エクセルVBA 月の中で、月~土...
-
Excelでの表の作り方
-
Excel セルにおけるフォント設...
-
エクセルの質問です。 F列からL...
おすすめ情報