Theo ý kiến của em thì thế này:
Hướng giải quyết đầu tiên nên áp dụng các hàm có sẵn. Vì chắc chắn một điều là [1]SUM của Excel tốt hơn VBA_SUM (của người tự viết). Thực ra nếu chỉ sử dụng riêng lẻ các hàm thì cũng chưa giải quyết được việc gì, vấn đề ở đây là phải có cách để lập công thức phối hợp các phép toán, các hàm.
Lấy một vị dụ đơn giản
Cần tín tổng lương đặt tên là LUONG
=SUM(LUONG) tốt hơn là phải viết
Function VBA_Sum(Byval array as Range)
Dim oCell As Range
For Each oCell In array
If IsNumberoCell.Value)
VBA_Sum=VBA_Sum+oCell.Value
End If
Next
End Function
Bây giờ để tính tổng LUONG cho PHONGBAN (Phòng ban) là "KT"
=SUMIF(PHONGBAN,"KT",LUONG)
Nếu viết hàm VBA_SUMIF. Chắc chắn là phức tạp hơn vì trong FOR...NEXT ta phải kiểm tra IF CELLS(I,PHONGBAN)="KT" AND...IsNumber...Then VBA_SumIF=VBA_SumIF+oCell.Value
Nếu bây giờ cần tính tổng lương cho PHONGBAN="KT" và HĐLĐ từ ngày 01/06/06
=SUM(IF(PHONGBAN="KT",IF(HDLD>=Datevalue('01/06/06'),LUONG,0),0))
Đến mức này thì VBA_SUMIFIF chắc khó theo được
Vấn đề ở đây nếu cùng để giải quyết một vấn đề A thì thằng nào linh động nhất thì ta theo.
Nhưng có những bài toán mà không viết VBA thì khó mà làm được, nếu làm được thì cũng vỡ cả đầu.
Có bài toán này:
Lập sổ tổng hợp hàng hóa theo kho
Mã hàng| Tên hàng | Tồn đầu | Nhập | Xuất bán| Xuất KM | Xuất trả lại | Xuất khác | Tồn cuối |
Có 7-1=6 cột phải tính SUM có điều kiện theo từng mã, theo thời gian, theo kho...
Bảng dữ liệu có 2000 dòng, có 600 mã hàng
Theo bài toán trên thì dùng hàm sẽ là không tốt vì:
Phải có 600*6=3600 công thức tính SUM, trong mỗi công thức phải SUM một vùng 2000 dòng. Nhìn một cách thô nhất thì EXCEL phải đảm nhận khối tính toán là 3600*2000=7,200,000
lượt. Thực tế có nhiều mặt hàng xuất hiện ít lần trong sổ.
Nếu bài toán trên viết bằng VBA - Viết vòng FOR I=1 To 2000 cúng cách xử lý mảng (Dong,7) thì khối lượng tính toán giảm rất nhiều - Phương pháp tối ưu nhất nếu không so sánh với kỹ thuật T-SQL.
Biết viết VBA người dùng tự tin hơn khi bắt gặp các vấn đề phức tạp.
Biết VBA người dùng có thể hy vọng tự mình xây dựng được một ứng dụng tốt cho chính mình và cho người khác.