• ベストアンサー

[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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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

enotama
質問者

お礼

試してうまくできました。 ありがとうございます。 構造体と配列を扱うのが苦手で四苦八苦しており、型を宣言して返すという考えもありませんでした。

その他の回答 (1)

  • junbei
  • ベストアンサー率55% (5/9)
回答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

enotama
質問者

お礼

詳しく説明下さり、ありがとうございます。 自分でも引数を更に引数と同じ変数に代入と?・・・迷いながらの作成でした。 > 'もともとのサンプル=ファンクションの型が定義されていないので、暗黙でVariant型になる このことを理解していませんでした。 きちんと型宣言してmyAns = Sample2()の方法で行うことにしました。

関連するQ&A