Theo MSDN, cho Variant kiểu dữ liệu:VBA: Hành vi bất ngờ của Variant Data Type
“dữ liệu Numeric thể được bất kỳ số nguyên hoặc giá trị số thực khác nhau, từ -1.797693134862315E308 để -4.94066E-324 cho âm . giá trị và từ 4.94066E-324 để 1.797693134862315E308 cho các giá trị tích cực”
tuy nhiên, đoạn mã sau đưa ra một lỗi mặc dù tất cả các giá trị cuối cùng sau khi tính toán rơi cũng trong phạm vi chấp nhận được:
Sub Test()
Dim v1, v2, v3, v4
v1 = 569847501 + 54678 ' OKAY
v2 = 7784687414# + 98565821345# ' OKAY
v3 = 7784687414# + 1132747441 ' OKAY
v4 = 1132747441 + 1788441323 ' FAILS
End Sub
MSDN cũng chỉ ra:
”Tuy nhiên, nếu một hoạt động số học được thực hiện trên một Variant chứa một Byte, một Integer, một dài, hoặc một đơn, và kết quả vượt quá phạm vi bình thường đối với bản gốc kiểu dữ liệu, kết quả được thăng hạng trong Biến thể thành kiểu dữ liệu lớn hơn tiếp theo. Một Byte được thăng lên một Số nguyên, một Số nguyên được thăng cấp thành một Giá trị dài, và một số nguyên và một đơn được quảng cáo thành một giá trị gấp đôi. ”
Tài liệu nêu rõ rằng loại này phải được quảng bá khi hoạt động số học vượt quá phạm vi bình thường cho kiểu dữ liệu gốc. Tại sao không phải là v4
được thăng cấp lên Double
?
Lưu ý rằng đây không phải là duy nhất đối với 'Biến thể'. 'Dim d As Double: d = 1132747441 + 1788441323' thực hiện chính xác điều tương tự. – Comintern