Excel và VBA: Các tips về cải tiến tốc độ, memory...

Liên hệ QC
Bác VetMini đã chỉ ra một trường hợp. Nhưng bản chất IF ... và Select là khác nhau. Trong Select ta có một biểu thức trả về 1 giá trị và code nào được thực hiện là do trị trả về quyết định. Còn trong IF thì ta có thể có 1 biểu thức duy nhất
Mã:
Sub test()
Dim k As Long
'    thường được xác định bằng cách nào đó, ở đây ta nhập "cứng"
    k = 5
    If k < 10 Then
'        ...
    ElseIf k < 15 Then
'        ...
    ElseIf k < 30 Then
'        ...
    Else
    ...
    End If
End Sub
Ở đây chỉ có 1 biểu thức k (k, 2*k, k + 3*sin(m) ... đều là biểu thức). Code đó chuyển sang Select thì đơn giản.

Nhưng cũng có thể trong mỗi IF, ELSEIF xét một biểu thức khác nhau, xét các khía cạnh khác nhau. Vd.
Mã:
Sub test()
    If doc_ngay() <> "chủ Nhật" Then
'        ...
    ElseIf doc_nhan_vien() = "Kim lác" Then
'        ...
    ElseIf doc_gioi_tinh() = "Nữ" Then
'        ...
    ElseIf hom_qua_co_nhau_thau_dem() Then
'        ....
    Else
'        ...
    End If
End Sub

Bây giờ mà chuyển sang Select thì không được đẹp mắt như trường hợp ở trên.

Thành???
Mã:
Sub test()
    Select Case doc_ngay()
        Case doc_ngay() <> "chủ Nhật"
'            ...
        Case Else
            Select Case doc_nhan_vien()
                Case "Kim lác"
'                    ...
                Case Else
                    Select Case doc_gioi_tinh()
                        Case "Nữ"
'                            ...
                        Case Else
                            Select Case hom_qua_co_nhau_thau_dem()
                                Case True
'                                    ...
                                Case Else
'                                    ...
                            End Select
                    End Select
            End Select
    End Select
End Sub
 
Trong VBA, nếu một Case chưa thỏa thì Case kế tiếp sẽ được xét, nếu thỏa rồi thì các Case kế sẽ bị bỏ qua, tương đối giống Else If. Điều này rất quan trọng cần phải biết khi bạn dùng hàm để tính giá trị của Case.
Chay thử code này để biết tôi nói gì:
Sub t()
For a = 1 To 3
MsgBox "a = " & a
Select Case a
Case fff(1)
MsgBox "inside case " & a
Case fff(2)
MsgBox "inside case " & a
Case Else
MsgBox "inside case else"
End Select
Next a
End Sub
' ----
Function fff(a)
MsgBox "function run at case " & a
fff = a
End Function

Chính xác là em muốn biết vụ xử lý như cái hàm ở trên của anh: ở hậu trường VBA nó sẽ xử lý như thế nào khi gặp Select Case hoặc If ElseIf chứ không phải là sử dụng như thế nào.
Ý là giả định là dùng If ... ElseIf và Select Case kết quả ra như nhau, bỏ qua các yếu tố khác như code không dễ nhìn, không gọn gàng chỉ xét cách VBA nó xử lý thôi.
Ví dụ đơn giản:
Mã:
If userlevel = 1 Then
        MsgBox "Administrators"
    ElseIf userlevel = 2 Then
        MsgBox "PowerUsers"
    Else
        MsgBox "Users"
End If

Mã:
Select Case userlevel
    Case 1
        MsgBox "Administrators"
    Case 2
        MsgBox "PowerUsers"
    Case Else
        MsgBox "Users"
End Select

Túm lại:
Theo như chạy thử cái hàm demo của anh thì Select case hay If thì VBA đều phải duyệt lần lượt qua từng Case (ElseIf) chứ không có vụ đi tắt để xử lý.
 
Chính xác là em muốn biết vụ xử lý như cái hàm ở trên của anh: ở hậu trường VBA nó sẽ xử lý như thế nào khi gặp Select Case hoặc If ElseIf chứ không phải là sử dụng như thế nào.
Ý là giả định là dùng If ... ElseIf và Select Case kết quả ra như nhau, bỏ qua các yếu tố khác như code không dễ nhìn, không gọn gàng chỉ xét cách VBA nó xử lý thôi.
...
Túm lại:
Theo như chạy thử cái hàm demo của anh thì Select case hay If thì VBA đều phải duyệt lần lượt qua từng Case (ElseIf) chứ không có vụ đi tắt để xử lý.
Trong khi đó switch/case của dòng họ C/C++ có từ sơ khai và hoạt động khác với If/Else. Chúng dùng bảng tra label để nhảy nhánh cho nhanh.
Lệnh Select/Case là lệnh thêm vào cho các phiên bản sau này. Các phiên bản của BASIC trước thập niên 1990 không có. Đối với VBA, lệnh này không khác If/Else bao nhiêu.

Túm lại, mấy cái "mách nhỏ" ở bài #1 là kiến thức thuộc hàng cao cấp mà các bạn chỉ cần biết tới khi đã rất thông thạo về các lệnh của VBA.
Ở dưới trình độ "cao cấp" thì những cái này nó chỉ làm vướng bận thiết kế của bạn.

Tôi không hề muốn tranh luận với thớt về ba cái vụ hàm nào (điển hình hàm $) chạy nhanh hơn. Nhưng theo nguyên tắc riêng của tôi thì cái hiệu quả tốc độ ấy không quan trọng bằng sự đồng bộ của code. Đối với tôi, các hàm mới hơn được viết theo chiều hướng dễ phát triển, mở rộng; các hàm cũ viết cho máy thượng cổ cho nên rất hiệu quả (về bộ nhớ và tốc độ sử lý) nhưng cũng sẽ vướng bận phát triển.
Rất có thể bên trong hàm Mid nó gọi hàm Mid$ nhưng tôi không quan tâm. Cái đó là bên trong, là chuyện của ngừoi viết hàm. Là người sử dụng hàm, tôi chỉ cần biết cái giao diện, hàm cam kết làm gì cho tôi là được rồi. Phần bên trong không hề có cam kết thì Microsoft nắm toàn quyền thay đồi, phiên bản hôm nay Mid gọi Mid$ nhưng phiên bản ngày mai nó gọi cái khác là chuyện của nó.
 
Web KT

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

Back
Top Bottom