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
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)
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.
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.
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)