it-roy-ru.com

VBA преобразовать строку в INT, если строка является числом

Мне нужно преобразовать строку, полученную из Excel, в VBA в целое число. Для этого я использую CInt (), который работает хорошо. Однако есть вероятность, что строка может быть чем-то отличным от числа, в этом случае мне нужно установить целое число на 0. В настоящее время у меня есть:

If oXLSheet2.Cells(4, 6).Value <> "example string" Then
  currentLoad = CInt(oXLSheet2.Cells(4, 6).Value)
Else
  currentLoad = 0
End If

Проблема в том, что я не могу предсказать все возможные нечисловые строки, которые могут быть в этой ячейке. Есть ли способ, которым я могу сказать, чтобы преобразовать, если это целое число и установить в 0, если нет?

55
Captastic

Используйте IsNumeric. Он возвращает истину, если это число или ложь в противном случае.

Public Sub NumTest()
    On Error GoTo MyErrorHandler

    Dim myVar As Variant
    myVar = 11.2 'Or whatever

    Dim finalNumber As Integer
    If IsNumeric(myVar) Then
        finalNumber = CInt(myVar)
    Else
        finalNumber = 0
    End If

    Exit Sub

MyErrorHandler:
    MsgBox "NumTest" & vbCrLf & vbCrLf & "Err = " & Err.Number & _
        vbCrLf & "Description: " & Err.Description
End Sub
92
ForEachLoop

Приведите в long или приведите к int, помните следующее.

Эти функции являются одной из функций просмотра в Excel VBA, которые зависят от региональных настроек системы. Таким образом, если вы используете запятую в двойнике, как в некоторых странах Европы, вы столкнетесь с ошибкой в ​​США.

Например, в европейской версии Excel 0,5 будет хорошо работать с CDbl (), а в версии для США - 5. Поэтому я рекомендую использовать следующую альтернативу:

Public Function CastLong(var As Variant)

    ' replace , by .
    var = Replace(var, ",", ".")        

    Dim l As Long
    On Error Resume Next
    l = Round(Val(var))

    ' if error occurs, l will be 0
    CastLong = l

End Function

' similar function for cast-int, you can add minimum and maximum value if you like
' to prevent that value is too high or too low.
Public Function CastInt(var As Variant)

    ' replace , by .
    var = Replace(var, ",", ".")

    Dim i As Integer
    On Error Resume Next
    i = Round(Val(var))

    ' if error occurs, i will be 0
    CastInt = i

End Function

Конечно, вы также можете вспомнить случаи, когда люди используют запятые и точки, например, три тысячи как 3000,00. Если вам требуется функциональность для подобных случаев, вам нужно найти другое решение.

6
PeterH

Попробуйте это: currentLoad = ConvertToLongInteger(oXLSheet2.Cells(4, 6).Value) с этой функцией:

Function ConvertToLongInteger(ByVal stValue As String) As Long
 On Error GoTo ConversionFailureHandler
 ConvertToLongInteger = CLng(stValue)  'TRY to convert to an Integer value
 Exit Function           'If we reach this point, then we succeeded so exit

ConversionFailureHandler:
 'IF we've reached this point, then we did not succeed in conversion
 'If the error is type-mismatch, clear the error and return numeric 0 from the function
 'Otherwise, disable the error handler, and re-run the code to allow the system to 
 'display the error
 If Err.Number = 13 Then 'error # 13 is Type mismatch
      Err.Clear
      ConvertToLongInteger = 0
      Exit Function
 Else
      On Error GoTo 0
      Resume
 End If
End Function

Я выбрал Long (Integer) вместо простого Integer, потому что минимальный/максимальный размер Integer в VBA является грубым (min: -32768, max: +32767). Обычно в операциях с электронными таблицами целое число находится за пределами этого диапазона.

Приведенный выше код может быть изменен для обработки преобразования из строки в целые числа, в валюту (используя CCur ()), в десятичную (используя CDec ()), в двойную (используя CDbl ()) и т.д. Просто замените сама функция преобразования (CLng). Измените тип возвращаемого значения функции и переименуйте все вхождения переменной функции, чтобы все было согласованно.

2
Isaac Comer-Wyrd

Чтобы поместить это в одну строку:

currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
0
ray