visual variable tipos numero datos convertir clng cint cdbl excel vba excel-vba

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