プロが教えるわが家の防犯対策術!

以下のように、引数で戻り値を取得するプログラムを書きたいのですが
どのように書けば正しいでしょうか?
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))

A 回答 (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
 
    • good
    • 0

'一応参照渡し版と,戻り値バージョンを示すけど,


'個人的には戻り値バージョンのほうが好きです。(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
    • good
    • 0

戻り値が必要な場合は Sub では無く関数(Function)を使います。


ただし、戻り値として取得できるのは1つの値のみです。
byval /byref を使い分けているようなので、この辺の解決方法は理解されているかも知れませんが。。。

http://mieyasu.hp.infoseek.co.jp/mie/mago/m001.htm
http://homepage1.nifty.com/rucio/main/shokyu/jug …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!