2012-06-28 12 views
5

Wydaje się, że Excel-VBA 2007 ma ograniczenie 64k do wielkości tablic przekazywanych jako argumenty.Ograniczenia rozmiaru tablicy przekazujące argumenty tablicowe w VBA

Czy ktoś wie o poprawce lub obejściu?

Oto kod:

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

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

Od Excel:

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

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

Patrząc wewnątrz, Funa() działa bez zarzutu, ale przeszedł do funB argument x jest błąd 2015.

+1

Jakieś tło tutaj [Maksymalny rozmiar tablicy w funkcji arkusza kalkulacyjnego programu Excel 2007?] (http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function). Co właściwie należy zrobić z UDF? To poprowadzi nasze sugestie. – brettdj

+0

Odwołanie wygląda jak wariant problemu. To, co muszę zrobić z udf, to prawie to, co widzisz, oprócz tego, że tablica będzie wypełniona liczbami (przykładowa dystrybucja), a funB robi z nią zabawne i ekscytujące rzeczy. –

Odpowiedz

2

Wydaje mi się to tak bliskie pracy jak tylko się da. Wykonaj między wywołania funkcji z VBA

Jeśli się coś takiego

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

wydaje się działać aż do n = 24 = 2^2^8^3 (co nie wygląda jak każdy Typ danych Temperatura przerwa w VBA, który jest, gdy zawiesi się jest, ale to jest dość duża tablica)

+0

Yee-Hah! To robi. Dobry chwyt. –

1

to nie jest kwestia VBA, ponieważ można uruchomić to i dostać żadnych błędów

Public Sub test() 

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

    Debug.Print x; y 

End Sub 

wydaje się być problem, który go mija powrót do Excela - niewiele dokumentacji, ale wydaje się, że jest to limit Excela.

Oto inny link, ale nie rozwiązanie WorksheetFunction array size limit

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

3

myślę, że to ograniczenie samej komórce arkusza kalkulacyjnego, zamiast VBA. Program Excel może przekazywać tablice większe niż 2^16 między funkcjami, ale najwyraźniej nie może zawierać tablicy o tym rozmiarze w komórce.

Jako eksperyment podświetl funA(2^16) we wzorze komórki i naciśnij F9 - spowoduje to błąd o numerze '#VALUE!'.

Ponieważ formuła już obliczyła wynik funA, zanim zainicjuje funB, następnie próbuje uruchomić funB na funkcji, która jest już obliczona na błąd.

Wygląda na to, że praca taka jak ta, którą opublikował Brad (tj. Trzecia funkcja, która oblicza funB(funA(n)) w sobie), utrzymuje komórkę poza równaniem do czasu zakończenia obliczeń, więc działa poprawnie.

+0

Biorę to z powrotem. Działa dobrze w VBE - nie wiem, dlaczego nie udało się go za pierwszym razem. –

2

Ponieważ tablice jednowymiarowe są przekazywane z powrotem do programu Excel jako rząd kolumn, które przekroczyły limit liczb w programie Excel 2007 (64 KB).

Jeśli się swoją tablicę 2 wymiarową i powrót jako wiersze to powinno działać:

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

Alternatywnie można użyć Transpozycja obrócić tablicę z rzędu do kolumny, ale jest to prawdopodobnie mniej efektywne niż tworzenie dwuwymiarowa tablica w pierwszej kolejności.

+1

Tablica kolumn 2-D dim'd (n, 1) jest w rzeczywistości tym, czego używa oryginalny kod i wykazuje dokładnie te same objawy. Upuściłem go do jednego wymiaru, aby uprościć przykład. Może nie powinienem. –

+0

Jesteś poprawny dla funkcji VBA. Nie dzieje się tak z funkcją C XLL, dlatego wygląda na to, że błąd znajduje się w kodzie, który przekształca tablicę wariantów VBA z powrotem w komórki Excela: nie została ona zaktualizowana dla dużej siatki. –

Powiązane problemy