vba将string转换为int如果string是一个数字
我需要将从VBA中获得的string转换为整数。 为此,我使用了CInt(),这很好。 但是有一个机会,string可能是一个数字以外的东西,在这种情况下,我需要将整数设置为0.目前我有:
If oXLSheet2.Cells(4, 6).Value <> "example string" Then currentLoad = CInt(oXLSheet2.Cells(4, 6).Value) Else currentLoad = 0 End If
问题是,我不能预测可能在这个单元格中的所有可能的非数字string。 有一种方法,我可以告诉它转换,如果它是一个整数,并设置为0,如果不是?
干杯
使用IsNumeric。 如果是数字,则返回true,否则返回false。
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
强制转换或转换为int,注意以下几点。
这些函数是Excel VBA中视系统区域设置而定的视图函数之一。 所以如果你在欧洲某些国家使用逗号,那么在美国你会遇到一个错误。
例如,在欧洲版本的0,5版本中,CDbl()会performance良好,但是在美版中它将会导致5版本。所以我build议使用下面的替代方法:
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的三千。 如果您需要这些types的function,那么您必须检查另一个解决scheme。
试试这个: 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
我select了Long(Integer)而不是简单的Integer,因为VBA中Integer的最小/最大大小是非常糟糕的(min:-32768,max:+ 32767)。 在电子表格操作中,在该范围之外使用一个整数是很常见的。
上面的代码可以被修改来处理从string到整数,到货币(使用CCur()),到十进制(使用CDec()),到双精度(使用CDbl())等等的转换。转换函数本身(CLng)。 更改函数返回types,并重命名函数variables的所有出现,以使所有内容保持一致。
把它放在一条线上:
currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
这里有三个可能有用的function。 首先检查string是否为正确的数字格式,第二个和第三个函数将string转换为Long或Double。
Function IsValidNumericEntry(MyString As String) As Boolean '******************************************************************************** 'This function checks the string entry to make sure that valid digits are in the string. 'It checks to make sure the + and - are the first character if entered and no duplicates. 'Valid charcters are 0 - 9, + - and the . '******************************************************************************** Dim ValidEntry As Boolean Dim CharCode As Integer Dim ValidDigit As Boolean Dim ValidPlus As Boolean Dim ValidMinus As Boolean Dim ValidDecimal As Boolean Dim ErrMsg As String ValidDigit = False ValidPlus = False ValidMinus = False ValidDecimal = False ValidEntry = True For x = 1 To Len(MyString) CharCode = Asc(Mid(MyString, x, 1)) Select Case CharCode Case 48 To 57 ' Digits 0 - 9 ValidDigit = True Case 43 ' Plus sign If ValidPlus Then 'One has already been detected and this is a duplicate ErrMsg = "Invalid entry....too many plus signs!" ValidEntry = False Exit For ElseIf x = 1 Then 'if in the first positon it is valide ValidPlus = True Else 'Not in first position and it is invalid ErrMsg = "Invalide entry....Plus sign not in the correct position! " ValidEntry = False Exit For End If Case 45 ' Minus sign If ValidMinus Then 'One has already been detected and this is a duplicate ErrMsg = "Invalide entry....too many minus signs! " ValidEntry = False Exit For ElseIf x = 1 Then 'if in the first position it is valid ValidMinus = True Else 'Not in first position and it is invalid ErrMsg = "Invalide entry....Minus sign not in the correct position! " ValidEntry = False Exit For End If Case 46 ' Period If ValidDecimal Then 'One has already been detected and this is a duplicate ErrMsg = "Invalide entry....too many decimals!" ValidEntry = False Exit For Else ValidDecimal = True End If Case Else ErrMsg = "Invalid numerical entry....Only digits 0-9 and the . + - characters are valid!" ValidEntry = False Exit For End Select Next If ValidEntry And ValidDigit Then IsValidNumericEntry = True Else If ValidDigit = False Then ErrMsg = "Text string contains an invalid numeric format." & vbCrLf _ & "Use only one of the following formats!" & vbCrLf _ & "(+dd.dd -dd.dd +dd -dd dd.d or dd)! " End If MsgBox (ErrMsg & vbCrLf & vbCrLf & "You Entered: " & MyString) IsValidNumericEntry = False End If End Function Function ConvertToLong(stringVal As String) As Long 'Assumes the user has verified the string contains a valide numeric entry. 'User should call the function IsValidNumericEntry first especially after any user input 'to verify that the user has entered a proper number. ConvertToLong = CLng(stringVal) End Function Function ConvertToDouble(stringVal As String) As Double 'Assumes the user has verified the string contains a valide numeric entry. 'User should call the function IsValidNumericEntry first especially after any user input 'to verify that the user has entered a proper number. ConvertToDouble = CDbl(stringVal) End Function