Tôi đang cố gắng rediminsion một mảng trong MS Access VBA. Cách hiệu quả nhất để làm điều này là gì?Làm thế nào để bạn redimension một mảng trong VBA?
Trả lời
Làm thế nào về ...
này sẽ bảo toàn dữ liệu đã có trong myArray
Redim Preserve MyArray(15)
này sẽ xóa bất kỳ dữ liệu trước đó tồn tại trong myArray
Redim MyArray(15)
Nhất hiệu quả cách để redimension một mảng là để giới hạn số lần bạn thay đổi kích thước mảng đó. Mỗi khi bạn thay đổi kích cỡ mảng VB sẽ lấy toàn bộ mảng và sao chép nó, lãng phí thời gian và bộ nhớ.
Nếu bạn không biết kích thước mảng của mình tại thời điểm phát triển, bạn nên thực hiện phỏng đoán tốt nhất với kích thước tối đa của mảng, sau đó điền vào mảng. Sau khi điền xong mảng, bạn có thể thay đổi kích thước của nó xuống kích thước chính xác.
Trong các vòng, thường là tốt nhất để thực hiện dự đoán này bằng cách tăng gấp đôi kích thước của mảng hiện tại khi bạn hết dung lượng. Bạn có thể thấy điều này trong hành động dưới đây với RedimTestA()
thay đổi kích thước mảng mỗi lần lặp (1.000.000 lần) và RedimTestB()
chỉ thay đổi kích thước đôi khi (22 lần).
Trên máy tính xách tay của tôi RedimTestA()
mất 3,93 giây và RedimTestB()
mất 0,41 giây.
Option Explicit
Sub RedimTest()
Dim tA, tB As Single
tA = RedimTestA(1000000)
tB = RedimTestB(1000000)
MsgBox "Test A takes : " & tA & ", and Test B takes : " & tB
End Sub
Function RedimTestA(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
Do While i <= iterations
ReDim Preserve aryString(i) As String
aryString(i) = "ABCEFG123"
i = i + 1
Loop
RedimTestA = Timer - t
End Function
Function RedimTestB(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
ReDim aryString(0) As String
Do While i <= iterations
If i >= UBound(aryString) Then
ReDim Preserve aryString(i * 2) As String
End If
aryString(i) = "ABCEFG123"
i = i + 1
Loop
ReDim Preserve aryString(i - 1) As String ' i - 1 becuase of the final i = i + 1
RedimTestB = Timer - t
End Function
Cũng lưu ý rằng bạn chỉ có thể lấy lại kích thước phù hợp nhất của mảng đa chiều.
Đó là một lưu ý quan trọng cần lưu ý. –
- 1. Làm thế nào để bạn tìm thấy Leapyear trong VBA?
- 2. Làm thế nào để gán một chiều của một mảng 2ngày để một mảng 1d mới trong VBA
- 3. Làm thế nào để bạn vượt qua một mảng :: ::?
- 4. Làm thế nào để bạn lặp qua một mảng các mảng ký tự trong c?
- 5. Trong Bash, làm thế nào để bạn thấy nếu một chuỗi không nằm trong một mảng?
- 6. VBA Public Array: làm thế nào?
- 7. Làm thế nào bạn có thể kiểm tra null trong một bản ghi VBA DAO?
- 8. Làm thế nào để bạn thực hiện một preg_match nơi mẫu là một mảng, trong php?
- 9. Trong Golang, làm thế nào để bạn chuyển đổi một slice thành một mảng
- 10. Làm thế nào để bạn đọc một mảng byte từ một DataRow trong C#?
- 11. Trong CoffeeScript, làm thế nào để bạn thêm một giá trị vào một mảng?
- 12. Làm thế nào để bạn vượt qua một mảng bằng cách tham chiếu trong Delphi?
- 13. Làm thế nào để bạn tạo một mảng cấu trúc trong C?
- 14. Làm thế nào để bạn kích thước trước một mảng trong Lua?
- 15. Làm thế nào để bạn giới hạn một mảng con trong Mongo?
- 16. Làm thế nào để bạn tạo một mảng mới trong VB.NET?
- 17. làm thế nào để bạn lặp qua một mảng trong fortran?
- 18. Làm thế nào để bạn khai báo một mảng đối tượng trong Java?
- 19. Làm thế nào để bạn chuyển đổi một mảng byte thành một thể hiện Bitmap (.NET)?
- 20. Làm thế nào để bạn làm việc với một mảng jQuery hoãn lại?
- 21. Làm thế nào để bạn loại bỏ một cột khỏi một mảng có cấu trúc?
- 22. làm thế nào để bạn áp dụng một loại tùy chỉnh cho một mảng?
- 23. Làm thế nào để Thêm Ngày Picker Để VBA UserForm
- 24. Làm thế nào để tách một mảng?
- 25. Làm thế nào để "trộn" một mảng?
- 26. Làm thế nào để mpf một mảng?
- 27. Làm thế nào để bạn kiểm tra một Wireshark dissector?
- 28. Làm thế nào bạn có thể lấy bảng hiện tại trong MS Word VBA?
- 29. Làm thế nào để trừ một mảng khỏi mảng?
- 30. Làm thế nào để bạn xóa một nút trong networkx?
Ồ, thôi nào - trừ khi bạn đang ReDimming trong một vòng lặp với 1000 lần lặp lại, điều này thực sự không phải là một vấn đề thực tế. Tôi có rất nhiều mã ra có ReDims mảng tất cả các thời gian và không có hiệu suất cũng không phải vấn đề bộ nhớ. Mặt khác, tôi không sử dụng các mảng để lưu trữ 1000 giá trị (đó là những gì các bảng và các bản ghi được sử dụng). –
Hoàn toàn đồng ý với @David. Điều này hiệu quả hơn vào thời gian chạy, nhưng tôi có sử dụng nó không? Hiếm khi, có lẽ chỉ khi tôi đang viết một số loại lớp xử lý mảng ma thuật. –
Câu trả lời cho câu hỏi ngụ ý nếu thường sử dụng loại con trỏ recordset hỗ trợ thuộc tính RecordCount (nghĩa là số hàng được trả về) để bạn có thể định kích thước mảng trong một lần truy cập. Nếu recordset là ADO, bạn có thể sử dụng phương thức GetRows của nó để trả về một mảng nội dung mà không liên quan đến ReDim chút nào :) – onedaywhen