Thứ nhất, tên hàm VB17 là một tên không hợp lệ vì Excel hiểu đây là một địa chỉ ô --> phát sinh lỗi #REF. Bạn phải khắc phục vấn đề này, chẳng hạn sửa thành VB_17.
Thứ hai, bạn đặt phép nhân 1270 * 640 trước sẽ cho ra một số lớn, vượt phạm vi tính toán --> phát sinh lỗi Overflow. Bạn nên thực hiện phép chia trước, cụ thể là 1270 / 1000000000 trước rồi nhân với gì gì đó cũng được.
Thứ ba, thay vì dùng Round, bạn nên dùng Application.Round, sẽ tránh được một số sai số có thể gặp phải.
Trong VBA, không phải bạn muốn cộng trừ nhân chia tùy tiện được đâu
Lấy ví dụ: Trên bảng tính, ta thực hiện phép nhân 17000*2 sẽ cho kết quả = 34000 đàng hoàng nhưng trong VBA thì báo lỗi ngay lập tức
Tại sao lại thế thì bạn có thể tham khảo các bài viết trên diễn đàn ---> Có cả đống
Quay lại bài của bạn, ta sẽ làm thế này là "chắc bắp" luôn
Mã:
Public Function VB_17(SL As Long) As Double
Dim tmp As Double
tmp = 1270
tmp = tmp * 640
tmp = tmp * 1.7
tmp = tmp * 20
tmp = tmp * SL
tmp = tmp / 1000000000
VB_17 = Round(tmp, 3)
End Function
Dùng biến tạm được khai báo kiểu Double (cho nó lớn) rồi cứ nhân, chia từng em vào
Có 2 cách sai. Sai cú pháp cho nên compiler không chịu chạy, và sai cách làm cho nên chạy mà ra kết quả sai.
Cú pháp sai như thế này:
1. Tham số của bạn không có ByVal nên mặc định cách chuyền là ByRef. Nếu bạn chuyền tham số dạng Variant sẽ bị compiler phàn nàn.
Sub t()
Dim a
a = 1000
Debug.Print VB17(a) ' Lỗi argument type mismatch ở đây
End Sub
2. Như nghiaphuc đã nêu ra ở #2, con toán của bạn nhân số 1270 và 640 sẽ đưa đến tràn số. Bởi vì nó dùng con toán số nguyên. Tuy nhiên bài #2 đề nghị cần chia trước không hẳn đã đúng. Thực ra bạn chỉ cần thêm dấu chấm sau số 1270 để nó trở thành số thực là đủ rồi.
Bạn có thể làm như SA_DQ, đơn giản trước các số với nhau (tôi không hiểu tại sao anh ta dùng *27635.2/10^6 mà không dùng 0.027635 quách cho rồi)
Tuy nhiên có thể bạn muốn giữ dạng các thông số 1270, 640, ... để về sau dễ hiểu. Trường hợp này bạn nên đặt một hằng số
Const thongSo as double = 1270.0 * 640 * 1.7 * 20 / 10^9
Hằng số sẽ được compiler tính luôn ra lúc dịch code cho nên VBA không bắt buộc phải tính lại con toán mỗi lần hàm được gọi.
Đó là nói chuyện về thuật ngữ. Bài của bạn bị sai thuật toán khi dùng hàm Round. Hàm Round của VBA hoạt động theo luật của Access, khôg giống con toán làm tròn toán học. Muốn làm tròn thoe kiểu toán, bạn phải dùng hàm Round của Worksheet/application