Blog

Publicado: 3 de junio de 2014 en Actualidad

controlando la impresion en Excel

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:

view plainprint?

  1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
  2. Dim CantCopias As Byte
  3. Dim QueFalta As String
  4. QueFalta = ""
  5. CantCopias = 1
  6. ‘reviso celda x celda, utilizando a If…
  7. ‘luego de cada revisión, y si falta el dato, guardo
  8. ‘en la variable "QueFalta" el nombre del campo, así
  9. ‘ayudo al usuario a identificar la falla:
  10. If Trim(Range("b1").Value) = "" Then
  11. Cancel = True
  12. QueFalta = "Apellido"
  13. ElseIf Trim(Range("b2").Value) = "" Then
  14. Cancel = True
  15. QueFalta = "Nombre"
  16. ElseIf Trim(Range("b3").Value) = "" Then
  17. Cancel = True
  18. QueFalta = "Edad"
  19. Else
  20. Cancel = False
  21. End If
  22. ‘si Cancel = True, entonces hubo alguna omisión, la cual
  23. ‘muestro a través de un MsgBox, usaon la variable "QueFalta"
  24. ‘para mostrarle al usuario donde estuvo el problema:
  25. If Cancel = True Then
  26. MsgBox "Faltan dados (" & QueFalta & "). La impresión se cancela", vbCritical, "Error"
  27. Else
  28. ‘si todo sale bien (cancel=false), imprimo la cantidad
  29. ‘de copias que tengo en la variable "CantCopias"
  30. ActiveSheet.PrintOut copies:=CantCopias
  31. End If
  32. 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.

Link al archivo

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s