2013-05-08 21 views
6

Xin lỗi vì đã đặt một câu hỏi cơ bản như nhưng điều này là lái xe cho tôi điên ...VBA mảng chiều dài (không UBound hoặc onerror!)

chức năng gì trong VBA trả về số phần tử trong một mảng ... tức là khi mảng rỗng, nó sẽ trả về 0? Tôi không thể làm điều này với UBound vì nó ném một lỗi khi được gọi trên một mảng trống và tôi không thể tin được cách để làm điều này bằng cách sử dụng OnError để xác định đầu tiên của nó trống hay không ... như được đề xuất trên diễn đàn! array.Length phàn nàn về một vòng loại xấu hoặc một cái gì đó.

tôi thực sự cần phải làm điều này:

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 

Tái bút bất kỳ liên kết tốt để một tập ngắn gọn của ngôn ngữ và chức năng tham khảo VBA sẽ là hữu ích nhất ... MSDN dường như thực sự khó hiểu !!!

+0

bạn đang cố gắng làm gì? bạn cần một nguồn cho mảng của bạn - nó đến từ đâu từ –

+1

Xem http://stackoverflow.com/questions/4097021/vba-handle-empty-array-error hoặc http://stackoverflow.com/questions/206324/how -to-check-cho-empty-array-in-vba-macro –

+0

tất cả những gì bạn cần để xử lý nó để nói 'if ubound (arr)> 1 thì ...', để khởi tạo sử dụng 'redim arr (MAX)' –

Trả lời

10

Tôi tin rằng cách duy nhất để làm điều này là sử dụng On Error và xử lý lỗi Subscript Out of Range sẽ được tăng lên nếu mảng (hoặc thứ nguyên của mảng bạn quan tâm) không được khởi tạo.

Ví dụ:

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 

Bạn có thể khái quát hóa điều này để kiểm tra xem có bao nhiêu thứ nguyên trong một mảng, ví dụ:

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 

CẬP NHẬT

Đáp lại bình luận:

là i ngay trong suy nghĩ rằng chức năng không thể dễ dàng khái quát hóa để hoạt động trên bất kỳ loại mảng

Nó có thể dễ dàng khái quát hóa bằng cách tạo tham số một Biến thể và kiểm tra nó là một mảng trong phần thân của f việc sử dụng hàm 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

Cảm ơn Joe ... thật là hèn hạ nhưng cảm ơn dù sao đi nữa! – user2361340

+0

Điều đó làm việc tốt cho mảng chuỗi, tôi có quyền suy nghĩ rằng các chức năng không thể dễ dàng tổng quát để hoạt động trên bất kỳ loại mảng ... có vẻ như một bản sao sâu là cần thiết với yếu tố khôn ngoan loại đúc? – user2361340

+0

@ user2361340 - xem cập nhật – Joe

Các vấn đề liên quan