- ベストアンサー
[Excel2000_VBA] 型が一致しませんメッセージが表示
各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません) ユーザー定義を使用し、以下のコードを作ってみました。 配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。 何が原因しているのでしょうか? さっぱり分かりませんので、ご教示お願いいたします。 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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (1)
- junbei
- ベストアンサー率55% (5/9)
(言っている意味は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()の方法で行うことにしました。
お礼
試してうまくできました。 ありがとうございます。 構造体と配列を扱うのが苦手で四苦八苦しており、型を宣言して返すという考えもありませんでした。