2012-06-28 3 views
5

Excel-VBA 2007 sembra avere un limite di 64k sulla dimensione degli array passati come argomenti.Limiti delle dimensioni dell'array che passano gli argomenti dell'array in VBA

Qualcuno è a conoscenza di una soluzione o di una soluzione?

Ecco il codice:

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

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

da Excel:

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

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

Guardando all'interno, Funa() funziona bene, ma, passato al funB, l'argomento x è un errore 2015.

+1

Qualche sfondo qui [Dimensione Max Array nella funzione Foglio di lavoro Excel 2007?] (Http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function). Cosa hai veramente bisogno di fare con l'UDF? Questo guiderà i nostri suggerimenti. – brettdj

+0

Il riferimento sembra una variante del problema. Quello che devo fare con l'udf è più o meno quello che vedi tranne che l'array sarà pieno di numeri (una distribuzione di esempio) e funB fa cose divertenti ed eccitanti con esso. –

risposta

2

Questo sembra essere il più vicino a un lavoro che riesco a trovare. Do the inter-chiamate di funzione da VBA

se fate qualcosa di simile

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

sembra funzionare fino a n = 2^24 = 2^8^3 (che non assomiglia a nessun tipo di dati punto di rottura in VBA che è dove il blocco up è, ma questa è una abbastanza grande matrice)

+0

Yee-Hah! Questo lo fa Bella presa. –

1

non è un problema di VBA, perché è possibile eseguire questo e ottenere nessun errore

Public Sub test() 

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

    Debug.Print x; y 

End Sub 

sembra essere un problema che lo passa torna su Excel - non molta documentazione ma sembra essere un limite di Excel.

Ecco un altro link, ma nessuna soluzione WorksheetFunction array size limit

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

3

Penso che sia una limitazione della cella del foglio stesso, piuttosto che VBA. Excel può passare array superiori a 2^16 tra le funzioni, ma a quanto pare non può contenere una matrice di tale dimensione all'interno di una cella.

Come esperimento, evidenziare funA(2^16) nella formula della cella e premere F9 - ti darà un errore '#VALUE!'.

Poiché la formula ha già calcolato il risultato di funA prima di avviare funB, è quindi possibile provare a eseguire funB su una funzione già calcolata per un errore.

Sembra un work-around simile a quello pubblicato da Brad (ovvero una terza funzione che calcola funB(funA(n)) all'interno di se stesso) che mantiene la cella fuori dall'equazione fino al completamento del calcolo, quindi funziona correttamente.

+0

Lo riprendo. Funziona bene in VBE - non so perché ha fallito la prima volta che l'ho provato. –

2

Poiché gli array monodimensionali vengono passati a Excel come una fila di colonne, si è raggiunto il limite di Excel 2007 sul numero di colonne (64 KB).

Se si effettua la matrice 2 dimensionale e quella di ritorno, le righe dovrebbe funzionare:

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

In alternativa è possibile utilizzare Transpose per ruotare l'array da una riga a una colonna, ma questo è probabilmente meno efficiente rispetto alla creazione una matrice bidimensionale in primo luogo.

+1

Un array di colonne 2-D dim'd (n, 1) è in effetti utilizzato dal codice originale e presenta esattamente gli stessi sintomi. L'ho lasciato cadere in una dimensione per semplificare l'esempio. Forse non avrei dovuto. –

+0

Si è corretti per una funzione VBA. Ciò non accade con una funzione C XLL, quindi sembra che il bug si trovi nel codice che converte l'array VBA variant in celle Excel: questo non è stato aggiornato per la grande griglia. –