アプリ版:「スタンプのみでお礼する」機能のリリースについて

各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません)

ユーザー定義を使用し、以下のコードを作ってみました。
配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。
何が原因しているのでしょうか?
さっぱり分かりませんので、ご教示お願いいたします。

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

A 回答 (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
    • good
    • 0
この回答へのお礼

試してうまくできました。
ありがとうございます。

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

お礼日時:2007/09/04 00:05

(言っている意味は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
    • good
    • 0
この回答へのお礼

詳しく説明下さり、ありがとうございます。

自分でも引数を更に引数と同じ変数に代入と?・・・迷いながらの作成でした。

> 'もともとのサンプル=ファンクションの型が定義されていないので、暗黙でVariant型になる

このことを理解していませんでした。
きちんと型宣言してmyAns = Sample2()の方法で行うことにしました。

お礼日時:2007/09/04 00:10

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