2012-06-28 28 views
5

Excel-VBA 2007は引数として渡される配列のサイズに64kの制限があるようです。配列サイズがVBAで配列引数を渡す制限

修正プログラムや回避策はありますか?

Public Function funA(n) 
    Dim ar() 
    ReDim ar(n) 
    funA = ar 
End Function 

Public Function funB(x) 
    funB = UBound(x) 
End Function 

Excelから:

は、ここでは、コードです

=funB(funA(2^16-1)) '65536 as expected 

=funB(funA(2^16)) 'Gives a #VALUE 

内部を見ると、フナ()は罰金しかし、funBに渡された作品、引数xはエラー2015

+1

ここにいくつかの背景[Excel 2007ワークシート機能の最大配列サイズ?](http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function)。実際にUDFで何をする必要がありますか?それが私たちの提案を導くでしょう。 – brettdj

+0

参照は、この問題の亜種のようです。私がudfを使う必要があるのは、配列が数値(サンプルの分布)で満たされ、funBがそれで楽しくてエキサイティングなことをすることを除いて、あなたが見ているものです。 –

答えて

2
です

これは私が見つけることができるように仕事に近いと思われる。インター関数はVBA

から呼び出してくださいあなたはこの

Public Function funBA(n As Variant) As Variant 
    funBA = funB(funA(n)) 
End Function 

のようなものを作る場合には、最大動作するようですN =いずれかのように見えない^ 3^24 = 2^8(ハングアップどこでVBAでのデータ型のブレークポイントがあるが、それはかなり大きな配列です)

+0

Yee-Hah!そうです。ナイスキャッチ。 –

1

それはあなたがこれを実行するとエラー

Public Sub test() 

    x = funB(funA(2^16 - 1)) 
    y = funB(funA(2^16)) 

    Debug.Print x; y 

End Sub 

を得ることができないので、あるように思わVBAの問題ではありませんそれを渡す問題Excelに戻って - 多くの文書はありませんが、Excelの制限のようです。ここで

は、私はそれがむしろVBAよりもスプレッドシートのセル自体の制限、だと思う別のリンクが、無ソリューションWorksheetFunction array size limit

と別の http://answers.microsoft.com/en-us/office/forum/office_2007-excel/passing-arrays-to-excel-worksheet-functions-in/56d76732-9a15-4fd2-9cad-41263a4045d4

3

です。 Excelは関数間で2^16より大きい配列を渡すことができますが、明らかに、それはセル内にそのサイズの配列を含むことはできません。

セルの数式でfunA(2^16)をハイライト表示し、F9を押すと、'#VALUE!'というエラーが表示されます。

funAの計算結果がfunBになる前に計算されているため、既に計算された関数に対してfunBを実行しようとしています。

Bradが投稿したような(すなわち、funB(funA(n))を計算する3番目の関数)は、計算が完了するまでセルを計算式から外してしまうので、問題なく動作します。

+0

私はそれを取り戻す。それはVBEで正常に動作します - なぜ私はそれを試した最初に失敗したのか分からない。 –

2

1次元配列は列の列としてExcelに戻されるため、Excel 2007の列数(64K)の制限に達しました。

あなたは、アレイ2は、二次元にし、それが動作するはず行として返す場合:

Public Function funA(n) 
    Dim ar() 
    ReDim ar(n,1) 
    funA = ar 
End Function 

また、列に行から配列を回転させるためにトランスポーズを使用することができますが、これはおそらく、作成するよりも効率が低いです最初は2次元配列です。

+1

2次元列配列dim'd(n、1)は、実際に元のコードが使用しているもので、まったく同じ現象を示します。私は例を単純化するためにそれを1次元に落としました。多分私は持ってはいけない。 –

+0

VBA機能が正しいですか。これはC XLL関数では起こりません。そのため、VBAバリアント配列をExcelセルに変換するコードにバグがあるように見えます。これは、大きなグリッドに対しては更新されていません。 –

関連する問題