Sí se puede; y aunque puede resultar muy laborioso, puedes llegar a tener
una libertad y resultar altamente satisfactorio.
para el ejemplo, he creado la tabla Datos con los campos
idDato
Dato
Fecha
En un formulario he puesto un botón que llama al procedimiento CreaInforme
Private Sub cmdCreaInforme_Click()
CreaInforme
End Sub
Este procedimiento está definido en un módulo y es el siguiente
______________________________________________________
Option Compare Database
Option Explicit
Public Enum Alineaciones
eoGeneral
eoIzquierda
eoDerecha
eoDistribuir
End Enum
Public Enum GrosorDeFuentes
eoDelgado = 100
eoExtraFino = 200
eoFino = 200
eoNormal = 400
eoMediano = 500
eoSemiNegrita = 600
eoNegrita = 700
eoExtraNegrita = 800
eoGrueso = 900
End Enum
Public Sub CreaInforme()
Dim rptInforme As Report
Dim aControles(0 To 9) As Control
Dim strInforme As String
Dim ctl As Control
Dim lngColor As Long
Dim i As Long
Set rptInforme = CreateReport
DoCmd.Restore
With rptInforme
strInforme = .Name
.RecordSource = "SELECT * FROM Datos;"
' Dimensiono los elementos del informe _
Encabezado, y pie de página
.Width = 8000
.Section(acPageHeader).Height = 1000
.Section(acPageFooter).Height = 1000
End With
Set aControles(0) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 100, _
800, 300)
With aControles(0)
.Caption = "idDato"
.Name = "lblIdDato"
End With
Set aControles(1) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 100, _
1000, 300)
With aControles(1)
.ControlSource = "idDato"
.Name = "txtIdDato"
End With
Set aControles(2) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 500, _
800, 300)
With aControles(2)
.Caption = "Dato"
.Name = "lblDato"
End With
Set aControles(3) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 500, _
2000, 300)
With aControles(3)
.ControlSource = "Dato"
.Name = "txtDato"
End With
Set aControles(4) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 900, _
800, 300)
With aControles(4)
.Caption = "Fecha"
.Name = "lblFecha"
End With
Set aControles(5) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 900, _
2000, 300)
With aControles(5)
.ControlSource = "Fecha"
.Name = "txtFecha"
End With
lngColor = RGB(128, 0, 0)
For Each ctl In rptInforme.Controls
With ctl
.FontName = "Verdana"
If .ControlType = acTextBox Then
.FontWeight = eoNegrita
.ForeColor = lngColor
.FontSize = 12
.TextAlign = eoDerecha
Else
.FontWeight = eoNormal
.ForeColor = vbBlack
.FontSize = 10
.TextAlign = eoIzquierda
End If
End With
Next ctl
'Creamos ahora el título del encabezado, con sombra
Set aControles(6) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
100, 100, _
6000, 800)
With aControles(6)
.Caption = "Informe por código"
.Name = "lblTituloSombra"
.ForeColor = RGB(128, 128, 128)
End With
Set aControles(7) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
70, 70, _
6000, 800)
With aControles(7)
.Caption = "Informe por código"
.Name = "lblTitulo"
.ForeColor = RGB(0, 0, 128)
End With
For i = 6 To 7
With aControles(i)
.FontName = "Times New Roman"
.FontSize = 24
.FontWeight = eoGrueso
End With
Next i
Set aControles(8) = CreateReportControl( _
strInforme, _
acLine, _
acPageHeader, _
"", "", _
0, 950, _
8000, 0)
With aControles(8)
.Name = "linEncabezado"
End With
' Muestra el informe
DoCmd.OpenReport strInforme, acViewPreview
End Sub
_____________________________________________________
Aunque se haría muy larga la explicación, se puede incluso, por código,
añadir procedimientos al módulo de clase del informe, eventos, etc...
Es un tema muy bonito para trabajar, aunque bastante laborioso.
Saludos desde la calle Estafeta de Pamplona:
Eduardo Olaz
Microsoft [MVP] Access
eduardoALGARROBAolaz.net
Post by Leonardo Onieva GonzálezHola amigos
Se puede crear un informe desde VBA sin utilizar ningun asistente ni usar
la interface de Access??
y abrir el asistente para informes desde VBA??
Gracias a todos
Saludos