- ベストアンサー
VBAについての質問
- VBAに関する質問があります。
- 質問1:x=aという式がないのにxに値が代入される理由は?
- 質問2:なぜMsgBox Ketugou(a)ではaaa(aaa)とならないのか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>Function Ketugou(x As String) > Ketugou = x >End Function 関数内だけ別ルールと考えた方がいいでしょう。 Ketugou は関数なので基本的に代入は不可です。 Sub Exsample() Dim a As String a = "aaa" Ketugou(a) = "bbb" '実行時エラー424 オブジェクトが必要です。 Ketugou = "ccc" 'コンパイルエラー 引数は省略できません End Sub ただし、自分の関数内でのみ、関数名と同じ変数を戻り値として 使えます。 また、関数内で宣言された変数は、関数内でのみ有効です。 Sub Exsample() ┓ Dim a As String ┃ a = "aaa" ┃Dim a As Stringの有効範囲 MsgBox Ketugou(a) ┃ End Sub ┛ ↑ 「関数 Ketugou に1つの引数がある」という結びつけがされる ↓ Function Ketugou(x As String) ┓ Ketugou = x ┃x As Stringの有効範囲 End Function ┛ '--------------------------------------------------- Sub Exsample() Dim a As String x = "ccc"’Ketugou(x As String)の x とは別の変数が用意される a = "aaa" MsgBox Ketugou(a) MsgBox x 'ccc が表示される End Sub Function Ketugou(x As String) 'Dim a As Stringのaとは別 Ketugou = x End Function '--------------------------------------------------- Sub Exsample() Dim a As String a = "aaa" MsgBox Ketugou(a & "bbb") 'aaabbbccc が表示される End Sub Function Ketugou(a As String) 'Dim a As Stringのaとは別 Ketugou = a & "ccc" End Function
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
関数定義側で引数をa,b,cとしてFunction F(a,b,c)と定義すると、使う側では、引数の変数のデータ性格・型、個数(Optionalというのがあってややこしいが)、位置(,,などで指定しないときは飛ばすことあり)などを、a、b、cとあわせれば、使うときh=F(x,y,z)と使っても良いというのは、ほぼどの言語でも常識だ。 「名前つき引数」というのもある言語有り(ごおgぇ出でも照会)。 基礎的なことを勉強してない、それだけのことだろう。
お礼
ありがとうございました。
- tohru999
- ベストアンサー率49% (76/154)
No.3です。 ちょっと補足? Function Ketugou(x As String) は Function Ketugou(x As String) As String と書いた方が良いですよ。 (日本語で書くと「文字列型を戻り値として返す」と宣言)
お礼
そうします。再度ありがとうございました。
- tohru999
- ベストアンサー率49% (76/154)
【質問1】 MsgBox Ketugou(a) が実行された時 Ketugouの引数に、"aaa" が渡されます。 で、Ketugouでは、変数 x で受け取るとなってますので、 x に "aaa" が代入されます。 【質問2】 質問の意味がよくわかりません。 aaaのaaa次元個列? aaa関数の引数にaaaを渡す? 処理の順番を書くと 変数aに文字列"aaa"を代入 Ketugou関数に、変数aを渡す("aaa"が入っている) Ketugou関数では、変数xとして、その文字列("aaa")を受け取る Ketugou関数の戻り値として、xを返す("aaa"を返す) MsgBoxで、Ketugou関数の戻り値を表示 となりますが、どこがわからないのでしょうか?
お礼
ありがとうございました。
- bajutsu
- ベストアンサー率20% (139/693)
基本的に”関数”ってのが何か分かっていないのかと。 【質問1】 Ketugou()は、関数であり、 Function Ketugou(x As String) と定義されています。 カッコの中は、文字列型の引数を 「x という名前で受け取る」 という定義です。 関数を呼び出すときは、Ketugou(a)と書いてあり、 a という文字列を関数に渡しています。 関数本体は、この a として渡されたものを、x という名前で受け取り、 x という名前で使います。 【質問2】 "Ketugou"は、関数名であって変数名ではありません。 "Ketugou(a)"までで、一つの関数呼び出しで、 この場合 "aaa" という文字列を返します。
お礼
ありがとうございました。
Function Ketugou(x As String) Ketugou = x End Function は、Ketugou(x)と関数を書いた時に戻り値がxになる関数です。 関数の最後に「関数名=何か」とすると、「何か」が関数の戻り値になります。つまりこの場合Ketugou(x)とxは何も変わりません。 ところでこれ、名前の割に何も結合してませんがいいんでしょうか?(笑) ということで、正直質問1も2も何を言ってるのかわからないですが以下推測で。 回答1 x=aという式はこのプログラム中に介入する余地はありません。 Ketugou(a) の時点で、aを引数に関数Ketugouを呼び出しています。つまりKetugouの内部のxの値はaと同じになります。 なので、x=aなんてのは要らない。 回答2 Ketugouの「値」が"aaa"なのであって関数名であるKetugouが変化するわけありません。Ketugou= "aaa"じゃなく、Ketugou("aaa") = "aaa"です。 Ketugou(a)はKetugou("aaa")であり、Ketugou(x As String)の戻り値はxですから、Ketugou(a) = "aaa"です。 質問文の関数は中で何もしていないから意味が分からないんだと思われます。 たとえば Function Triple(x As Integer) Triple = x * 3 End Function これならわかるんじゃないですか? a = 4 MsgBox Triple(a) としたとき、「12」が表示されるのは分かりますよね? 繰り返しますが、関数の中での「関数名=何か」は関数名の書き換えなんて変なことはしません。最終的に関数が返す値の指定です。
お礼
ありがとうございました。
お礼
ありがとうございました。