プロが教える店舗&オフィスのセキュリティ対策術

何故ただのvariant型と定義された配列はvariant型の配列の引数に代入できないのですか?

質問者からの補足コメント

  • 例えばですが
    Dim arr as Variant
    Sub 関数名(arr() as Variant)
    End Sub
    次のコードはどこが間違っていますか?

      補足日時:2022/05/23 21:16
  • Sub 関数名(arr2 As Variant)はarr2()

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/05/23 21:56

A 回答 (3件)

こんにちは


VBAは、配列の中に配列の代入は出来ません
サブルーチン、ファンクションの引数に配列を入れる事は出来ます
戻り値として配列の取得も出来ます

Dim arr as Variant 
この場合、arrは値代入時にその型及び配列かが決まります
補足には代入コードの掲示が無いので 変数arr は配列とは限りません

arr = Array("A") 配列(1次元)
arr = Range("A1:F10") 配列(2次元)
arr = "A" 配列ではない
arr = Range("A1") 配列ではない

Dim arr() as Variant
とした場合、配列として宣言されます
arr = Array("A") 代入可
arr = Range("A1:F10") 代入可

配列として宣言されているので
arr = "A"    コンパイルできない
arr = Range("A1") 13 型エラー

"A" 以下は
redim でサイズを確保する必要があります
ReDim arr(0)
arr(0) = "A"
arr(0) = Range("A1")などで
(1次元)

更にDim arr as Variantは配列作成後 redim 出来ますが
直接 Preserve 出来ない(1004エラー)
(Preserveする場合は事前にredimで初期化する必要がありますので
結果として、出来ない)

更に2次元などで色々ありますが、、調べてみてください。
    • good
    • 2

こんばんは



「関数名」という名のサブルーチン(プロシージャ)だったりと紛らわしいですし、それに
>variant型と定義された配列はvariant型の配列の引数に代入できないのですか?
ご提示の例は、「配列の引数」ではなく「プロシージャ呼び出しの引数」ですけれど・・

実際に、何をしようとしているのかはまったくわかりませんけれど、ご提示のコードの意味で良いのなら、そのままで可能ですよ。

Sub Main()
Dim ary() As Variant
ReDim ary(1 To 3)
ary(1) = 111
ary(2) = 222
ary(3) = 333

関数名 ary
End Sub


Sub 関数名(ary2() As Variant)
Debug.Print Join(ary2, ", ")
End Sub

※ 個人的には
 Sub 関数名(ary2 As Variant)
と括弧なしで仮引数の宣言をしちゃいますけれど・・
    • good
    • 4

例えばこうゆう事?



Dim arr As Variant
Sub 関数名(arr2 As Variant)

Debug.Print arr2(1)
End Sub

Sub megu()

arr = Array(1, 2, 3, 4, 5)

関数名 (arr)

End Sub

受け取る引数の変数名とグローバル変数の変数名を変えて、且つ()をなくせばいいのでは?
Valiant型では勝手に配列としてarr2(要素番号)が定まりますし。
動的に変更したいってなら別ですけど。
その為の()付きなのでしょうか?
この回答への補足あり
    • good
    • 0

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