Un amigo de la provincia de Salta, una de las mas hermosas de Argentina, me consulta lo siguiente: "-Tengo una planilla a la que hay que cargarle determinados datos... si estos datos no con completados por el usuario, la acción de imprimir debe cancelarse. ¿Se puede lograr?". En Excel, y mas aún utilizando macros... todo se puede lograr.
No estamos ante una tarea complicada, ya que el proyecto requiere de poco código y, encima, VBA nos provee de las herramientas necesarias para facilitarnos las cosas.
Lo primero es ir al editor de Visual Basic (Alt + F11) y hacer click en "ThisWorkbook", en la ventana del Explorador de Proyectos, para así abrir automáticamente (sobre la derecha) la ventana de código del libro:
de las listas desplegables superiores seleccionamos "Workbook" y luego "BeforePrint", tal como se observa en la imagen de arriba. Todo el código irá ahí escrito.
[+/-] Ver el resto / Ocultar
Repasemos las nociones básicas.
Visual Basic es un lenguaje "orientado a eventos" y, casualmente, "BeforePrint" (AntesDeImprimir) es un evento. Todo el código que escribamos dentro de ese Sub se ejecutará antes de que se produzca la impresión de la hoja. Si nos fijamos bien, ese procedimiento (Sub) trae un argumento predeterminado por el propio programa: Cancel, de origen booleano (que solo acepta dos posibles valores: verdadero o falso). Y este punto es el que nos dará control total sobre la impresión y así lograremos cancelarla si algo "no nos gusta" o salió mal. Veamos:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim CantCopias As Byte
Dim QueFalta As String
QueFalta = ""
CantCopias = 1
'reviso celda x celda, utilizando a If...
'luego de cada revisión, y si falta el dato, guardo
'en la variable "QueFalta" el nombre del campo, así
'ayudo al usuario a identificar la falla:
If Trim(Range("b1").Value) = "" Then
Cancel = True
QueFalta = "Apellido"
ElseIf Trim(Range("b2").Value) = "" Then
Cancel = True
QueFalta = "Nombre"
ElseIf Trim(Range("b3").Value) = "" Then
Cancel = True
QueFalta = "Edad"
Else
Cancel = False
End If
'si Cancel = True, entonces hubo alguna omisión, la cual
'muestro a través de un MsgBox, usaon la variable "QueFalta"
'para mostrarle al usuario donde estuvo el problema:
If Cancel = True Then
MsgBox "Faltan dados (" & QueFalta & "). La impresión se cancela", vbCritical, "Error"
Else
'si todo sale bien (cancel=false), imprimo la cantidad
'de copias que tengo en la variable "CantCopias"
ActiveSheet.PrintOut copies:=CantCopias
End If
End Sub
Como siempre trato de hacer, el código se encuentra bien comentado, a los efectos de un rápido análisis y comprensión del código.
En este ejemplo realicé algo muy, pero muy sencillo: en la hoja se pide apellido, nombre y edad (podrían ser 100 campos, pero 3 alcanzan para el ejemplo; aparte soy bastante vago y no me gusta renegar con esos detalles =):
de entrada, en este muy básico formulario de hoja, podemos observar que falta el nombre.
A este código no será necesario asignarle ningún botón ni otro objeto para "disparar" el evento: recordemos que VBA nos brinda a "BeforePrint" para ello, así que la macro se ejecutará cada vez que el usuarios vaya hasta el propio "Imprimir" de Excel:
listo, hago click sobre "Imprimir"
Y, como falta el segundo campo (nombre), obtengo la señal de alerta de Excel, cancelando la impresión del formulario:
ahá... funciona.
Esto de los eventos del libro (o de una hoja en particular) son algo realmente útil. Si por nuestra cuenta indagamos un poco, veremos que existen muchas otras opciones interesantes aparte de BeforePrint, como:
BeforeSave: antes de guardar
SheetActivate: cuando se activa una determinada hoja
WindowDeactivate: momento en el cual se desactiva (desaparece de vista) la ventana activa
NewChart: insertar un nuevo gráfico
NewSheet: insertar una nueva hoja
Open: al abrir un libro
y muchas, muchas mas.
Cada vez que se "dispare" un evento, podremos "adelantarnos" al mismo y colocar ahí el código que necesitemos, para cambiar las cosas y ajustar Excel a nuestras necesidades.
Disculpen tantos espacios en blanco entre publicación y publicación, otras obligaciones me tienen realmente con poco tiempo. Muchas gracias por los mensajes que recibo, incluso en
Facebook, en donde son muy amables hacia mi trabajo y ayuda con Excel.
Un abrazo, pronto seguimos.
Comentarios
Publicar un comentario