1

私の目には非常に逆説的なものに変換された単純な検証コードとして始まったもの。

次のコードは、「よくできました!」を返します。InputBox ポップアップに負の数を入力したとき

Dim myvar As String

myvar = InputBox("input a positive number, please")

If IsNumeric(myvar) Then
    myvar = CDbl(myvar)
    Select Case myvar
    Case Is < 0
        MsgBox "I need a positive number"
    Exit Sub
    Case Is > 0
        MsgBox "Good work!"
        [MyField] = myvar
        RunCommand acCmdSaveRecord
        Me.Requery
    Exit Sub
    Case Else
        MsgBox "You entered '" & myvars & "'. I don't know what to do about"
    End Select
Else
    MsgBox "A Number, please"
End If

これは本当に InputBox を検証する最良の方法ですか?

4

2 に答える 2

3

myvarであるためStringCDbl(myvar)暗黙的に文字列に変換されます。の一時数値変数を作成しますSelect Case

于 2012-06-28T12:54:39.753 に答える
0

他の回答のいくつかに同意します。このコードの書き直しについて考えてみてください (2 番目の変数が宣言されていることに注意してください)。

Dim myvar as String
Dim myDbl as Double

myvar = inputBox ("Input a positive number, please")

if isnumeric(myvar) then
    myDbl = cDbl(myvar)
else
    msgbox "Enter a number please"
    exit sub
end if


if mydbl <=0 then
    msgbox "I need a positive number"
else        'if mydbl > 0 then
    MsgBox "Good work!"
    [MyField] = myvar
    RunCommand acCmdSaveRecord
    Me.Requery
end if

これは、ゼロを考慮し、別の変数を double として宣言することで問題を解決します。case の代わりに if ステートメントを使用するのは、単なる好みだと思います。しかし、ここで 2 つの変数について考えてみましょう。

debug.print "MyVar is a string containing: " & myvar

debug.print cstr(cdbl(myvar)*2)    
'This forces myvar into a double(a number-type) to do math on it and then print it out

ただし、最初の出力を再実行すると、myvar がまだ文字列であり、文字列のように使用できることがわかります。VBA では、他の一部の言語とは異なり、変数は宣言したものにすぎません。それらを他のものとして使用したい場合は、必要な型の別の変数を宣言する必要があります。

TL;DR それらを異なるコンテナーと考え​​てください。ストリングスは丸箱、ダブルスは四角い箱です。それらは同様のものを保持できるかもしれませんが、コンテナの機能はその形状によって制限されます. VBA では、円を正方形に強制する方法がないため、2 番目のコンテナー全体を作成して、それらを転送する必要があります。

于 2012-06-28T23:55:42.137 に答える