VBAについての質問

このQ&Aのポイント
  • VBAに関する質問があります。
  • 質問1:x=aという式がないのにxに値が代入される理由は?
  • 質問2:なぜMsgBox Ketugou(a)ではaaa(aaa)とならないのか?
回答を見る
  • ベストアンサー

VBAについて質問させて下さい。

VBAについて質問させて下さい。 Sub Exsample() Dim a As String a = "aaa" MsgBox Ketugou(a) End Sub Function Ketugou(x As String) Ketugou = x End Function このサンプルコードについて質問が2つあります。 【質問1】 なぜ x=a、 と言う式はないのに xにが代入されるのでしょうか? 【質問2】 なぜ MsgBox Ketugou(a) では aaa(aaa) とならないのでしょうか? a = "aaa" Ketugou= "aaa" になってるはずですが。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.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

eurytdd
質問者

お礼

ありがとうございました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

関数定義側で引数をa,b,cとしてFunction F(a,b,c)と定義すると、使う側では、引数の変数のデータ性格・型、個数(Optionalというのがあってややこしいが)、位置(,,などで指定しないときは飛ばすことあり)などを、a、b、cとあわせれば、使うときh=F(x,y,z)と使っても良いというのは、ほぼどの言語でも常識だ。 「名前つき引数」というのもある言語有り(ごおgぇ出でも照会)。 基礎的なことを勉強してない、それだけのことだろう。

eurytdd
質問者

お礼

ありがとうございました。

  • tohru999
  • ベストアンサー率49% (76/154)
回答No.4

No.3です。 ちょっと補足? Function Ketugou(x As String) は Function Ketugou(x As String) As String と書いた方が良いですよ。 (日本語で書くと「文字列型を戻り値として返す」と宣言)

eurytdd
質問者

お礼

そうします。再度ありがとうございました。

  • tohru999
  • ベストアンサー率49% (76/154)
回答No.3

【質問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関数の戻り値を表示 となりますが、どこがわからないのでしょうか?

eurytdd
質問者

お礼

ありがとうございました。

  • bajutsu
  • ベストアンサー率20% (139/693)
回答No.2

基本的に”関数”ってのが何か分かっていないのかと。 【質問1】 Ketugou()は、関数であり、 Function Ketugou(x As String) と定義されています。 カッコの中は、文字列型の引数を 「x という名前で受け取る」 という定義です。 関数を呼び出すときは、Ketugou(a)と書いてあり、 a という文字列を関数に渡しています。 関数本体は、この a として渡されたものを、x という名前で受け取り、 x という名前で使います。 【質問2】 "Ketugou"は、関数名であって変数名ではありません。 "Ketugou(a)"までで、一つの関数呼び出しで、 この場合 "aaa" という文字列を返します。

eurytdd
質問者

お礼

ありがとうございました。

noname#158634
noname#158634
回答No.1

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」が表示されるのは分かりますよね? 繰り返しますが、関数の中での「関数名=何か」は関数名の書き換えなんて変なことはしません。最終的に関数が返す値の指定です。

eurytdd
質問者

お礼

ありがとうございました。

