Necesito poder impedir la impresión de un documento excel, por todas las vías, hasta tanto compruebe que ciertas condiciones se cumplen. No tengo problemas con las condiciones pero desconozco como puedo impedir POR TODOS LOS MEDIOS que impriman un documento excel. Desde ya agradezco sus respuestas. Alejandro
1 Respuesta
Respuesta de fejoal
2
2
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
Existe la posibilidad de impedir que se imprima cualquier hoja de un libro, utilizando Visual Basic for Aplications. Si quieres intentarlo, activa el editor de Visual Basic (presiona Alt+F11) y busca la hoja que dice "ThisWorkbook" (o "EsteLibro" según la versión") Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic: Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub --- (Hasta aquí) Cierra el Editor de Visual Basic y graba el archivo. ¿Simple, no?. Tan simple como anular esa protección, pues bastará que un avispado usuario, decida abrir el archivo SIN MACROS o con PROTECCIÓN ALTA en versiones más nuevas para que pueda empapelar la ciudad con la impresión que, precisamente, quieres evitar. Sin embargo, puedes compensar esa limitación con un diseño inteligente de tu archivo. Agrega una hoja ("NOTA", por ejemplo) a modo de caratula que indique que para acceder a las hojas de ese archivo es necesario habilitar macros al inicio. Luego oculta el resto de las hojas y protege el libro con una clave compleja. Así, en caso de que no habilite macros, se encontrará con una sólo hoja disponible, avisándole que, para que funcione debe habilitar macros. Como el libro cuenta con una protección, no le será posible ver el resto de las hojas ocultas, a menos que conozca la clave de libro. Si, en cambio, las macros están habilitadas, una asociada al evento de apertura, mostrará el resto de las hojas y ocultará la caratula. En el panel de macros de ThisWorkbook pega esto: Private Sub Workbook_Open() MuestraTo End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 'salida Call Salida ActiveWorkbook.Saved = True Cancel = True End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True End Sub '(Este ya lo conoces, es el que impide imprimir) --- Y en un módulo nuevo pega estas macros: --- Private Sub OcultaTo() ActiveWorkbook.Unprotect "PIRULO" For Each SHT In Sheets If SHT.Name <> "NOTA" And SHT.Visible Then SHT.Visible = xlVeryHidden Next SHT ActiveWorkbook.Protect "PIRULO" End Sub Private Sub MuestraTo() ActiveWorkbook.Unprotect "PIRULO" For Each SHT In Sheets If SHT.Name <> "NOTA" Then SHT.Visible = True Next SHT Sheets("NOTA").visible = xlVeryHidden End Sub Private Sub Salida() Application.ScreenUpdating = False Sheets("NOTA").Visible = True Sheets("NOTA").Select OcultaTo Application.DisplayAlerts = True Application.EnableEvents = False ThisWorkbook.Save Application.EnableEvents = True MuestraTo End Sub Esta macro, es llamada (call Salida) por el Evento Before_save. Es decir que cuando el operador decide grabar, el proceso es interceptado por tal evento y oculta todas (con OcultaTo)las hojas menos la primera (NOTA), protegerá el libro y lo grabará. Al finalizar el grabado, muestra todas las hojas (con MuestraTo) nuevamente para poder seguir trabajando. De esta manera, el archivo que está en el disco siempre estará protegido con una password y con sólo una hoja visible (NOTA). Aquí incorporaste lo siguiente: - Dos macros auxiliares para ocultar y mostrar todas las hojas (excepto NOTA) - Una macro auxiliar que se activa con el evento Before_Save, es decir antes de grabar. Esta macro toma el control del proceso de grabación. Si la clave hubiese sido la que definiste en "Lector" no grabará el archivo, notificándolo de esto. En los otros casos, ocultará todas las hojas menos la primera, protegerá el libro y lo grabará. Luego muestra todas las hojas
Excelente Fernando, AGRADEZCO MUCHÍSIMO la extensión y profundidad de tu respuesta, realmente excelente la misma, desde ya te debo 2 con esta así que, espero, poder pagarte en algún momento, no creo que sea por temas de VBA pero quizás en otros pueda darte una mano. Un abrazo. Ale
(Acabo de notar que este bendito sitio truncó mi respuesta) Reproduzco aquí, lo que le faltó: ... Luego muestra todas las hojas nuevamente para poder seguir trabajando. De esta manera, nos aseguramos que la versión guardada siempre tenga todas las hojas ocultas. Notarás que utilizo una contraseña en este libro: la de Libro que está incluida en el mismo código de la macro. Por tal razón, es conveniente que todo el proyecto de VBA estuviese también protegido para que el usuario no pueda leer el código y, eventualmente, descubrir cual es la contraseña. Para activar la protección de módulos, accede al Editor de Visual Basic, en su Navegador de Proyectos, ¿busca el de tu archivo? Cierra todos los elementos que tenga asociado- haz click derecho sobre él. ¿Elige? ¿Propiedades del VBA Project?. Selecciona la solapa de Protección, ¿marca la casilla de? ¿Bloquear proyecto para visualización? Y también ingresa otra contraseña aquí. Espero que esto te sirva. Pero pregunta de nuevo si no quedó claro. Nota que tu solicitaste "impedir POR TODOS LOS MEDIOS que impriman...". De allí la extendión y comlejidad de esta respuesta. Un abrazo! Fernando
¿Y qué cómo hago para SI permitir que se imprima la hoja? (Cumplida las condiciones) [Imagino será, tu próxima pregunta] En tal caso necesitarás una rutina como esta: ... If TuCondicion then Application.EnableEvents = False Sheets("TuHoja").PrintOut Application.EnableEvents = True End if TuCondición debería ser una variable Booleana que será verdadera si se cumplen las condiciones que tienes previstas. Reemplaza "TuHoja" por el nombre de la hoja a imprimir si la condición es correcta. Como verás esta estructura, suspende el control del evento Before_Print (y cualquier otro), imprime la hoja en cuestión, y restituye el monitoreo de eventos. Bien, Alex, debería estar cubierto casi todo. MS Excel es sumamente vulnerable pero estos son obstáculos que impedirá a la mayouría de los usuarios medio imprimir si no se cumplen las condiciones que impongas. Ojala te sirva. Un abrazo! Fernando
1 comentario
Muy buena ayuda, muy bien explicada y no dejando cabos sueltos, excelente, gracias. - omar villanueva mendoza
Muy buena ayuda, muy bien explicada y no dejando cabos sueltos, excelente, gracias. - omar villanueva mendoza