Parece que el tema de los decimales tiene mal a mas de uno, y realmente nos puede presentar inconvenientes al momento de imputar numeros en una celda desde VBA, dado que el separador decimal puede ser tanto una coma como un punto, dependiendo de la configuración regional del equipo. Veremos aquí dos formas de detectar esto: utilizando la colección de Windows Script Host (con la cual accedemos al Registro de Windows) y otra muy casera y manual... como para "zafar" de la situación sin recurrir a bibliotecas externas.
[+/-] Ver el resto / Ocultar
Una solución muy "gaucha" y sin vueltas:
Veremos reflejado en Excel:
Luego de esto podríamos invocar a una función que busque en A1 la coma o el punto y allí saber con que separador decimal trabaja el ordenador:
Y listo el asunto. Pero este ejemplo, extremadamente básico y que hace uso de herramientas muy muy caseras, deja un sabor a "poco". Existe una forma mucho mas eficaz de observar la configuración regional, pero no solamente en lo que respecta a decimales, si no aplicado a cualquier aspecto del equipo: WSH, o mas comunmente conocido como Windows Script Host Object Model, que nos permitirá leer el registro de Windows en busca de información. Existe una rama del Registro en donde encontraremos toda esta información: Control Panel\International.
Empecemos con el trabajo.
Como primer medida referenciaremos este objeto: vamos al menú Herramientas / Referencias y del formulario emergente seleccionamos el mencionado objeto:
Ahora que tenemos a nuestro OCX dentro de Excel trabajaremos con el. Crearemos una función que lee un determinado valor del Registro de Windows y nos lo devuelve.
En una primera instancia y para ver que signo es el separador decimal, sería:
Ejecutamos y:
Pero ya que armamos tanto código... no vamos a contentarnos solamente con una simple coma, por mas que esta nos ayude. Armamos la siguiente tabla:
Luego de ejecutar el Sub arriba descripto observemos la columna C:
Podemos ahora, muy tranquilamente, ver que configuración regional tiene el equipo sobre el cual correrá nuestro proyecto, y actuar en consecuencia.
En siguientes entradas ahondaremos los conceptos sobre WSH, dado que nos permitirá un control total sobre el Registro de Windows, creando, modificando y eliminando entradas.
Sub ColocarNumeroDecimal() [a1] = 1.5 End SubSi, en A1 (o en cualquier celda de una hoja, preferentemente oculta) coloco desde VBA un nro decimal, en este caso: 1.5 (y en VBA me veo obligado a usar el punto, ya que es formato yanqui).
Veremos reflejado en Excel:
bien, tengo la configuración regional de Argentina: uso coma para el separador decimal
Luego de esto podríamos invocar a una función que busque en A1 la coma o el punto y allí saber con que separador decimal trabaja el ordenador:
Sub ColocarNumeroDecimal() [a1] = 1.5 'coloco un error_handler On Error Resume Next 'y con HALLAR() busco la coma en A1 sD = Application.WorksheetFunction.Find(",", [a1]) 'si el codigo de arriba devuelve error.... no hay 'coma, entonces pongo un punto en A2 If Err.Number <> 0 Then [a2] = "." Else 'si NO hay error, encontró la coma y pongo 'dicho caracter en A2 [a2] = "," End If End Sub
Y listo el asunto. Pero este ejemplo, extremadamente básico y que hace uso de herramientas muy muy caseras, deja un sabor a "poco". Existe una forma mucho mas eficaz de observar la configuración regional, pero no solamente en lo que respecta a decimales, si no aplicado a cualquier aspecto del equipo: WSH, o mas comunmente conocido como Windows Script Host Object Model, que nos permitirá leer el registro de Windows en busca de información. Existe una rama del Registro en donde encontraremos toda esta información: Control Panel\International.
Empecemos con el trabajo.
Como primer medida referenciaremos este objeto: vamos al menú Herramientas / Referencias y del formulario emergente seleccionamos el mencionado objeto:
presionamos Aceptar.
Ahora que tenemos a nuestro OCX dentro de Excel trabajaremos con el. Crearemos una función que lee un determinado valor del Registro de Windows y nos lo devuelve.
En una primera instancia y para ver que signo es el separador decimal, sería:
'creo la variable de objeto WSH Dim Registro_Win As WshShell 'y dos constantes, que definiran las ramas a leer del registro Private Const MaquinaLocal As String = "HKEY_LOCAL_MACHINE" Private Const UsuarioActual As String = "HKEY_CURRENT_USER" Function LecturaDeRegistro(Usuario As String, Valor As String) As String 'utilizo el método RegRead del objeto para leer el valor pasado como argumento: LecturaDeRegistro = Registro_Win.RegRead(Usuario & "\Control Panel\International\" & Valor) End Function Sub MostrarValor() 'seteo el objeto y lo apunto a WSH Set Registro_Win = New WshShell 'y mediante un MsgBox retorno el valor buscado: MsgBox LecturaDeRegistro(UsuarioActual, "sMonDecimalSep"), vbInformation End Sub
Ejecutamos y:
si... la coma.
Pero ya que armamos tanto código... no vamos a contentarnos solamente con una simple coma, por mas que esta nos ayude. Armamos la siguiente tabla:
en la primer columna tenemos un detalle de lo que deseamos conseguir, en la segunda el argumento y luego de correr nuestro código en la tercera obtendremos la configuración regional del equipo
Sub MostrarValor() 'seteo el objeto y lo apunto a WSH Set Registro_Win = New WshShell 'recorro la segunda columna de la tabla y tomo el valor presente en 'cada celda para pasarlo como argumento de la función: For i = 2 To 12 Cells(i, 3).Value = LecturaDeRegistro(UsuarioActual, Cells(i, 2)) Next i Set Registro_Win = Nothing End Sub
Luego de ejecutar el Sub arriba descripto observemos la columna C:
En siguientes entradas ahondaremos los conceptos sobre WSH, dado que nos permitirá un control total sobre el Registro de Windows, creando, modificando y eliminando entradas.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario