- ベストアンサー
引数で戻り値を取得するプログラム
以下のように、引数で戻り値を取得するプログラムを書きたいのですが どのように書けば正しいでしょうか? 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))
- みんなの回答 (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)
- himajin100000
- ベストアンサー率54% (1660/3060)
'一応参照渡し版と,戻り値バージョンを示すけど, '個人的には戻り値バージョンのほうが好きです。(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)
戻り値が必要な場合は Sub では無く関数(Function)を使います。 ただし、戻り値として取得できるのは1つの値のみです。 byval /byref を使い分けているようなので、この辺の解決方法は理解されているかも知れませんが。。。 http://mieyasu.hp.infoseek.co.jp/mie/mago/m001.htm http://homepage1.nifty.com/rucio/main/shokyu/jugyou17.htm