5

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

誰かが修正または回避策を知っていますか?

コードは次のとおりです。

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

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

エクセルから:

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

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

内部を見ると、funA() は正常に動作しますが、funB に渡される引数 x はエラー 2015 です。

4

4 に答える 4

3

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

配列を2次元にして行として返すと、うまくいくはずです:

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

別の方法として、Transpose を使用して配列を行から列に回転させることもできますが、これは最初から 2 次元配列を作成するよりも効率が悪い可能性があります。

于 2012-06-28T08:16:42.693 に答える
3

VBAではなく、スプレッドシートのセル自体の制限だと思います。Excel は関数間で 2^16 より大きい配列を渡すことができますが、セル内にそのサイズの配列を含めることはできないようです。

実験として、funA(2^16)セルの数式を強調表示して F9 キーを押すと、'#VALUE!'エラーが発生します。

数式はfunA開始前に既に結果を計算しているため、既に計算されている関数でfunB実行しようとすると、エラーが発生します。funB

ブラッドが投稿したような回避策(つまり、funB(funA(n))それ自体で計算する3番目の関数)は、計算が完了するまでセルを方程式から除外するように思われるため、正常に機能します。

于 2012-06-28T03:38:15.307 に答える
2

これは、私が見つけることができる限り回避策に近いようです。VBAから関数間呼び出しを行う

あなたがこのようなものを作るなら

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

n = 2 ^ 24 = 2 ^ 8 ^ 3まで機能するようです(これは、ハングアップが発生するVBAのデータ型ブレークポイントのようには見えませんが、かなり大きな配列です)

于 2012-06-28T02:51:07.157 に答える
1

これを実行してエラーが発生しないため、VBAの問題ではありません

Public Sub test()

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

  Debug.Print x; y

End Sub

これをExcelに戻すのは問題のようです。ドキュメントはそれほど多くありませんが、Excelの制限のようです。

ここに別のリンクがありますが、解決策はありませんWorksheetFunction配列のサイズ制限

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

于 2012-06-28T03:00:10.503 に答える