Repetir filas inferiores al imprimir en excel

Para Dante Amor

Cordial saludo, deseandole muchas bendiciones en todos los aspectos.

Agradezco de antemano su apoyo con el siguiente tema, tengo un formato que se encuentra en una hoja de nombre Factura (Hoja1), lo alimento mediante el uso de un formulario "Facturacion", el formato está diseñado para ingresar máximo 16 ítems por hoja impresa, hasta aquí todo me funciona bien, la dificultad que tengo es cuando al formato se ingresan más de 16 ítems en cuyo caso la impresión se debe realizar en cuantas hojas sea necesario, teniendo en cuenta que en cada hoja solo deben de ir 16 ítems y que en cada hoja se debe repetir además del emcabezado que con eso no tengo problema, las filas inferiores del formato standard que van de la fila 37 a la 56, el contenido de estas filas se debe repetir en cuantas hojas sea necesario imprimir, espero haberme hecho entender con la explicacion de la dificultad que tengo.

Adjunto código que aliementa el formato e imágenes de cómo debería quedar

'Guardar la informacion
Private Sub Btn_Aceptar_Click()
Dim validarfecha As Boolean
Dim i As Integer
Dim j As Integer
If TextBox7 = "" Then     'nro de fact
    MsgBox "Introduzca NRO.DE FACTURA", , "Gilber dice:"
    TextBox7.SetFocus
    Exit Sub
End If
'Paso la informacion al formato de la FV
'  ActiveWorkbook.Unprotect "1717171"
  Set hfv = Sheets("Factura")
  hfv.Unprotect "1717171"
'  hfv.Visible = xlSheetVisible 'Hoja Factura
'Eliminar filas que sobran
  Set f = hfv.Range("B:N").Find("SUBTOTAL ", , xlValues, xlPart, , xlPrevious, False)
  If Not f Is Nothing Then
    If f.Row > 37 Then hfv.Range("B37:B" & f.Row - 1).EntireRow.Delete
  End If
  hfv.Select
  Range("A20:N36") = ""
   With ListBox2
    j = .ListCount + 1
    If j > 16 Then
      hfv.Rows(36).Copy
      hfv.Rows("36:" & 36 + j - 18).Insert Shift:=xlDown
      Application.CutCopyMode = False
    End If
'Pasar la informacion al formato
   j = 20
    For i = 0 To .ListCount - 1
      hfv.Cells(j, 1) = .List(i, 0)      'cod
      hfv.Cells(j, 5) = .List(i, 1)      'Cantidad
      hfv.Cells(j, 3) = .List(i, 2)      'Descripcion
      hfv.Cells(j, 7) = .List(i, 3)      'Vr.Unitario
'pasa unid e iva del item
 Set buscoit = Hoja2.Range("A:A").Find(Val(ListBox2.List(i, 0)), LookIn:=xlValues, lookat:=xlWhole)
   If Not buscoit Is Nothing Then
        hfv.Cells(j, 8) = buscoit.Offset(0, 6) / 100 'IVA
        Set buscoit = Nothing
   End If
'Calcular Vr.Total de la linea item * cantidad
   hfv.Cells(j, 11) = Round(hfv.Range("E" & j) * hfv.Range("G" & j) / (1 + hfv.Range("H" & j)), 0)
  j = j + 1
 Next
End With
'Consecutivo
    Hoja1.Range("I10") = "AB - " & TextBox7.Value   'Nro FV
 End sub   

1 respuesta

Respuesta
1

Los datos de la factura quieres que se almacenen en la hoja "factura", vas a guardar esa hoja en un archivo o solamente es para imprimir la factura.

Te pregunto por lo siguiente, si solamente es para imprimir, entonces si son 23 items, llenamos la hoja "factura" con 16 items, enviamos a imprimir esa hoja, borramos la hoja "factura", la llenamos con los 7 items y enviamos a imprimir.

De esa manera no hay que modificar la estructura de la hoja "factura" y tendrás tus 2 hojas impresas.

Hola Dante, gracias por tu respuesta, la información si la guardo en una hoja relación facturas con esta parte no tengo problema; con lo que me sugieres no me funciona ya que el formato tiene un número y unos datos propios de cada factura.

Ojalá se pueda hacer algo...

Entonces vamos a crear otra hoja llamada "formato", esta hoja contendrá la estructura del formato de la factura.

Lo que quiero explicar es, con tu idea, quieres hacer crecer el formato factura a 100 items, y luego modificar el formato para que quede de 16 items y así para cada página de la factura.

Con mi idea, no hay necesidad de modificar el "formato", solamente hay que copiarlo de la hoja "formato" a la hoja "factura" tantas veces sea necesario.

