• ベストアンサー

VBSの関数で複数の値を返したい

関数から2つの値を返したいと思っています。 ByRefで以下のようにすれば変数STRの内容を書き換えられると思ったのですが、エラーにはならないものの値は変わらないようです。 このような使い方はできないのでしょうか? STR = "STR" TEST(STR) Msgbox STR Sub TEST(ByRef STR) STR = "TEST" End Sub

  • K6A
  • お礼率77% (101/131)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.4

リファレンスのcallのところを参照してください。 call を省略した場合は、引数全体を囲む括弧も省略する必要があります。 TEST(STR) と書いたため、引数は STR という変数でなく、括弧に囲まれた (STR)という 式 と結びついたため、STR は変更されません。 まあ、実行時に「ByRefの引数に式を渡した」というエラーが出てしかるべきだとは思いますが。 ということで、 TEST STR CALL TEST(STR) のいずれかに修正。

K6A
質問者

お礼

> STR という変数でなく、括弧に囲まれた (STR)という 式 と結びついたため、STR は変更されません。 ほかの方の回答も参考にいろいろ試してみたのですが、VBSって文法にだいぶ癖があるみたいですね。 VBともまた感じが違うようなので今後はリファレンスの内容をしっかり確認しながら作成したいと思います。 回答ありがとうございました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 TEST(STR)  ↓ TEST STR で、括弧をつけなければ、ByRef をつけなくても、参照渡しになると思います。

K6A
質問者

お礼

> 括弧をつけなければ、ByRef をつけなくても、参照渡しになると思います。 これは・・・! たしかにByRef要らないですね。 参考になります、回答ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Call TEST(STR) として下さい

K6A
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

  • asobe
  • ベストアンサー率76% (10/13)
回答No.1

単純に Call がないからだと思います。 STR = "STR" 'TEST(STR) Call TEST(STR) '←ここ Msgbox STR Sub TEST(ByRef STR) STR = "TEST" End Sub

K6A
質問者

お礼

一番の回答ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • この例は「何渡し」と言うのでしょうか?

    Sub test1() Call test2("aaa") End Sub Sub test2(str As String) MsgBox str End Sub ByRefもByValも使ってないから 参照渡しでも値渡しでもないですよね?

  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? VB.net2005を使っているのですが 関数の引数に変数をセットして、別関数で 引数に対してデータをセットすることは可能でしょうか? C言語でいうところのポインタを引数に渡し ポインタアドレスに書き込むような処理はVB.netでは 可能なんでしょうか? 下記のような事は試したのですが、うまく出来ませんでした(。。; public sub test1() dim mojiretu as string test2( mojiretu ) msgbox(mojiretu) end sub public sub test2( str as string) str = "文字列" end sub

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • Replace関数について

    Sub macro1() Dim str As String str = "abc" str = Replace(str, "c", "a") MsgBox str End Sub このマクロを実行した時に、問題なく動くのですが なぜReplaceは関数なのに、 WorksheetFunction.がいらないのでしょうか? しかも Sub macro2() Dim str As String str = "abc" str = WorksheetFunction.Replace(str, "c", "a") MsgBox str End Sub にすると、エラーになります。 macro1のReplaceは、関数ではないのでしょうか? メソッドやステートメントですか?

  • これは参照渡し・値渡ししてる事になりますか?

    Dim a As String Sub マクロ1() a = "test" Call マクロ2 a = Empty End Sub Sub マクロ2() MsgBox a End Sub これは参照渡し・値渡ししてる事になりますか? ByRefやByValを使わない限り、 参照渡しまたは値渡ししてるとは言えないのでしょうか? ご回答よろしくお願いします。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • 一番大きな値を返す

    はじめまして。ExcelVBAで「一番大きな値を持つ変数名を返す」として質問致します。 タイトルは「…値を返す」としましたが、実は「…値を持つ変数名を返す」なのです。以下に要点を記します。 例えば… Sub mySub() Dim my1,my2,my3,myMax '全てInteger型です。 my1=1 my2=2 my3=3 myMax=Application.WorksheetFunction.Max(my1,my2,my3) MsgBox=myMax End Sub 上の記述ですと、MsgBox に渡される値は my3 に格納されている 3 となりますが、Max値である 3 の値が格納されている変数名my3 を MsgBox に表示させるためには、どのような考え方があるでしょうか? If や Select Case などでコツコツと条件分岐をさせて導き出すしか方法はありませんか? コードが短くなるように何らかの関数を用いる手法があれば嬉しいのですが…ご教示の程、よろしくお願い致します。

  • グローバル変数などについて

    Option Explicit Dim str1 As String '・・・(1) Sub テスト() Dim str2 As String '・・・(2) str1 = "テスト1" str2 = "テスト2" MsgBox str1 MsgBox str2 End Sub (1)はグローバル変数と言うとの事ですが (2)は何変数と言うのでしょうか? ローカル変数ですか? また、(1)がdimではなく、 Public str1 As String となった場合でも、 プロシージャーの外にあれば、グローバル変数と言うのでしょうか?

  • vbs Debug.Print にかわるものは?

    vbsではDebug.Printは使えないようですが、 変数に入ってる値を確認するにはmsgboxしかないのでしょうか? str="aaaa" msgbox str Debug.Print str これで、strに入ってる値をmsgboxでは確認できますが、 Debug.Printでは確認できません。 変数に入ってる値を目で確認しつつ、コピペできる状態にしたいのですが、 どうすればいいでしょうか? 新規にテキストファイルを作成そこに変数の値を書き込むコードをつくるしかないでしょうか? 長くなりそうですが。

  • 同じ関数名やメソッド名は変数に使わない方が良い?

    例えば、Strと言うのは、オブジェクトブラウザで確認すると VBA.Conversion のメンバ にありますが、この場合、 Sub test() Dim Str As String Str = "test" MsgBox Str End Sub のようなコードは作らない方が良いのでしょうか? エラーになったり何か不都合が発生しますか?

専門家に質問してみよう