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
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
No.1
- 回答日時:
戻り値が必要な場合は Sub では無く関数(Function)を使います。
ただし、戻り値として取得できるのは1つの値のみです。
byval /byref を使い分けているようなので、この辺の解決方法は理解されているかも知れませんが。。。
http://mieyasu.hp.infoseek.co.jp/mie/mago/m001.htm
http://homepage1.nifty.com/rucio/main/shokyu/jug …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAでsub,dimは何の略?
-
三項でたとえば交換って
-
C#のループでtextboxに値を入れ...
-
C言語のサフィックスについて
-
VBAでcallで呼び出したsubを終...
-
[Excel2000]auto_closeを止めさ...
-
sublimit textっていうエディタ...
-
C言語のOpenGLで複数のテクスチ...
-
演奏記号の・・・・
-
256色で任意の色を作成する時、...
-
VB.NETでのイベントの途中終了
-
コンボボックスからテキストボ...
-
エクセルVBAでテキストボッ...
-
再帰呼び出し
-
他のフォームから別のフォーム...
-
GetNextWindowがDLLファイルUse...
-
【VB.NET】テキストボックスに...
-
Excel ユーザーフォームで計算 ...
-
ユーザーフォームへのデータ入...
-
チェックボックスを操作できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三項でたとえば交換って
-
Functionの戻り値を配列にした...
-
Excel VBAでsub,dimは何の略?
-
xmlの値を配列変数に格納し...
-
VB6で配列を引数にするときの2...
-
配列に複数の値があるか簡潔に...
-
2次元配列のデータをファイルへ...
-
xmlの値を配列に格納したいんで...
-
ExcelVBAで他のファイル(proje...
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
C言語のサフィックスについて
-
レコードセットにnullの場合
-
エクセルVBAでテキストボッ...
-
プログラムの素朴な質問です 分...
-
VB.NETでのイベントの途中終了
-
sublimit textっていうエディタ...
-
アクセスできない保護レベルエ...
おすすめ情報