excel - tipos - convertir variable string a integer vba
vba convertir cadena a int si string es un nĂºmero (5)
Necesito convertir una cadena, obtenida de excel, en VBA a un interger. Para hacerlo, estoy usando CInt () que funciona bien. Sin embargo, existe la posibilidad de que la cadena sea diferente a un número, en este caso necesito establecer el entero en 0. Actualmente tengo:
If oXLSheet2.Cells(4, 6).Value <> "example string" Then
currentLoad = CInt(oXLSheet2.Cells(4, 6).Value)
Else
currentLoad = 0
End If
El problema es que no puedo predecir todas las posibles cadenas no numéricas que podrían estar en esta celda. ¿Hay alguna manera en que pueda decir que se convierta si es un número entero y se establece en 0 si no?
Cheers Cap
Aquí hay tres funciones que pueden ser útiles. Primero verifica la cadena para un formato numérico apropiado, la segunda y tercera función convierte una cadena en Long o 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
Para ponerlo en una línea:
currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
Pruebe esto: currentLoad = ConvertToLongInteger(oXLSheet2.Cells(4, 6).Value)
con esta función:
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
Elegí Long (Entero) en lugar de simplemente Entero porque el tamaño mínimo / máximo de un Entero en VBA es pésimo (mínimo: -32768, máximo: +32767). Es común tener un número entero fuera de ese rango en las operaciones de hoja de cálculo.
El código anterior se puede modificar para manejar la conversión de cadena a-Enteros, a-Moneda (usando CCur ()), a-Decimal (usando CDec ()), a-Doble (usando CDbl ()), etc. Simplemente reemplace el función de conversión en sí (CLng). Cambie el tipo de devolución de función y cambie el nombre de todas las apariciones de la variable de función para que todo sea coherente.
Transmitir a largo o convertir a int, tenga en cuenta lo siguiente.
Estas funciones son una de las funciones de visualización en Excel VBA que dependen de la configuración regional del sistema. Entonces, si usa una coma en su doble como en algunos países de Europa, experimentará un error en los EE. UU.
Por ejemplo, en european excel-version 0,5 funcionará bien con CDbl (), pero en la versión de EE. UU. Resultará en 5. Así que recomiendo usar la siguiente alternativa:
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
Por supuesto, también puede pensar en casos en que las personas usan comas y puntos, por ejemplo, tres mil como 3,000.00. Si necesita funcionalidad para este tipo de casos, entonces debe buscar otra solución.
Use IsNumeric. Devuelve verdadero si es un número o falso de lo contrario.
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