Archive
EXCELeINFO addin 2.4.0 – Visualizar Configuración regional y de idioma desde Excel con Application.International
Hace días me hice la pregunta: Para qué ir al Panel de control para ver mi configuración de regional ? Por ejemplo, qué separador de listas tengo configurado, qué idioma tengo configurados, qué formato de fecha tengo.
Me di a la tarea de comprender el funcionamiento de la propiedad International del objeto Application, y me di cuenta que es más sencillo de lo que podría parecer.
Si por ejemplo, queremos saber el símbolo de moneda que maneja nuestro Excel, sólo ejecutamos:
Sub Moneda() MsgBox Application.International(xlCurrencyCode) End Sub
Imagen del addin
Listado de configuraciones que muestra el addin
Configuración de país o región
Constante | Significado |
xlCountryCode |
Versión de país o región de Microsoft Excel. |
xlCountrySetting |
Configuración actual de país o región en el Panel de control de Windows. |
xlGeneralFormatName |
Nombre del formato numérico General. |
Moneda
Constante | Significado |
xlCurrencyCode |
Símbolo de moneda. |
xlCurrencyDigits |
Número de decimales que van a utilizarse en los formatos de moneda. |
xlNoncurrencyDigits |
xlNoncurrencyDigits |
Fecha y hora
Constante | Significado |
xl24HourClock |
Muestra si el formato de hora que se utiliza es de 24 horas o si es de 12 horas. |
xlDateOrder | Orden de los elementos de la fecha. |
xlDateSeparator |
Separador de fecha (/). |
Separadores
Constante | Significado |
xlDecimalSeparator |
Separador decimal. |
xlListSeparator |
Separador de lista. |
xlThousandsSeparator |
Separador de miles o cero. |
Permitir 3 intentos de contraseña para usar un archivo de Excel antes de cerrarse
En un post anterior llamado Simular acceso con usuario y password en Excel con formulario vba presentaba un ejemplo en el que teníamos un formulario que nos solicita usuario y contraseña. Tanto el usuario como la contraseña los tomaba de una tabla y sólo cuando ambos coincidían, permitía cerrar el formulario y continuar.
En este ocasión, y tomando en cuenta el post mencionado, comparto un formulario que se lanza al momento de abrir nuestro archivo de Excel y nos solicita una contraseña para usarlo.
Cómo funciona
A diferencia del otro formulario, este sólo pide una clave de acceso para poder usar el archivo. En caso de que intentemos en 3 ocasiones una clave y ésta sea inválida, se cerrará el archivo.
Código
'Definimos la variable pública Intentos Public Intentos As Byte ' 'Validar la clave Private Sub CommandButton1_Click() If Me.txtPass.Value = 1234 Then MsgBox "Contraseña válida. Se cerrará el formulario.", _ vbInformation, "EXCELeINFO" Unload Me Else Intentos = Intentos + 1 MsgBox "Contraseña inválida. Llevas " & Intentos & " intento(s).", _ vbInformation, "EXCELeINFO" Me.txtPass.SetFocus Me.txtPass.Value = "" End If If Intentos = 3 Then MsgBox "Has cumplido 3 intentos. Aquí se cerrará el archivo Excel.", _ vbInformation, "EXCELeINFO" Unload Me ActiveWorkbook.Close SaveChanges:=False Else End If End Sub ' 'Formateamos los objetos del formulario Private Sub UserForm_Initialize() With Me .txtPass.PasswordChar = "*" .txtPass.MaxLength = 8 End With End Sub ' 'Evitamos que use la x para cerrar el formulario Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True MsgBox "Por favor, ingresa una contraseña.", vbInformation, "EXCELeINFO" End If End Sub
Animación del formulario en acción
Guardar archivo de Excel solo si se ingresa contraseña
En el artículo llamado Macro para impedir que se guarde un archivo de Excel exponíamos una macro que no te permitía guardar cambios en un archivo ni guardar una copia del mismo.
El código tiene la debilidad de que si queremos, como creadores, guardar cambios que no querramos que otros modifiquen, debíamos deshabilitar macros para hacer los cambios y luego volver a habilitarlas.
La mejora
Mediante la función InputBox lanzamos un diálogo que nos permite introducir una contraseña, y sólo si ingresamos la adecuada, nos permitirá guardar cambios o guardar una copia.
Código
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Pass = "12345" Confirma = InputBox("Escribe una contraseña para continuar.", _ "EXCELeINFO - Guardar") If Confirma = Pass Then Else MsgBox "No tienes permitido guardar el archivo.", vbCritical, _ "EXCELeINFO" Cancel = True End If End Sub
Animación de la macro en ejecución
Pedir confirmación antes de ejecutar una macro en Excel
Cuando escribimos una macro, siempre lo hacemos a conciencia y sabiendo los cambios que hará, pero para el usuario final, siempre debemos dejarle la decisión de aplicar los cambios o no.
Pareciera algo contradictorio, pero para cualquier aplicación, siempre es recomendable enviar un aviso informando al usuario que está a punto de ejecutar una acción y lo dejamos a su consideración.
El siguiente código, dentro de su simpleza contiene la lógica de decidir si sí o no continuamos la ejecución de la macro.
Cómo funciona
Primeramente asignamos una variable llamada Resp que es la que almacenará el resultado de la clase MsgBox, cuyos valores serán Si o No (vbYes, vbNo).
La lógica del código es:
Si Resp es igual a SI, entonces ejecuta el código
Sino
Muestra un mensaje o ejecuta otro código
Código de la macro
Sub Confirmar() Dim Resp As Byte Resp = MsgBox("Deseas continuar con la ejeción de la macro?", _ vbQuestion + vbYesNo, "EXCELeINFO") If Resp = vbYes Then MsgBox "Se eligió continuar...", vbExclamation, "EXCELeINFO" 'Aquí se ejecutaría el código Else MsgBox "Se eligió cancelar...", vbCritical, "EXCELeINFO" End If End Sub
Animación de la macro en ejecución
Nuevas funciones Excel 2013: SI.ND combinada con BUSCARV
Una de las funciones que vienen con el lanzamiento de Excel 2013 es SI.ND, cuya descripción es: “Devuelve el valor que especificas, si la expresión se convierte en #N/A. De lo contrario, devuelve el resultado de la expresión”.
La función SI.ERROR
Excel 2010 introdujo la función SI.ERROR para devolver un valor especificado, en caso de que la fórmula devuelva #N/A, #¡DIV/0!, #¿NOMBRE?, pero la cuestión es que arrojará un resultado sin detectar cuál fue el error devuelto.
Cómo funciona SI.ND con BUSCARV
La función con la cual se combinará es con la famosa BUSCARV. Dicha función devuelve precisamente #N/A cuando un valor no se encuentra en la lista, lo cual se vuelve de mucha utilidad sin tomamos en cuenta que dicha función es una de las más utilizadas entre los usuarios de Excel.
Animación de la función en ejecución
Crear fórmulas Excel con macros independientemente del idioma o separador de argumentos, coma o punto y coma
Cuando queremos insertar fórmulas en Excel mediante macros, nos encontramos con 2 disyuntivas:
-
Usar el nombre de la función mdiante lenguaje vba, es decir, su parte en inglés que sea compatible con cualquier Excel en cualquier idioma.
-
Escribir la fórmula en nuestro propio lenguaje, cual sea que este fuera, adecuando el separador de argumentos: coma (,) o punto y coma(;), pero sólo compatible con otro Excel en nuestro idioma
Insertar fórmulas mediante vba aplicables a Excel en cualquier idioma
Supongamos que necesitamos insertar en una celda la función BUSCARV desde vba. Si esta macro se utilizará en otras versiones de Excel con diferentes idiomas al que usamos, lo mejor será usar los nombres en inglés.
Desde vba usamos la propiedad FORMULA del objeto RANGE:
Range("F6").Formula = "=VLOOKUP(E6,A1:B12,2,0)"
Insertar fórmulas mediante vba aplicables a nuestro idioma
La misma función BUSCARV la deseamos escribir desde vba en nuestro mismo idioma. Para eso debemos hace uso de la propiedad FORMULALOCAL del objeto RANGE.
Range("F6").FormulaLocal = "=BUSCARV(E6,A1:B12,2,0)"
El caso del separador de argumentos cuando es coma o punto y coma
El separador de listas o argumentos varía dependiendo de la configuración regional de nuestro sistema. Por ejemplo, es coma cuando la cofiguración es el Español y punyo y coma cuando la configuración en el inglés. Pero como no nos interesa escribir fórmulas para cada tipo de región, mejor hacemos uso de la propiedad INTERNATIONAL del objecto APPLICATION, para meter a una variable el separador que nos detecte Excel.
Para obtener el separador de argumentos configurado en el Panel de control usamos la siguiente instrucción:
Application.International(xlListSeparator)
Y si dejamos el separador como variable, las instruccones quedarían así:
'Obtener el separador de argumentos Separador = Application.International(xlListSeparator) 'Para fórmula multi idioma Range("F6").Formula = "=VLOOKUP(E6" & Separador & "A1:B12" & Separador & _ "2" & Separador & "0)" 'Para fórmula en nuestro idioma Range("F6").FormulaLocal = "=BUSCARV(E6" & Separador & "A1:B12" & Separador & _ "2" & Separador & "0)"
Comentarios recientes