関連するQ&A

  • VBAでワイルドカードを使った文字列検索

    初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub

  • 【1】と【2】のvbaは同じ意味ですか?

    【1】 Option Explicit Sub test1() Call test2("aaa") End Sub Sub test2(MyStr As String) MsgBox MyStr End Sub 【2】 Option Explicit Dim MyStr As String Sub test1() MyStr = "aaa" Call test2 End Sub Sub test2() MsgBox MyStr End Sub 結果は同じですが、中身が違います。 今後コードを作っていく上で どちらの方式の方が良いのでしょうか?

  • Optional について

    エクセルのvbaエキスパートのスタンダードの問題でわからないのがあります。 Sub M_Proc ()  Dim a As Long  a = F_Proc(3)  MsgBox a End Sub Function F_Proc(Optional x As Long = 5) As Long  F_Proc = x * 2 End Function というコードで 質問1  Optional はどういう意味でしょうか? 質問2 Optional x As Long = 5 となっているのに xには3が代入されています。 この5は意味がないのでしょうか? よろしくお願いします。

  • vb.net変数に入れた文字列でメソッドを実行する

    こんにちわ!! Vb.netで文字列を格納した変数を使ってメソッドを呼び出したいのですが、可能でしょうか? サンプル 'メインルーチン public sub test() Dim aaa as string ="testfunction" Dim num as integer=0 '↓の様にメソッドを呼び出したい Dim bbb = aaa(num) Msgbox(bbb ,vbinformation) aaa="testfunction2" bbb=aaa(num) Msgbox(bbb,vbinformation) Endsub 'メソッド1 Private function testfunction1(num) Return num+1 End function 'メソッド2 Private function testfunction2(num) Return num+2 End function 上記はあくまでサンプルです。 実際はメソッド数が多く、aaaにいれる名前も別で取得するので、stringになります。 ですので、bbb=aaaはforで回します。 このようなことは可能でしょうか? やりかたもしくは解決方法があればお願いします。

  • 二つの違い・どちらを使った方がいいでしょうか?

    Sub test1() Dim a As String a = MsgBox("aaa") End Sub Sub test2() MsgBox "aaa" End Sub どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。

  • 参照渡し(ByRef)

    参照渡しについてわからないのですが Option Explicit Dim buf As String Sub Sample1() buf = "aaa" Call Sample2("bbb") MsgBox buf End Sub Sub Sample2(ByRef a As String) a = "ccc" End Sub を実行すると、msgboxには、aaaが表示されますが、 途中のbbb,cccはどんな意味があるのでしょうか? また、 Sub Sample2(ByRef a As String) を Sub Sample2(a As String) にしてもコードは問題なく動きますが、 ByRefは役に立ってるのですか?

  • FORMAT関数で値が変わる

    こんにちは、 Win98でExcel2000のVBAを使用してマクロを組んでいるのですが、FORMAT関数を使っている部分で予想外の結果がでています。 以下、プログラムです。 Private Sub Test() Dim AAA as String AAA = "6P" AAA = FORMAT(AAA,"000") MsgBox AAA End Sub MsgBoxの表示が"06P"になるはずだと思っていたのですが、 なぜが"001"になってしまいます。 他の質問などを見てみると"E"や"D"などでも表示が変わるというものを見ました。"P"も同じようなものなのでしょうか、また"06P"と表示させるにはどうしたらよいでしょうか? どなたかご存知の方がいらっしゃったっらご回答お願い致します。

  • VBA 関数(Function) カッコの後のデータ型は必要?

    Function あ() あ = "あああ" End Function Sub test3() MsgBox あ End Sub と、 Function あ() As String あ = "あああ" End Function Sub test3() MsgBox あ End Sub は同じ動作をするのですがやはり「As String」をつけたほうがいいのですか? ウォッチウインドウで確認すると 「As String」がないほうは「Variant/ String」型ですが あるほうは「String」型のみです。

  • VBA 加算演算時のトラブル

    事務処理用に準備したVBA処理の数値合計チェックにて本来イコールとなるべきところ、ノットイコールと判定されてしまいます。当該部分を抜き出し、わかりやすくしたものが下記のロジックですが、ここで、test2,test4は結果がイコールとなるものの、test3の場合、ノットイコールとなってしまいます。どなたか、原因につき教えていただけませんか? Dim aaa As Double Dim bbb As Double sub test2() bbb = 16.67 + 16.67 aaa = 33.34 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = 16.67 + 16.67 + 16.67 aaa = 50.01 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = 16.67 + 16.67 + 16.67 + 16.67 aaa = 66.68 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End sub

  • Const に dim は使えない?

    標準モジュールに ''''''''''''''''''''''''''''''''''''''''''' Dim Const moji As String = "a" Sub test1() MsgBox moji End Sub Sub test2() Dim Const moji As String = "a" MsgBox moji End Sub ''''''''''''''''''''''''''''''''''''''''''' とするとエラーになりますが ''''''''''''''''''''''''''''''''''''''''''' Public Const moji As String = "a" Sub test3() MsgBox moji End Sub ''''''''''''''''''''''''''''''''''''''''''' なら大丈夫です。 Const に対してdimは使えないのでしょうか?

専門家に質問してみよう