VBA: Imprimir excepto si las filas están ocultas

fannoche35 Mensajes publicados 12 Estado Miembro -  
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

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

2 respuestas

  1. cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 731
     
    Hola,

    como esto al principio de Sub:

    If CheckBox10.Value = False Then Exit Sub


    --
    @+ El Pivert
    0
    1. fannoche35 Mensajes publicados 12 Estado Miembro
       
      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.
      0
  2. cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 731
     
    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 marcadas

     Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select


    Ahí lo tienes

    --
    @+ El Pivert
    0
    1. Jauster Mensajes publicados 142 Estado Miembro 42
       
      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 
      0
    2. cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 731
       
      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 


      @+
      0
    3. cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 731
       
      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
      0
    4. fannoche35 Mensajes publicados 12 Estado Miembro
       
      Hola cs_El Pájaro,
      Estoy nadando...
      Para mí que empiezo en la autoformación, ¡es muy complicado! Voy a trabajar en ello.
      Gracias por tu ayuda.
      (pd: el enlace del ejemplo para descargar no está o ya no está activo)
      ¡Buen día!
      0
    5. cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 731
       
      ¡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á.
      0