Giúp giải thích khai báo biến array và Range

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Văn Toàn 1996

Thành viên hoạt động
Tham gia
5/6/23
Bài viết
102
Được thích
22
Chào tất cả mọi người. Mình có test 1 đoạn code bên dưới với 2 kiểu khai báo biến như sau
Dim sArr() Dim sArr
Mình thấy 2 kết quả lọc đều giống nhau, nhưng khi lọc dữ liệu lớn thì Dim sArr có tốc độ nhanh hơn
Vậy khi nào dùng Dim sArr() và khi nào nên dùng Dim sArr. em xin chân thành cảm ơn ạ

Mã:
Sub TESTLOC()
Dim sArr(), dArr(), Dk1 As String, I As Long, K As Long, R As Long, Col As Long, a As Long
sArr = Range("A1:D1000").Value
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 4)
For I = 1 To R
    If sArr(I, 1) = 1 Then
        K = K + 1
        For Col = 1 To 4
            dArr(K, Col) = sArr(I, Col)
        Next Col
    End If
Next I
Range("E1:H1000").ClearContents
Range("E1").Resize(K, 4) = dArr
End Sub
 
Như vậy lấy dữ liệu và ghi dữ liệu thì dim arr nhanh hơn, xử lý dữ liệu thì dim arr() nhanh hơn
Code minh họa xử lý đơn giản chỉ gán dữ liệu 2 mảng (khai báo dArr() là mảng) nếu xử lý phức tạp chạy vòng for nhiều lần lúc đó tốc độ sẽ khác
Tôi vốn không thích dài dòng với tốc độ. Nhưng ở đây nó liên quan đến cơ cấu dữ liệu cho nên cũng tò mò.

Đoán mò rằng (lưu ý từ "đoán mò" này có dựa trên "căn bản kiến thức"):
Cũng như cách khai báo Dim a As Class và Dim a As new Class.
Cách thứ nhất chỉ cho biết a là kiểu gì, nhưng chưa tạo đối tượng. Cách thứ hai tạo đối tượng rỗng. Cả hai cách đều đợi đến lúc sử dụng biến mới lập đối tượng thực sự.
Áp dụng kiến thức trên cho mảng:
Lúc truy xuất sheet data:
Có thể khi truy vấn sheet, VBA tạo một mảng, khi xong việc thì trả địa chỉ mảng này về nơi gọi nó dưới dạng Variant. Bên được gán nếu là Variant thì cứ nhận, nếu là mảng thì lúc ấy mới lập mảng và copy mảng kia qua. Vì vậy hơi lâu.
Lúc sử dụng:
Vì arr là variant cho nên mỗi lần sử dụng phải qua địa chỉ gián tiếp.
arr() là mảng sẵn, hàm lấy phần tử trực tiếp theo chỉ số.
Nhanh hơn một chút nhưng không đáng kể bởi vì VBA theo chân VBScript và JavaSrcript, cách tra Variant theo bảng phụ (bảng thực sự chỉ vào ngăn chứa dữ liệu của biến) rất hiêu quả.

Phụ chú:
Nếu thực sự như tôi đoán, tức hàm truy xuất mảng từ bảng tính có tự tạo mảng thì nó chỉ việc trao địa chỉ cho bên gọi nó (bên được gán). Bên được gán nếu là Variant thì cứ vui vẻ nhận, nếu là mảng thì sau khi copy xong thì cái vật trả về kia hết nhiệm vụ, sẽ bị bộ máy xử lý rác (garbage collector) thanh toán. Và nếu bộ nhớ hơi yếu thì bộ máy này hoạt động rất mạnh (nhất là phiên bản 64 bit chạy trên Wins11), có thể thời gian đo gồm luôn thời gian hủy mảng trong bộ nhớ này.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom