
各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません)
ユーザー定義を使用し、以下のコードを作ってみました。
配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。
何が原因しているのでしょうか?
さっぱり分かりませんので、ご教示お願いいたします。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
配列の定義
-
エクセルで最小値から0を除く方法
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
VB6 配列を初期化したい
-
2次元動的配列の第一引数のみを...
-
配列変数の添字が範囲外ですと...
-
subの配列引数をoptionalで使う...
-
《エクセル2000》A列・B列の商...
-
Excel VBA配列をFunctionに渡す
-
VBのコントロール配列を二次元...
-
[Excel2000_VBA] 型が一致しま...
-
VLOOKUP関数で、一番下...
-
ListViewで、非表示列って作れ...
-
ビンゴ
-
verilogで配列の任意の8bitを取...
-
エクセルマクロで配列の値から...
-
配列の格納について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
ListViewで、非表示列って作れ...
-
配列変数の添字が範囲外ですと...
-
VB6 配列を初期化したい
-
subの配列引数をoptionalで使う...
-
《エクセル2000》A列・B列の商...
-
2次元動的配列の第一引数のみを...
-
ビンゴ
-
for each の現在の配列ポインタ...
-
配列に同じ値を入れる方法
-
配列を任意の数値で埋める方法
-
配列内の内容を全て表示する方法
-
Excel-VBAの配列「Public Const...
-
エクセルVBAの配列二重ループ処...
-
Array配列の末尾に追加したい。
-
MATLABにて場合分け関数を定義...
-
エクセルで最小値から0を除く方法
おすすめ情報