VBA: Imprimir excepto si las filas están ocultas
fannoche35
Mensajes publicados
12
Estado
Miembro
-
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador -
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador -
Bonjour,
He creado una macro que permite imprimir la página 1 en vertical, la página 2 en horizontal y luego las demás páginas en vertical (ver a continuación Sub Imprime())
Tengo otras macros que permiten ocultar rangos de filas enteras en función de si un checkbox está marcado o no (ver a continuación Sub Checkbox10_Click()).
Me gustaría hacer que si mi rango de filas de 96 a 167 está oculto (porque el checkbox10 está desmarcado), no se imprima en absoluto.
De hecho, estoy encontrando un problema con la impresión de páginas en blanco.
Gracias de antemano por tu ayuda
He creado una macro que permite imprimir la página 1 en vertical, la página 2 en horizontal y luego las demás páginas en vertical (ver a continuación Sub Imprime())
Tengo otras macros que permiten ocultar rangos de filas enteras en función de si un checkbox está marcado o no (ver a continuación Sub Checkbox10_Click()).
Me gustaría hacer que si mi rango de filas de 96 a 167 está oculto (porque el checkbox10 está desmarcado), no se imprima en absoluto.
De hecho, estoy encontrando un problema con la impresión de páginas en blanco.
Gracias de antemano por tu ayuda
Sub Imprime() 'Impresión de la 1ª página en vertical '-------------------------------------- Range("A1:AX69").Select 'definición del rango de celdas que constituye la 1ª página ActiveSheet.PageSetup.PrintArea = "$A$1:$AX$68" 'definición de la zona de impresión ActiveSheet.PageSetup.Orientation = xlPortrait 'configuración en formato vertical ActiveSheet.PageSetup.CenterHorizontally = True 'centrado horizontal de la hoja ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impresión 'Impresión de la 2ª página en horizontal '------------------------------------- Range("A70:CM95").Select 'definición del rango de celdas que constituye la 2ª página ActiveSheet.PageSetup.PrintArea = "$A$70:$CM$95" 'definición de la zona de impresión ActiveSheet.PageSetup.Orientation = xlLandscape 'configuración en formato horizontal ActiveSheet.PageSetup.CenterHorizontally = True 'centrado horizontal de la hoja ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impresión 'Impresión de la 3ª página en vertical '-------------------------------------- Range("A96:AX166").Select 'definición del rango de celdas que constituye la 3ª página ActiveSheet.PageSetup.PrintArea = "$A$96:$AX$166" 'definición de la zona de impresión ActiveSheet.PageSetup.Orientation = xlPortrait 'configuración en formato vertical ActiveSheet.PageSetup.CenterHorizontally = True 'centrado horizontal de la hoja ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impresión 'Impresión de la 4ª página en vertical '-------------------------------------- Range("A167:AX237").Select 'definición del rango de celdas que constituye la 4ª página ActiveSheet.PageSetup.PrintArea = "$A$167:$AX$237" 'definición de la zona de impresión ActiveSheet.PageSetup.Orientation = xlPortrait 'configuración en formato vertical ActiveSheet.PageSetup.CenterHorizontally = True 'centrado horizontal de la hoja ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impresión Sub CheckBox10_Click() If CheckBox10.Value = True Then Rows("96:167").EntireRow.Hidden = False Else Rows("96:167").EntireRow.Hidden = True End If End Sub
Enlaces relacionados:
- VBA Excel - guardar el número de una fila
- Protección de celdas excepto para el código VBA
- restaurar todas las columnas y filas ocultas
- Copiar valores si dos etiquetas son idénticas
- Las líneas de Excel están limitadas a 10,000 al mostrar en Ordenar y filtrar.
- Recuperar los datos de una fila en un userform VBA
2 respuestas
-
Hola,
como esto al principio de Sub:
If CheckBox10.Value = False Then Exit Sub
--
@+ El Pivert-
Hola,
Perdona por el tiempo de respuesta...
Gracias por tu ayuda cs_Le Pivert.
No tengo solo una casilla de verificación, sino varias:
Quisiera que la página 1 y 2 se impriman siempre
que la página 3 se imprima si la checkbox1 está marcada
que la página 4 se imprima si la checkbox 1, 3 o 21 están marcadas
que la página 5 y 6 se impriman si la checkbox 6 está marcada
que la página 7 se imprima si la checkbox 2 está marcada
que la página 8 se imprima si la checkbox 24 está marcada
que la página 9 se imprima si la checkbox 23 está marcada
que la página 10 se imprima si la checkbox 3 está marcada
que la página 11 se imprima si la checkbox 21 está marcada
que la página 12 y 13 se impriman si la checkbox 5 está marcada
etc...
Además, con mi Sub Imprime, no consigo imprimir las páginas en un solo documento pdf, me está creando varios documentos separados. ¿Hay alguna solución para eso?
Gracias de antemano.
-
-
Además, con mi Sub Imprime, no logro imprimir las páginas en un solo documento pdf, me genera varios documentos separados. ¿Hay alguna solución para eso?
Mira esto, tendrás la respuesta a tu pregunta:
http://www.mdf-xlpages.com/modules/newbb/viewtopic.php?post_id=7055
Luego, solo tienes que adaptar esta línea según las casillas de verificación marcadasSheets(Array("Feuil1", "Feuil2", "Feuil3")).Select
Ahí lo tienes
--
@+ El Pivert-
Hola,
He comenzado recientemente con VBA, y para divertirme y mejorar, intenté acortar el código de fannoche35, sin éxito. ¿Tienes alguna pista o idea de por qué no funciona? Seguramente es por esas page(i) que he declarado mal...
PS: sin tener en cuenta las casillas de verificación
Sub Imprime() Dim page1 As String, page2 As String, page3 As String, page4 As String page1 = "A1:AX69" page2 = "A70:CM95" page3 = "A96:AX166" page4 = "A167:AX237" For i = 1 To 4 With ActiveSheet.PageSetup If i = 2 Then Set c = xlLandscape Else: c = xlPortrait End If .PrintArea = "page" & i 'definición del área de impresión .Orientation = c 'formato vertical .CenterHorizontally = True 'centrado horizontal de la hoja End With Next i 'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impresión End Sub
-
Ver esto para las tablas:
https://silkyroad.developpez.com/vba/tableaux/#LVI
Sub Imprime() Dim NomTableau As Variant Dim i As Integer NomTableau = Array("A1:AX69", "A70:CM95", "A96:AX166", "A167:AX237") For i = LBound(NomTableau) To UBound(NomTableau) MsgBox NomTableau(i) With ActiveSheet.PageSetup .PrintArea = NomTableau(i) 'definición del área de impresión End With Next i End Sub
@+ -
fannoche35,
aquí está el principio para no hacer una trampa:
Pon en cada Hoja la selección correspondiente que se activará con el evento Activate de la Hoja así:
Option Explicit Private Sub Worksheet_Activate() Range("A1:AX69").Select 'definición del rango de celdas que constituyen la 1ª página ActiveSheet.PageSetup.PrintArea = "$A$1:$AX$68" 'definición de la zona de impresión ActiveSheet.PageSetup.Orientation = xlPortrait 'formato vertical ActiveSheet.PageSetup.CenterHorizontally = True 'centrado horizontal de la hoja End Sub
ver el evento Hoja aquí:
https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-1
Luego, la leyenda de cada CheckBox se establecerá con el nombre de la Hoja correspondiente
Haremos un bucle sobre la colección de checkBox que se mostrará en un listbox
https://silkyroad.developpez.com/VBA/ControlesUserForm/#LI-B
También será necesaria una ListBox para mostrar las Hojas seleccionadas.
Aquí está el código para 3 hojas, tú lo adaptarás para todas tus hojas:
Option Explicit 'http://www.mdf-xlpages.com/modules/newbb/viewtopic.php?post_id=7055 'http://silkyroad.developpez.com/VBA/ControlesUserForm/#LI-B 'http://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-1 Private Sub CommandButton1_Click() Dim Ctrl As Control Dim sRep As String Dim sFilename As String Dim nom As String Dim nombre As Integer 'número de hojas ListBox1.Clear 'Bucle sobre la colección de controles poner la Caption de los checkBox al nombre de las hojas For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.CheckBox Then If Ctrl.Object.Value = True Then ListBox1.AddItem (Ctrl.Caption) End If End If Next Ctrl nombre = ListBox1.ListCount 'número de hojas Select Case nombre Case Is = 1 Sheets(Array(ListBox1.List(0))).Select nom = "_1" Case Is = 2 Sheets(Array(ListBox1.List(0), ListBox1.List(1))).Select nom = "_2" Case Is = 3 Sheets(Array(ListBox1.List(0), ListBox1.List(1), ListBox1.List(2))).Select nom = "_3" End Select sRep = ThisWorkbook.Path & "\" 'camino del folder sFilename = Replace(ThisWorkbook.Name, ".xlsm", "") 'nombre solo sin extensión sFilename = sFilename & nom & ".pdf" ActiveSheet.ExportAsFixedFormat _ Type:=xlTypePDF, _ Filename:=sRep & sFilename, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=True MsgBox "Guardar en la misma carpeta que este libro con el nombre del libro y el número de hojas" End Sub
Aquí tienes un ejemplo para descargar
https://www.cjoint.com/c/HCckXMKk4QQ
Buena suerte
@+ El Pivert -
-
¡Yo que empiezo en autoformación, es muy complicado! Voy a trabajar en ello.
Lo que pides no es complicado, pero es un laberinto administrativo para configurar cada caso.
(pd: el enlace del ejemplo para descargar no está o ya no está activo)
es válido por 4 días
https://www.cjoint.com/c/HCinG0bQBSQ
Ahí está.
-