
各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません)
ユーザー定義を使用し、以下のコードを作ってみました。
配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。
何が原因しているのでしょうか?
さっぱり分かりませんので、ご教示お願いいたします。
Type test
aaaa As Integer
End Type
Sub sbTest()
Dim myAns() As test
myAns = Sample1(myAns)
End Sub
Function Sample1(ByRef Ans() As test)
Dim i As Integer
Dim ret(0 To 9) As test
For i = 0 To 9
ret(i).aaaa = i
Next
Ans = ret '配列名で配列を戻り値
End Function
No.1ベストアンサー
- 回答日時:
AsnをRef引数で渡すのであればSample1はSubでいいと思いますよ
Functionにするなら戻り値を定義します
' 戻り値を定義 ... As test()
Function Sample1() As test()
Dim i as Integer
Dim Ans(0 to 9) As test
for i = 0 to 9
Ans(i).aaa = i
next
Sample1 = Ans
End Function
' 参照渡しの引数なら Subプロシージャで
Sub Sample2(ByRef Ans() as Test)
Dim i as Integer
' 引数の配列の 下限から上限までの添え字の取得を
' LBound/UBoundで取得
for i = LBound(Ans) to UBound(Ans)
Ans(i).aaa = i
next
End Sub
試してうまくできました。
ありがとうございます。
構造体と配列を扱うのが苦手で四苦八苦しており、型を宣言して返すという考えもありませんでした。
No.2
- 回答日時:
(言っている意味はNo.1さんと同じなのですが)もう少し噛み砕くと、
呼び出し方に問題があります。
まず、よく意味を考えてみましょう。
myAns = Sample1(myAns) だと、「myAns」に「Sample1(myAns)」を代入しろ。という命令になります。
ここで「Sample1(myAns)」とは何だろう?と考えると、Function Sample1 で何も返却していないので「何もない」もの(Variant型のNull)が返ってきます。
つまり、この書き方では「test型の動的配列」に「何もないもの」を代入しようとしているわけです。
このときに「型が一致しません」エラーが発生しています。
エラーを解消しようとするなら、以下のように書いてみてください。
Type test
aaaa As Integer
End Type
Sub sbTest()
Dim myAns() As test
'myAns = Sample1(myAns)
'★補足:「左辺のmyAnsにSample1の戻り値を代入する」という意味。
' つまり型が一致しない。
' →この場合Sample1の戻り値はVariant型であるため
'正しくは以下のどちらか
'(1)
myAns = Sample2()
'★補足:「左辺のmyAnsにSample2の戻り値を代入する」という意味。
' つまり型が一致する。
' →この場合Sample2の戻り値はtest()型であるため
'(2)
Call Sample3(myAns)
'★補足:「myAnsをByRef引数としてSample3を呼び出す」という意味。
' ByRef引数は、呼出元でもファンクション内部の変更の影響を受ける
' →この場合、Sample3の内部でAnsに配列をセットしているので、呼出元のmyAnsも同じ状態となる
End Sub
Function Sample1(ByRef Ans() As test) 'もともとのサンプル=ファンクションの型が定義されていないので、暗黙でVariant型になる
Dim i As Integer
Dim ret(0 To 9) As test
For i = 0 To 9
ret(i).aaaa = i
Next
Ans = ret
End Function
Function Sample2() As test() 'ファンクション戻り値として配列を返却
Dim i As Integer
Dim ret(0 To 9) As test
For i = 0 To 9
ret(i).aaaa = i
Next
Sample2 = ret '★ファンクションの戻り値に配列をセット
End Function
Sub Sample3(ByRef Ans() As test) 'ByRef引数として配列を返却
Dim i As Integer
Dim ret(0 To 9) As test
For i = 0 To 9
ret(i).aaaa = i
Next
Ans = ret '★ByRef引数の戻り値に配列をセット
End Sub
詳しく説明下さり、ありがとうございます。
自分でも引数を更に引数と同じ変数に代入と?・・・迷いながらの作成でした。
> 'もともとのサンプル=ファンクションの型が定義されていないので、暗黙でVariant型になる
このことを理解していませんでした。
きちんと型宣言してmyAns = Sample2()の方法で行うことにしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
ListViewで、非表示列って作れ...
-
VB6 配列を初期化したい
-
AES暗号にて、AES_set_encrypt_...
-
VB2008: CSV を二次元配列に読...
-
配列に同じ値を入れる方法
-
VBA 1次元配列を2次元に追加する
-
エクセル又はOpenOfficeで条件...
-
VBのコントロール配列を二次元...
-
特定のセル範囲で4文字以上入力...
-
for each の現在の配列ポインタ...
-
配列の格納について
-
VBAで近似曲線の係数取得
-
Array配列の末尾に追加したい。
-
2次元動的配列の第一引数のみを...
-
VLOOKUP関数で、一番下...
-
モンテカルロ法を用いた積分計...
-
ビンゴ
-
配列を任意の数値で埋める方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
特定のセル範囲で4文字以上入力...
-
VBA 1次元配列を2次元に追加する
-
subの配列引数をoptionalで使う...
-
配列変数の添字が範囲外ですと...
-
2次元動的配列の第一引数のみを...
-
ListViewで、非表示列って作れ...
-
MATLABにて場合分け関数を定義...
-
VB6 配列を初期化したい
-
AES暗号にて、AES_set_encrypt_...
-
配列を任意の数値で埋める方法
-
RPG E仕様書について
-
VBのFunctionで、配列を引数...
-
ビンゴ
-
エクセルで最小値から0を除く方法
-
順列の作成
-
VBA Match関数の限界
-
VLOOKUP関数で、一番下...
-
for each の現在の配列ポインタ...
おすすめ情報