2012-06-28 37 views
5

Excel-VBA 2007 dường như có giới hạn 64k đối với kích thước mảng được chuyển làm đối số.Giới hạn kích thước mảng vượt qua đối số mảng trong VBA

Có ai biết về bản sửa lỗi hoặc công việc không?

Dưới đây là các mã:

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

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

Từ Excel:

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

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

Nhìn bên trong, Funa() hoạt động tốt nhưng, truyền cho funB, đối số x là một Lỗi 2015.

+1

Một số nền ở đây [Kích thước mảng tối đa trong Excel 2007 Worksheet Function?] (http://windowssecrets.com/forums/showthread.php/128704-Max-Array-size-in-Excel-2007-Worksheet-Function). Bạn thực sự cần làm gì với UDF? Điều đó sẽ hướng dẫn các đề xuất của chúng tôi. – brettdj

+0

Tham chiếu trông giống như một biến thể của sự cố. Những gì tôi cần làm với udf là khá nhiều những gì bạn nhìn thấy ngoại trừ rằng mảng sẽ được lấp đầy với các con số (một phân phối mẫu) và funB làm những điều thú vị và thú vị với nó. –

Trả lời

2

Điều này dường như là gần với một công việc xung quanh như tôi có thể tìm thấy. Làm liên chức năng cuộc gọi từ VBA

Nếu bạn thực hiện một cái gì đó như thế này

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

nó dường như làm việc lên đến n = 2^24 = 2^8^3 (mà không giống như bất kỳ kiểu dữ liệu điểm break trong VBA mà là nơi treo lên là, nhưng đó là một mảng khá lớn)

+0

Yee-Hah! Điều đó làm điều đó. Nice bắt. –

1

Nó không phải là một vấn đề VBA vì bạn có thể chạy này và nhận được không có lỗi

Public Sub test() 

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

    Debug.Print x; y 

End Sub 

Nó có vẻ là một vấn đề đi qua nó trở lại Excel - không nhiều tài liệu nhưng nó có vẻ là một giới hạn Excel.

Dưới đây là một liên kết nhưng không có giải pháp WorksheetFunction array size limit

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

3

Tôi nghĩ đó là một hạn chế của các tế bào bảng tính riêng của mình, chứ không phải là VBA. Excel có thể vượt qua các mảng lớn hơn 2^16 giữa các hàm, nhưng dường như nó không thể chứa một mảng có kích thước đó trong một ô.

Làm thử nghiệm, đánh dấu funA(2^16) trong công thức ô và nhấn F9 - nó sẽ cung cấp cho bạn lỗi '#VALUE!'.

Bởi vì công thức đã tính kết quả của funA trước khi bắt đầu funB, sau đó cố gắng chạy funB trên một hàm đã được tính toán lỗi.

Có vẻ như một công việc xung quanh giống như Brad được đăng (tức là hàm thứ ba tính funB(funA(n)) bên trong) giữ cho ô ra khỏi phương trình cho đến khi tính toán hoàn thành, vì vậy nó hoạt động tốt.

+0

Tôi lấy lại. Nó hoạt động tốt trong VBE - không biết tại sao nó thất bại trong lần đầu tiên tôi thử nó. –

2

Vì mảng đơn chiều được chuyển trở lại Excel dưới dạng một hàng cột bạn đã đạt đến giới hạn Excel 2007 về số cột (64K).

Nếu bạn thực hiện mảng của bạn 2 chiều và trở lại như hàng cần làm việc:

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

Hoặc bạn có thể sử dụng Transpose để xoay mảng từ một hàng để một cột, nhưng điều này có lẽ là kém hiệu quả hơn so với việc tạo ra một mảng 2 chiều ở vị trí đầu tiên.

+1

Một mảng cột 2-D dim'd (n, 1) là trong thực tế những gì mã ban đầu sử dụng và nó thể hiện chính xác các triệu chứng tương tự. Tôi thả nó vào một chiều để đơn giản hóa ví dụ. Có lẽ tôi không nên có. –

+0

Bạn đúng với chức năng VBA. Điều này không xảy ra với một hàm C XLL, do đó có vẻ như lỗi trong mã chuyển đổi mảng biến thể VBA trở lại thành các ô Excel: điều này chưa được cập nhật cho lưới lớn. –

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