• ベストアンサー

引数で戻り値を取得するプログラム

以下のように、引数で戻り値を取得するプログラムを書きたいのですが どのように書けば正しいでしょうか? VB6とVB2005の両方の書き方を教えてください。 sub kekka(byval src as string, byref dst() as string) dim ret() as string ret(0) = "abc" ret(1) = "efg" kekka = ret end sub kekka("xxx", dat() ) msgbox(dat(0)) msgbox(dat(1))

  • hdkoa
  • お礼率0% (1/117)

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

  • ベストアンサー
  • Do_little
  • ベストアンサー率100% (3/3)
回答No.3

参考になれば、幸いです。 '****************************** ' Visual Basic 6.0のコード '****************************** Private Sub Form_Load()   Dim dat(1) As String      Call kekka("1", dat)   Call MsgBox(dat(0))   Call MsgBox(dat(1))   Call kekka("2", dat)   Call MsgBox(dat(0))   Call MsgBox(dat(1)) End Sub 'srcはByValで、変更不可です。 'dstは省略した記述で、ByRefで変更可能です。 'また、配列変数はByVal指定は出来ません。 Private Sub kekka(ByVal src As String, dst() As String)   Select Case src   Case "1"     dst(0) = "abc"     dst(1) = "efg"   Case "2"     dst(0) = "ABC"     dst(1) = "EFG"   End Select End Sub '****************************** ' Visual Basic 2005のコード '****************************** Public Class Form1   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     Dim dat(1) As String     Call kekka("1", dat)     Call MsgBox(dat(0))     Call MsgBox(dat(1))     Call kekka("2", dat)     Call MsgBox(dat(0))     Call MsgBox(dat(1))   End Sub 'srcはByValで、変更不可です。 'dstはByRefで、変更可能です。 'しかし、配列変数を引数に指定する場合、配列変数は参照型なので、 'ByValを指定しても、値の変更は可能です。   Private Sub kekka(ByVal src As String, ByRef dst As String())     Select Case src       Case "1"         dst(0) = "abc"         dst(1) = "efg"       Case "2"         dst(0) = "ABC"         dst(1) = "EFG"     End Select   End Sub End Class ・蛇足ですが、kekka関数の中で配列変数retを定義した場合の注意点です。   Private Function kekka(ByVal src As String, ByVal dst As String()) As String()     Dim ret(1) As String     ret(0) = "abc"     ret(1) = "efg"     dst = ret     '↑引数dstはkekka関数を抜けると、値を失います。     Return ret     '↑戻り値はkekka関数を抜けても、値を失いません。   End Function  

その他の回答 (2)

回答No.2

'一応参照渡し版と,戻り値バージョンを示すけど, '個人的には戻り値バージョンのほうが好きです。(ByValに保てる) '使うVBのバージョンに応じてコメントアウトなりして使ってね 'VBA/VB6(多分) '結局引数のsrcは使わなかったので必要ない。 Option Explicit Sub kekka(ByVal src As String, ByRef dst() As String) Dim ret() As String ReDim ret(2) ret(0) = "abc" ret(1) = "efg" dst = ret End Sub Function kekka2(ByVal src As String) As String() Dim ret() As String ReDim ret(2) ret(0) = "abc" ret(1) = "efg" kekka2 = ret End Function Sub main() Dim dat() As String Dim det() As String kekka "xxx", dat MsgBox (dat(0)) MsgBox (dat(1)) det = kekka2("xxx") MsgBox (det(0)) MsgBox (det(1)) End Sub 'VB.NET '相変わらずsrcが役に立ってない。 'ちょっと変わって見えると思うけど 'それは俺の嗜好で,C#と互換にしたいと思っているから。 '変数宣言と戻り値で書き方が違うようだったVBAと比べ素直になっているという印象を受けた '一応VB6側で俺がReDimを使っているのでResizeで対応したが '多次元配列の時の配列のサイズの変更方法は未だわからず。 'ちなみに俺は配列よりコレクションの方が手になじんでます Class Q3327706 Private dat As String() Private det As String() Public Sub Main() kekka("xxx", dat) MsgBox(dat(0)) MsgBox(dat(1)) det = kekka2("xxx") System.Windows.Forms.MessageBox.Show(det(0)) System.Windows.Forms.MessageBox.Show(det(1)) End Sub Private Sub kekka(ByVal src As String, ByRef dst As String()) Dim ret As String() = Nothing Array.Resize(ret, 2) ret(0) = "abc" ret(1) = "efg" dst = ret End Sub Private Function kekka2(ByVal src As String) As String() Dim ret As String() = Nothing Array.Resize(ret, 2) ret(0) = "abc" ret(1) = "efg" kekka2 = ret End Function End Class Class Q3327706Main Shared Sub Main() Dim hoge As New Q3327706 hoge.Main() End Sub End Class

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

