Helpex - Trao đổi & giúp đỡ Đăng nhập
12

Tại sao 0/0ném Overflow errortrong VBA, trong khi với các ngôn ngữ .Net, nó chỉ đơn giản là một Division by 0lỗi?


Ví dụ, trong C#đó là mộtSystem.DivideByZeroException

static void Main()
{
    int k = 0;
    int p = 0;
    Console.WriteLine(k/p);
}

Div/0lỗi tồn tại trong VBA. Nhưng 0/0 đưa ra một ngoại lệ tràn , trong khi bất kỳ thứ gì khác chia cho 0 sẽ đưa ra một Div/0ngoại lệ:

Public Sub TestMe()

    'Integer
    PrintAndCheck (11)      '- Division by zero error

    'Double
    PrintAndCheck (0.9)     '- Division by zero error

    'Long
    PrintAndCheck (50000)   '- Division by zero error

    'String
    PrintAndCheck ("1.1")   '- Division by zero error

    '----------------------------------------------------
    '----------------BUT---------------------------------
    '----------------------------------------------------

    'Integer
    PrintAndCheck (0)       '- Overflow?

End Sub

Public Sub PrintAndCheck(lngDivisor As Variant)

    On Error Resume Next

    Debug.Print lngDivisor / 0
    Debug.Print Err.Description & " from type -> " & VarType(lngDivisor)

    On Error GoTo 0

End Sub

Đó là những gì bạn nhận được trong cửa sổ ngay lập tức:

Division by zero from type -> 2
Division by zero from type -> 5
Division by zero from type -> 3
Division by zero from type -> 8
Overflow from type -> 2

Chỉnh sửa: Để làm cho toàn bộ câu chuyện thú vị hơn:

Public Sub TestMe()
    On Error Resume Next
    Debug.Print Evaluate("0/0")     'Division by 0 error (CVErr(xlErrDiv0)=2007)
    Debug.Print 0 \ 0               'Division by 0 error
    Debug.Print Err.Description
    On Error GoTo 0
End Sub
12 hữu ích 5 bình luận 4.2k xem chia sẻ
1

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/floating-point-division-operator

Bên cạnh sự khác biệt rõ ràng trong việc triển khai các ngôn ngữ và cách VBAxử lý division, liên kết MS Doc ở trên mở rộng lý do overflow exception, rằng nếu các kiểu dữ liệu toán hạng là số nguyên thì nó sẽ ném Overflow exception(Câu lệnh cuối cùng bên dưới)

Tại sao 0 chia cho 0 lại gây ra lỗi tràn trong VBA?

Ngoài ra, có \ toán tử phân chia kiểm tra phạm vi cho bạn và ném Division by zerongoại lệ

1 hữu ích 5 bình luận chia sẻ
1

Sẽ cố gắng tổng hợp câu trả lời từ các bình luận:

  1. Trong VBA 0/0 ném ngoại lệ Overflow, vì 0/0 là một trường hợp cụ thể của phép chia cho 0 . Vì vậy, bạn nên ném một ngoại lệ khác với tiêu chuẩn Division by zero error.

  2. Trong VBA Evaluate("0/0")trả về a Division by zero error, bởi vì Đánh giá không phát sinh lỗi, nó trả về giá trị Biến thể có cờ lỗi và không có sẵn cờ "tràn".

  3. Trong VBA phép chia số nguyên 0 \ 0 trả về a Division by zero error, vì kết quả phải là giá trị số nguyên và #IND là giá trị dấu phẩy động. Trong chừng mực #IND không thể được trả lại, nó mang lại điều tốt nhất tiếp theo - Division by zero error.

Đọc thêm về 0/0 bằng các ngôn ngữ khác:

1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ vba excel runtime-error , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading