2009-11-25 54 views
5

Tôi đang tìm một giải pháp thanh lịch để xác định xem một biến thể có phải là một số nguyên trong VBA hay không. Thật không may, nếu biến thể được tạo ra từ một chuỗi, tôi bị mắc kẹt. Dưới đây là một kịch bản thử nghiệm nhỏ:Làm cách nào để xác định xem một biến thể có phải là một số nguyên trong VBA không?

dim v as variant 
v = "42" 
if v <> round(v) then 
    msgBox("<>") 
end if 

Ở đây, MsgBox bật lên, có lẽ vì các biến thể được tạo ra từ một chuỗi, mặc dù tôi dự kiến ​​sẽ có v là = round (v).

+2

Có thể bạn nên tự hỏi liệu mình có thực sự cần xử lý bất kỳ biến thể nào và bất kỳ số nguyên nào không. Điều gì về một chuỗi 1000 chữ số? Điều gì về tách rời đôi bên ngoài phạm vi của một Long? Nó sẽ dễ dàng hơn rất nhiều nếu bạn xác định chính xác những gì bạn cần và sau đó mã chỉ đó. Nó không phải là vấn đề tương tự, nhưng xem câu trả lời này của Eric Lippert cho một câu hỏi khác ở đây trên Stackoverflow: http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – jtolle

Trả lời

9

Bạn nên viết một cái gì đó như:

if cDbl(v) <> round(cDbl(v)) Then 

đâu CDbl là một chức năng chuyển đổi bất kỳ dữ liệu đến một số double-type. Bạn có thể phải xử lý các trường hợp trong đó v không thể được chuyển đổi thành một số với hàm isNumeric() trước khi gọi hàm cDbl. Bạn thậm chí có thể sử dụng chức năng CInt để so sánh của bạn:

if isnumeric(v) then 
    if cDbl(v) - cInt(v) <> 0 Then 
    .... 
    endif 
else 
    debug.print "data cannot be converted to a number" 
endif 
+0

Điều đó sẽ không hoàn toàn hoạt động trong một số trường hợp , ví dụ: Dim v Là tiền tệ v = -123456.0000006 – Fionnuala

+1

Vâng, đề xuất của tôi là 'viết một cái gì đó như thế' hơn 'đây là mã chứng nhận đạn được bảo đảm', nhưng ý tưởng chính là ở đây, ngay cả khi nó cần thêm thử nghiệm. –

+1

Tôi xin lỗi, nhưng tôi phải nói -1, ngay cả khi bạn báo trước về "một cái gì đó như thế". Một trong những câu trả lời của bạn khi chúng được mã hóa có lỗi. Nếu bạn trình bày mã, nó phải chính xác và không để lại việc tìm kiếm các lỗi như một bài tập. – jtolle

3
Sub test() 

    Dim v As Variant 
    v = "42" 
    If Val(v) <> Int(Val(v)) Then 
     MsgBox ("<>") 
    End If 

End Sub 

Nếu bạn sử dụng Val(), nó sẽ cố gắng hết sức mình để chuyển đổi thành một số. Nếu nó không thể, nó sẽ trả về 0 và Val (v) sẽ luôn bằng Int (Val (v)) trong trường hợp đó.

Các vấn đề liên quan