2013-05-08 18 views
6

Siamo spiacenti di chiedere una domanda così semplice, ma questo mi sta facendo impazzire ...VBA lunghezza array (non UBound o onerror!)

Quale funzione in VBA restituisce il numero di elementi di un array ... vale a dire quando la matrice è vuota restituirà 0?

Non riesco a farlo con UBound perché genera un errore quando viene chiamato su un array vuoto e non posso credere al modo di farlo utilizzando OnError per determinare prima se è vuoto o meno ... come suggerito nei forum! array.Length si lamenta di un cattivo qualificatore o qualcosa del genere.

ho davvero bisogno di fare questo:

dim termAry() as String 
populate termAry 
... 

private sub populate(terms() as String) 
    redim preserve terms(terms.Length) ' Redim takes ubound for array size 
    terms(ubound(terms)) = "something really annoying" 
end sub 

P.S eventuali buoni collegamenti con una serie concisa di VBA lingua e la funzione di riferimento sarebbe più utile ... MSDN sembra davvero oscuro !!!

+0

cosa stai cercando di fare? avete bisogno di una fonte per il vostro array - da dove proviene da –

+1

Vedere http://stackoverflow.com/questions/4097021/vba-handle-empty-array-error o http://stackoverflow.com/questions/206324/how -display-per-empty-array-in-vba-macro –

+0

tutto ciò che serve per gestirlo è "if ubound (arr)> 1 then ...", per l'inizializzazione usa 'redim arr (MAX)' –

risposta

10

Credo che l'unico modo per farlo sia utilizzare On Error e gestire l'errore Subscript Out of Range che verrà generato se l'array (o la dimensione dell'array che ti interessa) non è inizializzato.

E.g.

Public Function IsInitialized(arr() As String) As Boolean 
    On Error GoTo ErrHandler 
    Dim nUbound As Long 
    nUbound = UBound(arr) 
    IsInitialized = True 
    Exit Function 
ErrHandler: 
    Exit Function 
End Function 

Dim a() As String 
Dim b(0 To 10) As String 

IsInitialized(a) ' returns False 
IsInitialized(b) ' returns True 

È possibile generalizzato per testare quante dimensioni sono in una matrice, per esempio

Public Function HasAtLeastNDimensions(arr() As String, NoDimensions As Long) As Boolean 
    On Error GoTo ErrHandler 
    Dim nUbound As Long 
    nUbound = UBound(arr, NoDimensions) 
    HasAtLeastNDimensions = True 
    Exit Function 
ErrHandler: 
    Exit Function 
End Function 

Dim a() As String 
Dim b(0 To 10) As String 
Dim c(0 To 10, 0 To 5) As String 

HasAtLeastNDimensions(a, 1) ' False: a is not initialized 
HasAtLeastNDimensions(b, 1) ' True: b has 1 dimension 
HasAtLeastNDimensions(b, 2) ' False: b has only 1 dimension 
HasAtLeastNDimensions(c, 2) ' True: c has 2 dimensions 

UPDATE

In risposta a commentare:

Ho ragione di pensare che la funzione non può essere facilmente generalizzato a operare su qualsiasi tipo di matrice

E ' può essere facilmente generalizzato rendendo il parametro a Variant, e controllandolo è una matrice nel corpo della f unzione utilizzando la funzione di IsArray:

Public Function HasAtLeastNDimensions(arr As Variant, NoDimensions As Long) As Boolean 
    On Error GoTo ErrHandler 
    Dim nUbound As Long 
    If Not IsArray(arr) Then Exit Function 
    nUbound = UBound(arr, NoDimensions) 
    HasAtLeastNDimensions = True 
    Exit Function 
ErrHandler: 
    Exit Function 
End Function 
+0

Grazie Joe ... è vile ma grazie comunque! – user2361340

+0

Che funziona bene per gli array di stringhe, ho ragione nel pensare che la funzione non può essere facilmente generalizzata per operare su qualsiasi tipo di array ... sembra che sia necessaria una copia profonda con casting di tipo saggio? – user2361340

+0

@ user2361340 - vedi aggiornamento – Joe