2017-08-25 20 views
1

3つの配列を持ち、それぞれに3つの範囲があります。これらの配列を1つの配列に格納したい。私は、次やろう!とExcel vba:配列内の配列、ネストされた配列、ギザギザの配列

Function test()   
      Dim a() As Range 
      Dim b() As Range 
      Dim c() As Range 
      a = getA(dataWorkbook) 'a(1)=Range(...), a(2)=Range(...), a(3)=Range(...) 
      b = getB(dataWorkbook) 
      c = getC(dataWorkbook) 

      Dim allArrays(1 To 3) As Range 
      ' allArrays(1) = a 
      ' allArrays(2) = b 
      ' allArrays(3) = c 

      test="HELLO" 
End Function 

しかし、私はallArrays割り当てと行のコメントを解除すると、関数は代わりに「HELLO」の値を返します。私は間違っているの?

+1

'allArrays'に追加する値は' Range'型ではありません。 – Phylogenesis

+1

a、bおよびcは型の範囲ではなく、範囲の配列型です。 allArraysは配列ではなくRange変数を必要とします。 –

+0

どのようにそれを宣言する必要がありますか? – Ans

答えて

1

ジャグ配列を作成するための最良の方法は、Variantを使用することです:

Dim allArrays As Variant 
ReDim allArrays(1 To 3) 
'rest of code will work as intended 

あなたはあなたのコードを簡素化し、ちょうどArray機能を使用することができます。この場合は

Dim allArrays As Variant 
allArrays = Array(a, b, c) 

もののallArrays意志1ベースではなく0ベースになります。

+0

要素にどのようにアクセスしますか?私は 'allArrays(1)(1)'と 'allArrays(1、1)'を試しました。 'Range'を期待する関数に渡します。前者は 'ByRef'エラー(渡された型は' Range'ではない)を返します。後者の 'wrong number of dimensions'エラーです。 – Ans

+0

@Ansあなたは 'allArrays(1)(1)'を使用します。 'ByRef'問題がある限り、あなたは' Variant'(この柔軟な型は 'ByRef'問題を解決する方法を持っています)を期待するように関数を変更することができます。さらに悪化する場合は、範囲変数 'R'を宣言し、Set R = allArrays(1)(1)'を呼び出して関数に 'R'を渡すことができます。 –

+0

このミスはなぜ起こるのですか?何かが間違っていることを意味しないのですか?それ以外の場合、Range型は渡されますか?それがRangeでなければ、何が渡されていますか? – Ans