Autor
|
Tema: problema en i,primir varias hojas (Leído 1,399 veces)
|
corlo
Desconectado
Mensajes: 120
|
Hola tengo un problema a la hora de imprimir varias hojas me hace el listado seguido hago el siguiente calculo If i = 24 Then Printer.NewPage encabezado End If
no logro que me cambie de hoja Private Sub imprimir() ' Imprimir 'Imprimir Dim BeginPage As Long, EndPage As Long, NumCopies As Long, Orientation As Long, Tell As Long Dim i As Integer Dim fuente As StdFont Set fuente = Printer.Font 'Set fuente = Printer.Font CommonDialog1.CancelError = True On Error GoTo ErrHandler CommonDialog1.Flags = &H40& CommonDialog1.ShowPrinter BeginPage = CommonDialog1.FromPage EndPage = CommonDialog1.ToPage NumCopies = CommonDialog1.Copies Printer.Orientation = CommonDialog1.Orientation With Printer If .Orientation = 1 Then .Orientation = vbPRORPortrait Else .Orientation = vbPRORLandscape End If End With On Error Resume Next Dim numCols As Integer Dim filas As Long encabezado listarcolumnas If i = 24 Then Printer.NewPage encabezado End If Printer.Print Set Printer.Font = fuente Printer.EndDoc ' Set Printer.Font = fuente Exit Sub ErrHandler: ' El usuario hizo clic en el botón Cancelar. Exit Sub End Sub Private Sub listarcolumnas() Dim AnchoPapel As Integer Dim MargenIzquierdo As Integer Dim numCols As Integer Dim filas As Long Dim ultimafila As Long Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer Dim linea As String Dim margen As Integer Dim fuente As StdFont Set fuente = Printer.Font numCols = 9 Printer.FontName = "Courier New" ' una fuente monoespaciada, si no el trabajo es más laborioso... filas = ((List1.ListCount + 1) \ numCols) ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila. anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols) For k = 0 To filas - 1 n = margen For i = 0 To numCols - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next j = (j + numCols) Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t")) ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la fuente. Next If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'. n = margen For i = 0 To ultimafila - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next End If Set Printer.Font = fuente End Sub Private Sub encabezado() Printer.Font.Name = "Courier" Printer.Font.Size = 10 Printer.FontBold = True Printer.Print Tab(5); "HORA: " & UCase(Format(Now, "hh:mm ")); Tab(80); "Fecha:"; Date Printer.Font.Name = "Arial" Printer.Font.Size = 10 Printer.FontBold = True Printer.DrawWidth = 10 Printer.DrawStyle = 2 Printer.CurrentX = 4000 Printer.CurrentY = 0 Printer.Print "Listado de Almacen" Printer.CurrentY = 1000 Printer.CurrentX = 200: Printer.Print "Codigo" Printer.CurrentY = 1000 Printer.CurrentX = 1000: Printer.Print "Stock" Printer.CurrentY = 1000 Printer.CurrentX = 2900: Printer.Print "Articulo" Printer.CurrentY = 1000 Printer.CurrentX = 5000: Printer.Print "Precio" Printer.CurrentY = 1000 Printer.CurrentX = 6000: Printer.Print "Impuesto" Printer.CurrentY = 1000 Printer.CurrentX = 7200: Printer.Print "Uds.Caja" Printer.CurrentY = 1000 Printer.CurrentX = 8300: Printer.Print "Umbral" Printer.CurrentY = 1000 Printer.CurrentX = 9500: Printer.Print "Pedido" Printer.CurrentY = 1000 Printer.CurrentX = 10500: Printer.Print "En Oferta" End Sub
gracias
|
|
|
En línea
|
|
|
|
Mr.Byte
Desconectado
Mensajes: 253
|
Si tu intención es cambiar de página después de imprimir un cierto número de líneas, necesitarías incrementar i en cada iteración de tu bucle de impresión y luego verificar si ha alcanzado el límite que deseas para el cambio de página.
Por ejemplo, podrías tener un contador que incrementas cada vez que imprimes una línea, y cuando ese contador llega a 24 (o cualquier número que represente el final de una página para tu impresora), entonces llamas a Printer.NewPage y encabezado.
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Kola Mr.Byte intento hacer esto: encabezado listarcolumnas i = i + 1 If i = 24 Then '2 Printer.NewPage encabezado End If
y me hace el listado completo no consigo hacerlo en varias hojas gracias
|
|
|
En línea
|
|
|
|
Mr.Byte
Desconectado
Mensajes: 253
|
Tendrias que resetear el contador cada vez que imprimes una pagina encabezado listarcolumnas i = i + 1 If i = 24 Then i=0 and '2 Printer.NewPage encabezado End If
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
estoy haciendo esto i = 1 encabezado listarcolumnas i = i + 1 If i = 24 Then '2 Printer.NewPage i = 0 encabezado End If
y me esta haciendo el listado completo, no me hace por varias hojas gracias
|
|
|
En línea
|
|
|
|
EdePC
|
Pasa que no estás controlando la cantidad de líneas impresas para luego comprobarlo. Ya que en listarcolumnas imprimes las líneas, ahí deberías hacer la comprobación, y mejor si usas otra variable porque i ya se está utilizando para otras cosas Por ejemplo usaré lineas y resaltaré la parte que he agregado a tu código: Private Sub listarcolumnas() Dim AnchoPapel As Integer Dim MargenIzquierdo As Integer Dim numCols As Integer Dim filas As Long Dim ultimafila As Long Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer Dim linea As String Dim margen As Integer Dim fuente As StdFont Set fuente = Printer.Font numCols = 9 Printer.FontName = "Courier New" ' una fuente monoespaciada, si no el trabajo es más laborioso... filas = ((List1.ListCount + 1) \ numCols) ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila. anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols) For k = 0 To filas - 1 n = margen For i = 0 To numCols - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next j = (j + numCols) Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t")) ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la fuente. lineas = lineas + 9 'Arriba se imprimieron 9 líneas If lineas > 24 Then Printer.NewPage encabezado lineas = 0 End If Next If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'. n = margen For i = 0 To ultimafila - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next End If Set Printer.Font = fuente End Sub
--- No es normal trabajar con coordenadas (x, y) para estos trabajos de impresión ya que requieren de buenos cálculos matemáticos y/o trabajar con prueba y error. Las coordenadas se usan más cuando el tipo y tamaño de fuente varían en la hoja a imprimir, se van a agregar elementos gráficos y se requiere moverse por toda la hoja para imprimir en diferentes lugares en cualquier orden. - Pero si se va a trabajar con un tamaño de fuente determinado y que además es monoespaciada, es mejor crear una plantilla en un editor de texto plano como Notepad++ o similar, luego se facilita mucho la impresión de líneas usando Format y demás opciones que hay para formatear, alinear y distribuir el texto de acuerdo a la plantilla, por ejemplo esta plantilla para una hoja A4, y fuente Consolas de tamaño 10: HORA: 05:19:42 LISTADO DE ALMACEN FECHA: 16/07/2024 ======================================================================================================= Código | Stock | Artículo | Precio | Impuesto | Uds.Caja | Umbral | Pedido | En Oferta ------------------------------------------------------------------------------------------------------- A00001 | 5000 | Lapicero | 0.15 | 0.18 | 20.20 | 5.3 | 200 | 500
- El objetivo de esta plantilla es reconocer los tamaños y espaciados requeridos para el trabajo de impresión, luego con esto es más fácil usar Print porque ya se conocen estos detalles - Ahí dejé libre la primera fila y las dos primeras columnas como margen - Le puse barritas | como separador para que sea más legible pero se pueden quitar si molestan y de paso ganar más espacio Para imprimir es fácil porque me basta con escribir tal cual las líneas o datos que no varían y formatear con la cantidad de caracteres correcta para los que si varían, todo dependerá de la plantilla. Acá dejo un ejemplo por si lo quieres probar, si no entiendes algo dale click a esa instrucción y presiona F1 para que te muestra a ayuda de VB, sino siempre puedes preguntar por acá. Const n = 200 'Generaré 200 registros aleatorios para el ejemplo Dim c1(n), c2(n), c3(n), c4(n), c5(n), c6(n), c7(n), c8(n), c9(n) As String Private Sub Form_Load() GenerarDatos 'Genera datos aleatorios para las columnas Printer.Font.Name = "Consolas" Printer.Font.Size = 10 Encabezado ListarColumnas Printer.EndDoc End Sub Sub Encabezado() Printer.FontBold = True Printer.Print 'Imprime una línea vacía Printer.Print " HORA: "; Time; Spc(27); "LISTADO DE ALMACEN"; Spc(27); "FECHA: "; Date Printer.Print " "; String(104, "=") Printer.Print " Código | Stock | Artículo"; Spc(19); "| Precio | Impuesto | Uds.Caja | Umbral | Pedido | En Oferta" Printer.Print " "; String(104, "-") Printer.FontBold = False End Sub Sub ListarColumnas() lineas = 0 For i = 0 To n Printer.Print " "; c1(i); Printer.Print " | "; Format(c2(i), "@@@@@"); Printer.Print " | "; Format(c3(i), "!@@@@@@@@@@@@@@@@@@@@@@@@@@"); Printer.Print " | "; Format(c4(i), "@@@@@@"); Printer.Print " | "; Format(c5(i), "@@@@@@@@"); Printer.Print " | "; Format(c6(i), "@@@@@@@@"); Printer.Print " | "; Format(c7(i), "@@@@@@"); Printer.Print " | "; Format(c8(i), "@@@@@@"); Printer.Print " | "; Format(c9(i), "@@@@@@@@@") lineas = lineas + 1 'Arriba se imprimió 1 línea If lineas > 64 Then Printer.NewPage Encabezado lineas = 0 End If Next End Sub Sub GenerarDatos() For i = 0 To n c1(i) = (Format(i, "A00000")) c2(i) = Int((10000 * Rnd)) c3(i) = String(25 * Rnd + 1, "x") c4(i) = Format(998 * Rnd + 1, "0.00") c5(i) = 0.18 c6(i) = Int((1000 * Rnd)) c7(i) = Int((1000 * Rnd)) c8(i) = Int((1000 * Rnd)) c9(i) = Int((1000 * Rnd)) Next End Sub
El resultado es: https://mega.nz/file/spwmUZxI#qa8RkqNKuR_hxj3LyfIhnPBSxkcQyggQnEfEZjWthAYAcá dejo el Proyecto por si lo quieres descargar: https://mega.nz/folder/wpx0hJQJ#TUpjfKk3hEqtKilP4fcE3g
|
|
« Última modificación: 16 Julio 2024, 15:54 pm por EdePC »
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Hola He podido hacer esto lineas = lineas + i If lineas > 24 Then Printer.NewPage encabezado lineas = 0 End If
ahora la primera hoja sale bien pero la segunda hoja a la hora de imprimir sale lo siguiente: HORA: 13:18 Listado de Almacen Fecha:17/07/2024 Codigo Stock Articulo Precio Impuesto Uds.Caja Umbral Pedido En Oferta 28 | 115 |Pizza romana | 2,200 | 21,00 % | 440 | 20 % | 24 |Falso 30 | 97 |Pizza margarita | 2,200 | 21,00 % | 440 | 20 % | 20 |Falso 32 | 213 |Galletas tostadas | 0,800 | 10,00 % | 800 | 10 % | 22 |Falso 33 | 29 |Vinagre de vino 1l | 0,450 | 10,00 % | 1 | 10 % | 8 |Falso 35 | 30 |a | 2,600 | 21,00 % | 1 | 20 % | 6 |Falso 36 | 30 |b | 2,800 | 21,00 % | 1 | 20 % | 6 |Falso 37 | 30 |c | 1,500 | 21,00 % | 1 | 20 % | 6 |Falso no se donde esta el error gracias
|
|
|
En línea
|
|
|
|
corlo
Desconectado
Mensajes: 120
|
Hoka ya lo he solucionado he cambiado el encabezado y todo ok Private Sub listarcolumnas() Dim AnchoPapel As Integer Dim MargenIzquierdo As Integer Dim numCols As Integer Dim filas As Long Dim ultimafila As Long Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer Dim linea As String Dim margen As Integer Dim fuente As StdFont Set fuente = Printer.Font numCols = 9 Printer.FontName = "Courier New" ' una fuente monoespaciada, si no el trabajo es más laborioso... filas = ((List1.ListCount + 1) \ numCols) ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila. anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols) lineas = 0 For k = 0 To filas - 1 n = margen For i = 0 To numCols - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next j = (j + numCols) Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t")) ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la fuente. lineas = lineas + i If lineas > 24 Then Printer.NewPage Encabezado lineas = 0 End If Next If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'. n = margen For i = 0 To ultimafila - 1 Printer.CurrentX = n ' imprime el texto de la columna 'i' Printer.Print List1.List(j + i) n = (n + anchocol) Next i End If Set Printer.Font = fuente End Sub Sub Encabezado() Printer.FontBold = True Printer.Print 'Imprime una línea vacía Printer.Print " HORA: "; Time; Spc(27); "LISTADO DE ALMACEN"; Spc(20); "FECHA: "; Date Printer.Print " "; String(104, "=") Printer.Print " Código | Stock | Artículo"; Spc(10); "| Precio | Impuesto | Uds.Caja | Umbral | Pedido | En Oferta" Printer.Print " "; String(104, "-") Printer.FontBold = False End Sub
tema resuelto muchas gracias
|
|
|
En línea
|
|
|
|
Danielㅤ
Conectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
Hola compañeros!
corlo me alegro que hayas solucionado el problema y gracias por dejar el código correcto del cuál, fue la solución.
Saludos
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Creacion de hojas css
Diseño Gráfico
|
pARANOID
|
2
|
2,510
|
4 Junio 2004, 03:07 am
por Azielito
|
|
|
Rango de hojas excel
Software
|
1mpuls0
|
4
|
3,623
|
23 Abril 2011, 05:32 am
por 1mpuls0
|
|
|
Hojas estilo css
Desarrollo Web
|
Finlay76
|
0
|
1,488
|
1 Octubre 2012, 23:38 pm
por Finlay76
|
|
|
Ordenar hojas al imprimir
Programación General
|
CeLaYa
|
0
|
1,715
|
19 Octubre 2014, 22:43 pm
por CeLaYa
|
|
|
imrimir varias hojas con numero de pagina
Programación Visual Basic
|
corlo
|
0
|
1,529
|
24 Noviembre 2022, 16:16 pm
por corlo
|
|