新しい値を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
出典
2016-11-29 08:04:08
dee
それは文字列1 "' =を入れてみてください、 '" '内の値を読み取るために知っています"と何が起こるか見る... –
これは[暗黙的な変換](http://bettersolutions.com/vba/data-ty pes/converting-implicit-conversion.htm)。 – dee
これは暗黙の型変換と呼ばれます。 "10"は暗黙的に整数10に変換されます。したがって、整数変数は文字列を格納せず**暗黙的に変換された整数を格納します。 'VBA'だけでなく、他のいくつかのプログラミング言語もこれを行うでしょう。私が知る限り、あなたは 'VBA'でこれを避けることはできません。 –