Voy a tratar de recrear tu formato y tu userform para hacer el código. Y te muestro mi idea ya con el código. Así lo he trabajado en muchas ocasiones y funciona perfectamente.

Prueba la siguiente macro.

Primero, crea una hoja llamada "Formato", en esta hoja vas a poner la estructura de la Factura, ancho de columnas, alto de filas, formato de celdas, etc, etc.


'Guardar la informacion
Private Sub Btn_Aceptar_Click()
  Dim hfv As Worksheet, frm As Worksheet
  Dim validarfecha As Boolean
  Dim i As Long, j As Long, k As Long, m As Long, n As Long, p As Long
  Dim pag As Long, lin As Long, fila As Long, x As Long, y As Long
  Dim subtot As Double, wtotal As Long
  Dim buscoit As Range
  '
  If TextBox7 = "" Then     'nro de fact
    MsgBox "Introduzca NRO.DE FACTURA", , "Gilber dice:"
    TextBox7.SetFocus
    Exit Sub
  End If
  '
  Application.ScreenUpdating = False
  Set hfv = Sheets("Factura")
  Set frm = Sheets("Formato")
  '
  'limpiar factura
  hfv.Cells.Clear
  hfv.DrawingObjects.Delete
  'Generar páginas de la factura
    n = ListBox2.ListCount
    pag = WorksheetFunction.RoundUp(n / 16, 0)
    m = 1
    For k = 1 To pag
      'copia valores, imágenes y formatos
 frm. Range("A1:N55"). Copy hfv.Range("A" & m)
      'Ajusta ancho de columnas
      Frm. Range("A1:N55"). Copy
      Hfv.Range("A" & m). PasteSpecial xlPasteColumnWidths
      'Ajusta alto de filas
      p = m
      For lin = 1 To 55
        hfv.Range("A" & p).RowHeight = frm.Range("A" & lin).RowHeight
        p = p + 1
      Next
      'Llenar encabezado
        'Consecutivo
          hfv.Range("I" & m + 9) = "AB - " & TextBox7.Value  'Nro FV
        '... Poner aquí los datos que van en el encabezado
        '
      '
      m = m + 55
    Next
  'Fin generar páginas
  '
  'Llena el detalle de cada página de la factura
  fila = 20
  y = 1
  With ListBox2
    j = fila
    For i = 0 To .ListCount - 1
      x = x + 1
      If x = 17 Then
        x = 1
        fila = fila + 55
        j = fila
        y = y + 1
        subtot = 0
      End If
      hfv.Cells(j, 1) = .List(i, 0)      'cod
      hfv.Cells(j, 5) = .List(i, 1)      'Cantidad
      hfv.Cells(j, 3) = .List(i, 2)      'Descripcion
      hfv.Cells(j, 7) = .List(i, 3)      'Vr.Unitario
      'pasa unid e iva del item
      Set buscoit = hoja2.Range("A:A").Find(Val(ListBox2.List(i, 0)), , xlValues, xlWhole)
      If Not buscoit Is Nothing Then
        hfv.Cells(j, 8) = buscoit.Offset(0, 6).Value / 100 'IVA
      End If
      'Calcular Vr.Total de la linea item * cantidad
      hfv.Cells(j, 11) = Round(hfv.Range("E" & j) * hfv.Range("G" & j) / (1 + hfv.Range("H" & j)), 0)
      subtot = subtot + hfv.Cells(j, 11)
      wtotal = wtotal + hfv.Cells(j, 11)
      j = j + 1
      '
      'filas inferiores
        If y < pag Then
          hfv.Range("C" & fila + 17).Value = "CONTINÚA EN LA SIGUIENTE PÁGINA"
          hfv.Range("H" & fila + 17).Value = subtot
        Else
          hfv.Range("C" & fila + 17).Value = "SON: .... PESOS"
          hfv.Range("H" & fila + 17).Value = wtotal
        End If
      '
    Next
  End With
  Application.ScreenUpdating = True
End Sub

Prueba con 5 items, con 23 items, con 100 items.

La macro en automático creará en la hoja "Factura" el número de páginas y llenará cada página de cada factura.


Falta afinar algunos detalles, como los datos del encabezado, los datos de las filas inferiores. Pero ya está el diseño para crear las páginas y llenarlas.


Te anexo mi archivo de prueba. Puedes llenar el número de items en la hoja "Ejemplo". Ahí puedes poner 1 item o 100 items.

Ejecuta el formulario y presiona el botón para llenar la hoja factura.

https://drive.google.com/file/d/14Thb38CNTcXIfw0q6V6qVLnHIkJC4XsK/view?usp=sharing 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas