2009-11-25 27 views
5

VBA'da bir varyantın tam sayı olup olmadığını belirlemek için zarif bir çözüm arıyorum. Maalesef, eğer varyant bir dizeden oluşturulmuşsa, ben takılıyorum. İşteVBA'da bir varyantın tam sayı olup olmadığını nasıl belirleyebilirim?

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

ben v olması bekleniyor olurdu, ancak Iletikutusu = varyant bir dize oluşturuldu muhtemelen çünkü açılır yuvarlak (v): Burada küçük bir test senaryo. CDbl çift tipi numarasına herhangi bir veri dönüştürme bir fonksiyondur

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

:

+2

Herhangi bir varyantı ve tüm sayıları gerçekten işlemeniz gerekip gerekmediğini kendinize sormaya değer olabilir. 1000 basamaklı bir dizeden ne haber? Uzun menzilin dışındaki integral çiftler ne olacak? İhtiyacınız olan şeyi tam olarak açıklarsanız ve daha sonra kodu yazarsanız çok daha kolay olacaktır. Aynı problem değil, ama bu cevabı Eric Lippert tarafından Stackoverflow'taki başka bir soruya bakın: http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – jtolle

cevap

9

Sen gibi bir şey yazmak gerekir. CDbl işlevini çağırmadan önce v'nin isNumeric() işleviyle bir sayıya dönüştürülemeyeceği durumları ele almak zorunda kalabilirsiniz. Hatta karşılaştırmalar için CInt işlevini kullanabilirsiniz: Eğer Val kullanırsanız(), bir dizi dönüştürmek için elinden geleni yapacak

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

Bazı durumlarda pek işe yaramayacaktır. örneğin: Dim v As Para Birimi v = -123456.0000006 – Fionnuala

+1

Benim önerim daha fazla 'bu' bir şey yaz 'dan' bu 'kurşun geçirmez kod garantisidir', ama ana fikir burada, biraz fazladan olsa bile test yapmak. –

+1

Üzgünüm, ama "böyle bir şey" hakkındaki uyarınız için bile -1 demek zorundayım. Cevaplarınız kodlandıklarından hatalıdır. Kodu gösterirseniz, doğru olmalı ve hataları bir egzersiz olarak bulmaya bırakmayın. – jtolle

3
Sub test() 

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

End Sub 

. Eğer yapamazsa, sıfıra dönecek ve Val (v) bu durumda daima Int (Val (v)) olacaktır.

İlgili konular