ここから本文です

【VBA】配列を返り値に持つFunctionが動きません。 VBAで配列の計算をするプ...

coc********さん

2017/3/123:43:39

【VBA】配列を返り値に持つFunctionが動きません。

VBAで配列の計算をするプログラムを書いたのですが、
実行ボタンを押すと、
エクセルごと強制終了してしまいます。

エラーメッセージも出ません。

何が原因なのでしょうか?
ちなみにExcelのバージョンは2013です。
===============================
Sub test()

Dim G(2, 2) As Integer
Dim i, j As Integer

G = testfunc()

End Sub
---------------------------------------------------------
Function testfunc() As Integer()

Dim F(2, 2) As Integer
Dim i, j As Integer

For i = 0 To 1
For j = 0 To 1
F(i, j) = (i + 1) * (j + 1)
Next j
Next i

testfunc = F()

End Function

補足素早いご回答ありがとうございます。

私の方でも
Dim G(2,2) As Integer
→Dim G
と直したら、無事動きました。

ただ、なぜこの修正で上手くいき、
自分のはうまく動かなかったのか、
疑問です。

Functionの受け手側がvariant型でなければならない理由でもあるのでしょうか?

閲覧数:
62
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tra********さん

2017/3/123:59:23

お示しのプログラムで、実行ボタンを押すと、
>実行ボタンを押すと、
>エクセルごと強制終了してしまいます。
というようなことは発生しませんね。
単なるコンパイルエラーです。

そのコンパイルエラーを訂正すればうまく動きます。

Dim G(2, 2) As Integer



Dim G

  • tra********さん

    2017/3/202:13:00

    表面上、要素数がわからない配列「testfunc()」 を受け取るのだから、動的配列が必要なんでしょうね。

    Variantで不都合・不便もないので、動的配列=Variant型と扱えば、無益な時間を取られることはないですね。普段からあまり考えることはなく使ってます。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/3/3 00:07:11

train_benoist様、ipl_is_loading様、inakappumen様、
丁寧なご回答ありがとうございました。

VBAの配列に関して曖昧だったところが明確になってすっきりしました。

ベストアンサーは、最も納得する説明をしてくださったtrain_benoist様に。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

だるまさん

2017/3/210:53:53

以下のとおりに添削させていただきました、これなら動きます。


Sub test()

Dim G() As Integer

G = testfunc()

End Sub


Function testfunc() As Integer()

Dim F(0 To 1, 0 To 1) As Integer
Dim i As Integer, j As Integer

For i = 0 To 1
For j = 0 To 1
F(i, j) = (i + 1) * (j + 1)
Next j
Next i

testfunc = F()

End Function



>Dim G(2, 2) As Integer
固定の配列で、Functionの戻り値の配列を受け取ることは出来ませんので

Dim G() As Integer
とするか、あるいは

Dim G As Variant
とします。

(As 以降を省略するとVariantを指定したことになりますが、
記述を忘れたのかどうなのかが不明確になりますから、As Variant
も省略せずに書くことをお勧めします。)


>Dim i, j As Integer
この書き方だと、i はVariant型、j だけがInteger型になります。
両方Integerのつもりなら、両方共明示する必要があります。

Dim i As Integer, j As Integer


>Dim F(2, 2) As Integer
この宣言は、

Dim F(0 to 2, 0 to 2) As Integer
と解釈されます。
本当に各次元で2つの要素だけが必要なら、

Dim F(0 To 1, 0 To 1) As Integer

または

Dim F(1 To 2, 1 To 2) As Integer

となります。

ipl********さん

2017/3/202:01:16

>Function testfunc() As Integer()

なので、戻り値がIntegerの配列になっているので

Dim G() As Integer

が本来の型だと思います。
ただし、Variantでもいいいう事だと思います。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる