Como al final me han entrado las ganas de terminarlo y a la larga me puede resultar util. He creado el mismo en un módulo reutilizable.
Módulo:
Option Explicit
Type ValoresImpresion
Hacia As Object ' Objeto que recibe la información Picture o Printer asignar por Set
Izquierda As Long ' Posicion Izquierda (x)
Arriba As Long ' Posicion Arribe (y)
Columnas(99) As Long ' Defino 100 columnas como máximo de 0 a 99
Titulos(99) As String ' Titulos de Cabeceras la ultima posición puede indicar el Ajuste en Detalle <, >, =
NumeroColumnas As Integer ' Para indicar el número de Columnas que utilizamos
AjustesEnTitulos As Boolean ' Indica si en los Titulos de Cabecera se ha indicado el tipo de Ajuste
AltoCabecera As Long ' Alto de la Columna de Cabecera
AltoDetalles As Long ' Alto del Bloque de Detalles
ColorFondoCabecera As Long
ColorTextoCabecera As Long
ColorFondoDetalles As Long
ColorTextoDetalles As Long
ColorBordes As Long
AnchoBordes As Integer
MargenExtra As Integer ' Margen para evitar que escriba pegado junto a las lineas
End Type
Public OpcionesImpresion As ValoresImpresion
Public Sub PintaFormato()
Dim Izquierda As Long
Dim Derecha As Long, Abajo As Long, AjusteHor As Long, AjusteVer As Long, Indice As Integer, Titulo As String
With OpcionesImpresion
Izquierda = .Izquierda
If .AnchoBordes > 0 Then .Hacia.DrawWidth = .AnchoBordes
For Indice = 0 To .NumeroColumnas
Titulo = Trim$(.Titulos(Indice))
If .AjustesEnTitulos Then Titulo = Trim$(Left$(Titulo, Len(Titulo) - 1))
Derecha = Izquierda + .Columnas(Indice)
Abajo = .Arriba + .AltoCabecera
.Hacia.Line (Izquierda, .Arriba)-(Derecha, Abajo), .ColorFondoCabecera, BF
.Hacia.Line (Izquierda, .Arriba)-(Derecha, Abajo), .ColorBordes, B
AjusteHor = (.Columnas(Indice) - .Hacia.TextWidth(Titulo)) / 2
AjusteVer = (.AltoCabecera - .Hacia.TextHeight(Titulo)) / 2
.Hacia.CurrentX = Izquierda + AjusteHor
.Hacia.CurrentY = .Arriba + AjusteVer
.Hacia.ForeColor = .ColorTextoCabecera
.Hacia.Print Titulo
.Hacia.Line (Izquierda, .Arriba + .AltoCabecera)-(Derecha, .Arriba + .AltoCabecera + .AltoDetalles), .ColorFondoDetalles, BF
.Hacia.Line (Izquierda, .Arriba + .AltoCabecera)-(Derecha, .Arriba + .AltoCabecera + .AltoDetalles), .ColorBordes, B
Izquierda = Derecha
Next
End With
End Sub
Public Sub PintaCampo(Fila As Long, Columna As Long, Dato As String, Optional Ajuste As String)
Dim Indice As Integer, Posicion As Long, Ancho As Long
With OpcionesImpresion
For Indice = 0 To Columna
Posicion = Posicion + .Columnas(Indice)
Next
Ancho = .Hacia.TextWidth(Dato)
If Ajuste = "" And .AjustesEnTitulos Then Ajuste = Right$(Trim$(.Titulos(Columna)), 1) Else Ajuste = "<"
Select Case UCase(Ajuste)
Case "<": Posicion = Posicion - .Columnas(Columna) + .MargenExtra
Case ">": Posicion = Posicion - Ancho - .MargenExtra
Case "=": Posicion = Posicion - .Columnas(Columna) / 2 - Ancho / 2
End Select
.Hacia.ForeColor = .ColorTextoDetalles
.Hacia.CurrentX = Posicion + .Arriba
.Hacia.CurrentY = .AltoCabecera + .Izquierda + (Fila - 1) * .Hacia.TextHeight(Dato) + .MargenExtra
.Hacia.Print Dato
End With
End Sub
Ejemplo de utilización, el formulario contiene un Picture y un Command.
Option Explicit
Private Sub Command_Click()
Dim Fila As Long
With OpcionesImpresion
Set .Hacia = Picture
.Izquierda = 100
.Arriba = 100
.Columnas(0) = 1100: .Titulos(0) = "CODIGO =" ' Puede indicarse título asi "CODIGO="
.Columnas(1) = 2200: .Titulos(1) = "ARTICULOS <"
.Columnas(2) = 1400: .Titulos(2) = "CANT. >"
.Columnas(3) = 3000: .Titulos(3) = "P.VENTA >"
.Columnas(4) = 1800: .Titulos(4) = "EXENTA >"
.Columnas(5) = 1800: .Titulos(5) = "IVA10 >"
.NumeroColumnas = 5
.AjustesEnTitulos = True
.AltoCabecera = 500
.AltoDetalles = 5000
.ColorFondoCabecera = vbRed
.ColorTextoCabecera = vbYellow
.ColorFondoDetalles = vbWhite
.ColorTextoDetalles = vbBlue
.ColorBordes = vbBlack
.AnchoBordes = 1
.MargenExtra = 40
End With
PintaFormato
For Fila = 1 To 10 Step 2
PintaCampo Fila, 0, "CODIGO1"
PintaCampo Fila, 1, "DESCRIPCION"
PintaCampo Fila, 2, "1.250,32"
PintaCampo Fila + 1, 0, "CODIGO2"
PintaCampo Fila + 1, 1, "PRODUCTO"
PintaCampo Fila + 1, 2, "125,14"
Next
End Sub
Importante la asignación del Objeto que recibe las instrucciones Set .Hacia = Picture o Set .Hacia = Printer
Creo que de la manera que esta, es facilmente mejorable ya que se pueden definir Letras, Tamaños, etc. con sólo añadir el campo al Type y después utilizarlo en los dos Subs
Saludos