Chỉ cho em chỗ sai trong đoạn code tính m3 (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

financial.dept21

Thành viên mới
Tham gia
12/5/14
Bài viết
8
Được thích
0
Em có ví dụ này anh các anh/chị xem và chỉ cho em chỗ sai nhé!
Mã:
Public Function VB17(SL As Long) As Double
    VB17 = Round((1270 * 640 * 1.7 * 20 * SL) / 1000000000, 3)
End Function
 

File đính kèm

Em có ví dụ này anh các anh/chị xem và chỉ cho em chỗ sai nhé!
Mã:
Public Function VB17(SL As Long) As Double
    VB17 = Round((1270 * 640 * 1.7 * 20 * SL) / 1000000000, 3)
End Function
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.
 
Upvote 0
Em có ví dụ này anh các anh/chị xem và chỉ cho em chỗ sai nhé!
Mã:
Public Function VB17(SL As Long) As Double
    VB17 = Round((1270 * 640 * 1.7 * 20 * SL) / 1000000000, 3)
End Function
Mình không rành VBA nhưng có thể chỉnh như sau:

Mã:
Public Function TinhSo(SL As Long) As Double    

TinhSo = Application.Round((27635.2 * SL) / 1000000, 3)
    
End Function
 
Upvote 0
Trong mọi trường hợp, người ta sẽ viết vầy:

PHP:
Public Function TinhSo(SL As Long) As Double    

TinhSo = Application.Round((27635.2 * SL) / 10^6, 3)
    
End Function
 
Upvote 0
Em có ví dụ này anh các anh/chị xem và chỉ cho em chỗ sai nhé!
Mã:
Public Function VB17(SL As Long) As Double
    VB17 = Round((1270 * 640 * 1.7 * 20 * SL) / 1000000000, 3)
End Function

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
 
Upvote 0
Em có ví dụ này anh các anh/chị xem và chỉ cho em chỗ sai nhé!
Mã:
Public Function VB17(SL As Long) As Double
    VB17 = Round((1270 * 640 * 1.7 * 20 * SL) / 1000000000, 3)
End Function

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
 
Upvote 0

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

Back
Top Bottom