2016-11-29 3 views
1

Ich habe eine Variable vom Integer-Typ deklariert. VBA Excel beschränkt nicht darauf, nur ganze Zahlen darin zu speichern. Er akzeptiert Zeichenfolgenwerte (z. B. "10") und zeigt 10 korrekt im Meldungsfeld an. Ich möchte eine Lösung, in der Integer-Variable nur ganzzahlige Werte speichern kann. Ein Beispielcode istWarum die Integer-Variable String-Werte in VBA speichert Excel

Option Explicit 

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

Hier ‚a‘ als ganze Zahl deklariert wird und „10“ in ‚A‘ ohne Fehler gespeichert worden ist. Gibt es einen Weg, dass es Fehler bei jeder String-Zuweisung wie in anderen Programmiersprachen zeigt.

+1

sie kennen den Wert innerhalb des 'zu lesen "', versuchen' a = setzen" string1 "und sehen, was passiert ... –

+2

Dies wird durch [implizite Konvertierung] (http://bettersolutions.com/vba/data-ty) verursacht pes/converting-implicit-conversion.htm). – dee

+1

Dies wird als implizite Typumwandlung bezeichnet. Die „10“ ist implizit konvertiert auf ganzzahlige 10. So ist das Integer-Variable tut ** nicht ** einen String speichern, sondern eine implizite konvertierte Ganzzahl. Nicht nur 'VBA' wird dies tun, sondern auch einige andere Programmiersprachen. Soweit ich weiß, kann man das in 'VBA' nicht vermeiden. –

Antwort

2

Eine schnelle Idee könnte den neuen Wert in einer Variablen vom Typ Variant und vor der Zuweisung an das Integer-Variable zu speichern sein überprüft seine Subtyps.

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 

Diese Funktionalität könnte beispielsweise den Namen in einer Klasse gewickelt wird StrictInteger.

StrictInteger Klassenmodul

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 

Standard-Modultest

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