戻り値が必要な場合は Sub では無く関数(Function)を使います。 ただし、戻り値として取得できるのは1つの値のみです。 byval /byref を使い分けているようなので、この辺の解決方法は理解されているかも知れませんが。。。 http://mieyasu.hp.infoseek.co.jp/mie/mago/m001.htm http://homepage1.nifty.com/rucio/main/shokyu/jugyou17.htm

関連するQ&A

  • スレッドで Byref の引数を渡したい場合

    VB2005 の初心者です。 スレッドに Byref の引数を渡すやり方が分かりません。 Byval だとエラーは出ないのですが、 Byref だとどうしてもエラーが消えません。 ソースは下記です。 Private CDF As clsCDF Public Class clsCDF Public LOOP1 As clsLoop1 Public LOOP2 As clsLoop2 End Class Protected Overrides Sub OnStart(ByVal args() As String) Thread = New Thread(AddressOf ABC) Thread.Start(CDF) End Sub Private Sub prvABC ( ByRef CDF As Object ) End Sub 何かヒントになることでも良いので、 皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • Functionで戻り値を複数返す方法

    Functionで戻り値を複数取得したいのですが うまくいきません。(NULLの使い方が不正ですとエラー) 戻り値に配列を使う場合 呼び出し側はどのように記述すればいいでしょうか? <呼び出し側> Private Sub a() wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー wkkekka2 = 処理結果(Kensu, Houhou)(1) wkkekka3 = 処理結果(Kensu, Houhou)(2) End Sub <関数> Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String) Dim kekka(3) As Double If lngKensu = 1000 and strHouhou = aaaaaa then kekka(0) =  0.1 kekka(1) =  2   kekka(2) =  300 Else ↓ (省略)     ↓ End If 処理結果 = kekka End Function

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • VB6で作成した自作DLLをVB.NETで呼び出し例外発生時に参照渡しの引数に値を設定する方法

    VB6で作成した自作のDLLをVB.NET2005で作成したEXEから呼び出した際に、DLLメソッドの正常・異常終了に関わらず第2引数の戻り値に第1引数の値を設定したいと考えていますが旨くいきません。 何かよい方法はないでしょうか? 以下、簡単なサンプルです。 =========================== VB6 DLL =========================== Public Sub getDataForTest(ByVal strIn As String, ByRef strOut As String) Dim intData As Integer 'strInの値をstrOutに代入 strOut = strIn 'strInの値を1で割り算 intData = CInt(strIn) / 1 End Sub =============================================================== =================== DLL呼び出し正常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("1", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← 1が表示される  End Try End Sub =============================================================== =================== DLL呼び出し異常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("A", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← この時にAを表示したいがstrRetが空  End Try End Sub ===============================================================

  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? 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

  • VB6で配列を引数にするときの2通りの方法について

    VB6で引数に配列を渡す方法が2通りあるよう?ですが以下のような配列があり、渡し方によって引数の定義の仕方が異なると思うのですが、(2)番目の関数の書き方が知りたいです。 dim ary_dat(10) as integer (1)test_A( ary_dat ) は、sub test_A( byref ary() as integer)という関数を作れば動作することはわかりましたが、 (2)test_B( ary_dat(0) ) は、関すでどのような引数を定義すればできるのでしょうか?

  • 引数(配列)について

    呼ぶ側: Sub main()  Call func(test(),test_id) end Sub 呼ばれる側:  Private Sub func(Byref test() as string, Byval test_id as long) と言う関係がある場合で 引数(1)test() の値がなく渡したくない場合は、どのように記述すればいいのでしょうか? 引数(2)test_id の値がなく渡したくない場合は、0を渡しています  また、呼ぶ側で test() を宣言し、tast()=""を代入すれば問題ないことは分かっているのですが、test()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

  • ExcelVBAで他のファイル(project)のプロシージャから配列の戻り値を取得したい

    自作アドインに、byref型で配列を引数にしたプロシージャを作り、別のファイルのプロシージャからそのアドインを呼び出して、アドインのプロシージャで配列に処理をして、その結果を呼び出し元のファイルのプロシージャで使用したいのですが、処理できないようです。 例えば、 アドイン側 myAddin.xla sub test(byref strAry() as string) strAry(0)="a":strary(1)="b" end sub 呼び出し元 sub execute() dim myAry() as string redim myAry(1) application.run macro:="myAddin.xla!test",arg1:=myAry() msgbox myAry(0) & "-" & myAry(1) end sub 上記のコーディングをしても、表示されるメッセージは "-" のみです。 アドインの処理はまったく反映されていません。 変数であればアドイン側をFunctionにして戻り値を取得できたのですが、配列ですとうまくいきません。 別のプロジェクトから、配列を返す方法はありませんか?

  • JAVA 引数の引数の取得について

    JAVA初心者です。的を得ていない書き込みをするかもしれませんが ご勘弁ください。今JUNITであるクラスのあるメソッド(MethodA)をチェックする テストプログラムを作成しております。 MethodA: public File MethodA(String name, File A) { int i = name.substring(0, i); String ret = name.substring(0, i + 1); return new File(A, ret); この場合に戻り値として返される引数の部分 「return new File(A, ret);」 の「A」と「ret」の値をJUNITで確認したいのですが、アイデアを 頂けますと大変幸いです。 また、戻り値の「return new File(A, ret);」に 「new」とついているのはなぜでしょうか?? 基本的な質問で大変申し訳ございませんが、よろしくお願いします。

    • ベストアンサー
    • Java
  • Excel VBA onTime関数のプロシージャ引数に、引数(変数)つきのプロシージャを呼び出す方法を教えてください。

    現在ExcelVBAで一定時間ごとにメッセージを出すツールを作成しています。 その際にonTime関数を使っていますが、その引数のひとつである呼び出すプロシージャに「引数(変数)つきのプロシージャ」を設定しようとしています。 サイトを探してみたところ、引数にシングルクオーテーションで囲むなど書いてあったのですが、変数を引数としたプロシージャを設定すると、「プロシージャが見つかりません」のエラーがでます。 どなたかお力を貸してくれませんでしょうか。 ちなみに僕のコードは以下の通りです。(簡略化) ------フォーム Private Sub cmbOk_Click() Call メッセージ実行(txtTime.Text, txtContent.Text) End Sub ------ThisWorkbook Private Sub メッセージ実行(ByVal time As String, ByVal content As String) Dim starttime As Double MsgBox time & "毎に" & vbCr & content & vbCr & "を表示します。", vbInformation Unload frmSet starttime = Now + CDbl(TimeValue(time)) Application.OnTime starttime, "'expressContent" & time & content & "'" End Sub ------標準モジュール Dim starttime2 As Double Sub expressContent(ByVal time2 As String, ByVal content2 As String) MsgBox "content2", vbInformation starttime2 = Now + CDbl(TimeValue(time2)) Application.OnTime starttime2, "'expressContent" & time & content & "'" End Sub よろしくお願い致します。

専門家に質問してみよう