Error nº 13 en la función Evaluate

5 envíos / 0 nuevos
Último envío
xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Error nº 13 en la función Evaluate

Para los hispanoparlantes, o sea, todos los de este foro.

La función VBA Evaluate es bastante interesante, ya que permite evaluar funciones de Excel como si estuviéramos calculando con Excel en vez de ejecutando una función de macro VBA.

Pues bien, ojo al usarla, puesto que si no se tiene la configuración de separador decimal = "."... la rutina Test 2 funcionará, pero Test1 arrojará Error "13" en tiempo de ejecución. No coinciden los tipos.

No me resultó muy inmediato llegar a esta conclusión, a pesar de todas las precauciones que adopto con la declaración correcta de variables.

 

Sub Test1()

    Dim dbValue As Double

    Dim lgRespuesta as long

 

    dbValue = 3.1415

    lgRespuesta = MsgBox Evaluate("SIN(" & dbValue & ")")

End Sub

 

Sub Test2()

    Dim dbValue As Double

 

    dbValue = 3.1415

    lgRespuesta = MsgBox Evaluate("SIN(" & dbValue & ")")

End Sub

Etiquetas: 

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Error nº 13 en la función Evaluate

Ya puestos, una solución a este problema y otros derivados de la configuración del sistema.

 

Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Public Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long

 

'Llamada a API GetLocalInfo

Public Const LOCALE_USER_DEFAULT = &H400            'Separador decimal para números

Public Const LOCALE_SDECIMAL As Long = &HE

Public Const LOCALE_ILDATE As Long = &H22

Public Const LOCALE_ICOUNTRY As Long = &H5

Public Const LOCALE_SCURRENCY As Long = &H14        'Símbolo de moneda local

Public Const LOCALE_ICURRENCY As Long = &H1B

Public Const LOCALE_SINTLSYMBOL As Long = &H15      'intl símbolo monetario

Public Const LOCALE_SMONDECIMALSEP As Long = &H16   'Separador decimal monetario

Public Const LOCALE_SMONTHOUSANDSEP As Long = &H17  'Separador millar monetario

Public Const LOCALE_SMONGROUPING As Long = &H18     'Separador de listas monetario o ¿Número de grupos en grupo?

Public Const LOCALE_ICURRDIGITS As Long = &H19      '# digitos moneda local o ¿Número de grupos en grupo?

Public Const LOCALE_SENGCOUNTRY As Long = &H1002    'English name of country

Public Const LOCALE_SENGLANGUAGE As Long = &H1001   'English name of language

Public Const LOCALE_SNATIVELANGNAME As Long = &H4   'Native name of language

Public Const LOCALE_SNATIVECTRYNAME As Long = &H8   'Native name of country

 

Public Sub sConfiguracionLatina(Optional ByRef bConfiguracionLatina As Boolean = True)

    If bConfiguracionLatina Then

    'SEPARADOR DECIMAL

        'Establece a "," el símbolo del separador decimal para números

        SetLocaleInfo &H400, 14, ","

    

    'SEPARADOR MILES

        'Establece a "." el símbolo de separación de miles para números

        SetLocaleInfo &H400, 15, "."

        

    'SEPARADOR DECIMAL MONEDA

        'Establece a "," el símbolo del separador decimal para moneda

        SetLocaleInfo &H400, 22, ","

        

    'SEPARADOR MILES MONEDA

        'Establece a "." el símbolo de separación de miles para moneda

        SetLocaleInfo &H400, 23, "."

    Else

        Call sConfiguracionAnglosajona

    End If

End Sub

 

Public Sub sConfiguracionAnglosajona(Optional ByRef bConfiguracionAnglosajona As Boolean = True)

    If bConfiguracionAnglosajona Then

    'SEPARADOR DECIMAL

        'Establece a "," el símbolo del separador decimal para números

        SetLocaleInfo &H400, 14, "."

    

    'SEPARADOR MILES

        'Establece a "." el símbolo de separación de miles para números

        SetLocaleInfo &H400, 15, ","

        

    'SEPARADOR DECIMAL MONEDA

        'Establece a "," el símbolo del separador decimal para moneda

        SetLocaleInfo &H400, 22, "."

        

    'SEPARADOR MILES MONEDA

        'Establece a "." el símbolo de separación de miles para moneda

        SetLocaleInfo &H400, 23, ","

    Else

        Call sConfiguracionLatina

    End If

End Sub

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 8 horas 18 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
para terminar de liarlo

Muchas gracias por compartir esta información tan interesante.

 

Respecto del símbolo decimal, imagino que sabrás que Excel puede trabajar en cada libro con una configuración de separador decimal diferente (que puede ser diferente a la del sistema), lo digo por si alguna vez se te presenta la situación, por lo menos para tenerlo presente por si acaso no coincide con lo del sistema.

http://www.necesitomas.com/consulta_web_excel_comas_puntos

 

------
Ya sé Excel, pero necesito más.

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 8 horas 18 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
Application.WorksheetFunction

en vez de Evaluate, para utilizar funciones de Excel en el código yo utilizo Application.WorksheetFunction

esto no compone una cadena de texto como Evaluate, sino que es una función en VBA con sus argumentos, así que un número (o una variable double) siempre es un número

 

------
Ya sé Excel, pero necesito más.

xoan ninguen
Imagen de xoan ninguen
Offline
última acción: Hace 3 años 9 meses
Nivel 1 - 200 puntosNivel 2 - 500 puntos
alta: 19/01/2011 - 10:03
Puntos: 835
Re: Application.WorksheetFunction

Como ya posteé, yo lo cambio vía código, por ahorrarme dos clicks XDD

 

Me surgió el problema en la traducción del formato BC3, en el campo ~M de mediciones, decidí completar de una santa vez la parte que convirte fórmulas en comentarios en fórmulas programables... y de repente, zasca, el error de marras que me dejó descolocado "Tipo no correcto", con lo cuidadoso que soy yo para esas cosas, que hasta las llamadas a las funciones las precedo del VBA. y evito los Variant como a la peste.

 

El Application.WorkSheetFunction no serviría para estas cosas... lamentablemente.

 

 

Ostras... ahora que reviso el primer post, el código no era ese si no este otro, las prisas del copy+paste...

 

Sub Test1()

    Dim dbValue As Double

    Dim lgRespuesta as long

 

    dbValue = 3.1415

    lgRespuesta = MsgBox Evaluate("SIN(" & dbValue & ")")

End Sub

 

Sub Test2()

    Dim dbValue As Double

    Dim lgRespuesta as long

 

    dbValue = 3

    lgRespuesta = MsgBox Evaluate("SIN(" & dbValue & ")")

End Sub

-----------------------------------------------------------------

www.TrazEX.com (soluciones sobre Excel)