2016-11-29 2 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

это знать, чтобы прочитать значение в ' "', попробуйте положить' а =" string1 "' и посмотреть, что произойдет ... –

+2

Это вызвано [неявным преобразованием] (http://bettersolutions.com/vba/data-ty ПЭС/превращающее неявный-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 
Смежные вопросы