2016-11-29 27 views
1

整数型の変数を宣言しました。 VBA Excelは整数だけを格納するように制限していません。文字列値( "10"など)を受け取り、メッセージボックスに10を正しく表示します。 整数変数には整数値しか格納できないソリューションが必要です。 サンプルコードはここ整数変数がVBA Excelの文字列値を格納する理由

Option Explicit 

    Sub Button1_Click() 
     Dim a As Integer 
     a = "10" 
     MsgBox (a) 
    End Sub 

「」整数として宣言され、「10」は、「」せずにエラーに格納されているです。 他のプログラミング言語などの各文字列割り当てでエラーを表示する方法はありますか?

+1

それは文字列1 "' =を入れてみてください、 '" '内の値を読み取るために知っています"と何が起こるか見る... –

+2

これは[暗黙的な変換](http://bettersolutions.com/vba/data-ty pes/converting-implicit-conversion.htm)。 – dee

+1

これは暗黙の型変換と呼ばれます。 "10"は暗黙的に整数10に変換されます。したがって、整数変数は文字列を格納せず**暗黙的に変換された整数を格納します。 'VBA'だけでなく、他のいくつかのプログラミング言語もこれを行うでしょう。私が知る限り、あなたは 'VBA'でこれを避けることはできません。 –

答えて

2

新しい値をVariant型の変数に格納し、Integer変数に代入する前に、そのサブタイプを確認することが簡単に考えられます。

Sub Button1_Click() 
    Dim newIntegerValue As Variant 
    newIntegerValue = "10" 

    If VarType(newIntegerValue) = vbString Then 
     Err.Raise 123, "Button1_Click", "Invalid cast" 
    End If 

    Dim a As Integer 
    a = newIntegerValue 
End Sub 

この機能は、例えばという名前のクラスにラップすることができStrictInteger

StrictIntegerクラスモジュール

Option Explicit 

Private m_value As Integer 
Private m_hasValue As Boolean 
Private Const invalidValueErrorNumber As Long = vbObjectError + 600 

Private Sub Class_Initialize() 
    m_value = 0 
    m_hasValue = False 
End Sub 

Public Function Assign(ByVal newIntegerValue As Variant) 
    ' TODO: check with next variant sub types 
    If VarType(newIntegerValue) = vbString Or _ 
     VarType(newIntegerValue) = vbBoolean Then 
     Err.Raise invalidValueErrorNumber, _ 
      "StrictInteger::Initialize", _ 
      "Value initialization failed" 
    End If 
    On Error GoTo Err_Initialize 
    m_value = newIntegerValue 
    m_hasValue = True 
    Exit Function 
Err_Initialize: 
    m_hasValue = False 
    Err.Raise Err.Number, "StrictInteger::Initialize", Err.Description 
End Function 

Public Property Get Value() As Integer 
    If m_hasValue Then 
     Value = m_value 
     Exit Property 
    End If 
    Err.Raise invalidValueErrorNumber, _ 
     "StrictInteger::Value", _ 
     "Valid value is not available" 
End Property 

標準モジュールテスト

Sub Test() 
    On Error GoTo Err_Test 
    Dim strictInt As StrictInteger 
    Set strictInt = New StrictInteger 
    strictInt.Assign "10" 
    strictInt.Assign "ABC" 
    strictInt.Assign ActiveSheet 
    strictInt.Assign Now 
    strictInt.Assign True 
    strictInt.Assign False 
    strictInt.Assign 10 
    MsgBox strictInt.Value 
    Exit Sub 
Err_Test: 
    MsgBox Err.Number & ". " & Err.Description, vbCritical, "Error" 
    Resume Next 
End Sub 
関連する問題