jueves, 9 de febrero de 2017

Introducción de datos en Excel con un cuadro de diálogo


Veamos en este artículo una forma alternativa de introducir datos en Excel. A veces, al usuario le puede resultar un incordio o muy complicado introducir un valor en determinada celda de nuestro libro de Excel y necesita una forma de "canalizar" dicha introducción de datos. Las razones podrían ser:

  1. La celda está en una hoja distinta a la que se encuentra el usuario cuando necesita introducir el dato. De esta forma, el usuario tendría que activar otra hoja, seleccionar la celda adecuada, introducir el dato, presionar "Intro" y activar de nuevo la hoja donde se encontraba.
  2. La celda se encuentra en la misma hoja, pero es necesario realizar un scroll de la pantalla muy largo y tedioso hasta encontrar dicha celda y posteriormente volver a la situación inicial posiblemente con el mismo scroll.
  3. La celda se encuentra oculta tras un objeto (forma, imagen, gráfico, etc.) o bien tiene un formato que hace imposible su distinción (color de fuente igual al color de fondo, por ejemplo).
  4. El valor que deseamos que aparezca en la celda es distinto al que conoce el usuario. Por ejemplo,  el usuario podría conocer una base imponible y nosotros desear que el valor introducido finalmente en la celda objetivo sea baseimponible*IVA.
  5. El valor debe cumplir con alguna condición. Por ejemplo, podríamos impedir al usuario que continúe utilizando la aplicación de Excel, obligándole a que introduzca un dato "sí o sí".
  6. Incluso es posible que la pretensión no sea que el dato a introducir se visualice, sino que solo es necesario a nivel interno de Excel para algún proceso.



La solución a estas eventualidades es ofrecer al usuario que el dato lo introduzca cómodamente en un cuadro de dialogo que emerge en la pantalla y que Excel (mediante código VBA) se encargue de "llevar" ese dato a la celda correspondiente, allá donde esté.

Esto se consigue mediante la función de VBA: Inputbox, cuya sintaxis es:

InputBox(Mensaje, Título, Valor por defecto, posición x, posición y)

Mensaje = Mensaje que vemos justo encima del campo donde el usuario introduce el valor.
Título = Título del cuadro de diálogo que se muestra en la barra superior de este.
Valor por defecto = Valor que se muestra en el campo donde el usuario introduce el valor y que se considerará por defecto en el caso de que no se introduzca expresamente ningún valor.
Posición x = nº de twips que el cuadro se situará hacia la derecha, desde el borde izquierdo de la pantalla (15 twips = 1pixel).
Posición y = nº de twips que el cuadro se situará hacia abajo, desde el borde superior de la pantalla (15 twips = 1pixel). 



A continuación proponemos un ejemplo de código para cada caso de los que enumeramos al principio, donde el lector podrá personalizar el código que aparece en verde, según sus necesidades. Excepto en el ejemplo nº 5, el código se debe escribir en un Módulo ya existente o en uno nuevo (para insertar un módulo, ir al Editor de VBA (Alt+F11) y después hacer click en el menú Insertar / Módulo.) y se debe ejecutar, por ejemplo, asignando la macro resultante "EntradaDatos" a un botón o activando la ficha "Vistas" / Grupo "Macros" / "Ver Macros" / "Ejecutar".

Caso 1: Introducción de un texto (sin condiciones) desde un cuadro de diálogo en la hoja3, estando en la hoja1.

Sub EntradaDatos()
    Dim Entrada As String

    Entrada = InputBox(Chr(13) & Chr(13) & Chr(13) & Chr(13) & "Introduzca su nombre", "Nombre", "Introduzca aquí su nombre", 1000, 1000)
    If Entrada = "
Introduzca aquí su nombre" Then Entrada = ""
    Sheets("
hoja3").Range("A1") = Entrada
End Sub


Caso 2: Introducción de un texto (sin condiciones) desde un cuadro de diálogo en la celda A1000 de la hoja1, estando en la celda A1 de la hoja1.

Sub EntradaDatos()    Dim Entrada As String
    Entrada = InputBox(Chr(13) & Chr(13) & Chr(13) & Chr(13) &  "Introduzca su nombre", "Nombre", "Introduzca aquí su nombre", 10001000) 
    If Entrada = "
Introduzca aquí su nombre" Then Entrada = ""
    Range ("
A1000") = Entrada
    Range ("
A1").Select
End Sub


Caso 3: Igual al anterior.

Caso 4: Introducción de un número que es una base imponible en un cuadro de diálogo, para que Excel convierta dicha base imponible en el TOTAL (Base Imponible + IVA). 

Sub EntradaDatos()
    Dim Entrada As Double
    Entrada = InputBox(Chr(13) & Chr(13) & Chr(13) & Chr(13) & "Introduzca la base imponible", "Convertir Base imponible en TOTAL", 0, 1000, 1000)
    Range("
A5") = Entrada * 1.21
End Sub

Caso 5: Al abrir el archivo, el usuario debe introducir algo en el campo del cuadro de diálogo. Mientras no sea así, el cuadro no se puede cerrar. Si el valor introducido no coincide con una contraseña, Excel se cierra sin otra posibilidad. Si este código se introduce en el objeto "Thisworkbook" con el evento "open", hace un efecto similar al cifrado del archivo mediante contraseña.

Private Sub Workbook_Open()
Dim Entrada As Variant
Do
    Entrada = InputBox(Chr(13) & Chr(13) & Chr(13) & Chr(13) & "
Introduzca la contraseña", "Contraseña", "Introduzca aquí la contraseña", 1000, 1000)
Loop Until Entrada <> ""
If Entrada <> "
temporaexcel" Then
    ThisWorkbook.Close True
End If
End Sub

Si queremos ver un archivo con los ejemplos 4 y 5, podemos descargarnos el libro Excel:

https://www.dropbox.com/s/0g5ly3lxui3isj0/Input%20box.xlsm?dl=0

Si deseamos saber cómo proteger nuestro código escrito en VBA, visitar este artículo:

Protección del código VBA en Excel


  José Manuel Pomares Medrano



2 comentarios:

  1. gracias amigo pero tengo una pregunta como puedo hacer para que al guardarlo me aparezca el cuadro de texto

    ResponderEliminar
  2. Excelente aporte! Muchas gracias :)

    ResponderEliminar