Utilizar modulo estándar en informes de Access 2003

Tengo una base de datos en la que una de las tablas contiene entre otros los campos "Nombre" y "Color". Quiero que al imprimir diferentes informes, me escriba cada registro en el color que especifica su campo, es decir, si tengo los datos:

María, rojo

Pedro, azul

Paco, verde

Alicia, azul

Marta, verde

Al imprimir, me ponga María en rojo, Pedro en azul, etc. Tengo el código en un modulo de clase en el procedimiento "Al imprimir" de la sección "Detalle", y me funciona correctamente. Pero cuando lo pongo en un módulo estándar para poderlo utilizar en todos los informes no consigo que funcione. Estoy intentando poner "Color" como una variable pública en el procedimiento del informe, pero me da un error de compilación "Atributo no valido en Sub o en Function.

¿Dónde tengo que declarar la variable para que me la acepte?

1 respuesta

Respuesta
1

¿Cuál es código que tienes y te funciona? ¿Cómo lo pones en el módulo estándar y dónde te da el error?

Cuando dices que lo tienes en un módulo de clase, entiendo que te refieres al módulo asociado al informe, ¿no?

Buenos días y gracias por tu rápida respuesta.

Si, el modulo de clase es el que tengo asociado al informe. Y ahí me funciona sin problemas.

El error me lo da por dos lados:

1º.- En el módulo estándar lo pongo igual que en asociado al informe. Y al llamarlo desde el módulo asociado da el error: "Se ha producido el error 424 en tiempo de ejecución. Se requiere un objeto". Esto creo que lo provoca porque no asocia el campo definido en el código con el campo del informe.

2º.- En el módulo asociado, si declaro la variable que quiero pasar como:

"Public Col As String

me da el error: "Error de compilación. Atributo no válido en Sub o en Function"

El problema que tengo es 1º que no sé donde declarar la variable en el módulo asociado para que me la coja en el informe, y 2º que el campo de destino en el código no lo asocia al campo correspondiente en el informe.

Espero que me puedas ayudar. Muchas gracias.

Cuando pasas un código de un módulo asociado a un objeto (formulario o informe) a un módulo independiente, no puedes simplemente copiar y pegar el código y esperar que funcione, principalmente si tienes referencias a los distintos controles del objeto (no puedes usar Me. NombreControl, hay que usar otra sintaxis para hacer referencia al informe/formulario). Imagino que alguno de los errores te vendrá por ese lado.

La declaración de una variable como pública en un módulo independiente es correcta tal como la haces: Public nombre As Tipo.

Si me pones el código completo que tienes en el módulo estándar y me señalas las líneas en al que te da el error 424 y el otro, quizás te pueda decir cómo solucionarlo.

Te puedo pasar la base de datos a algún correo?

Sí, envíala comprimida (en rar o zip) a: [email protected] 

Si tiene muchos objetos (formularios, informes...) deja solo los que intervengan en la pregunta, o indícame los que hay que mirar, para no volverme loco buscando... XD

Ya te lo he enviado

Haz estos cambios:

En el evento del informe2, borra todo y pon simplemente:

Private Sub Detalle_Print(Cancel As Integer, PrintCount As Integer)
PintaColor Me
End Sub

En el módulo, borra la función y pon este procedimiento:

Public Sub PintaColor(elInforme As Report)

If elInforme.Color = "Amarillo" Then elInforme.Nombre.BackColor = RGB(255, 255, 0)
If elInforme.Color = "Rojo" Then elInforme.Nombre.BackColor = RGB(255, 0, 0)
If elInforme.Color = "Azul" Then elInforme.Nombre.BackColor = RGB(0, 200, 255)
If elInforme.Color = "Verde" Then elInforme.Nombre.BackColor = RGB(0, 255, 0)
End Sub

Al procedimiento PintaColor le tienes que pasar el informe sobre el que vas a actuar. Yo opté por pasarle directamente el inform, pero podrías haberlo hecho pasando el nombre del informe (sería Public Sub PintaColor(elInforme As String)) y luego cambiaría la sintaxis:

If Reports(elInforme).Color = "Amarillo" Then Reports(elInforme).Nombre.BackColor = RGB(255, 255, 0)

Color y Nombre son los nombres de tus cuadros de texto. También se podría haber puesto así:

If elInforme.Control("Color") If Reports(elInforme).Control("Color")

Un saludo


¡Gracias! Funciona perfectamente.

Muy sencillo pero muy eficaz. Sin tu ayuda no habría llegado a solucionarlo porque los manuales que he encontrado de Access no llegan a ese nivel.

Muchas gracias de nuevo, y continúa ayudando a los que lo necesitamos.

Votado como EXCELENTE, y por que no hay valoración más alta.

Perdona, se me había olvidado antes, que misión tiene el "Me" después de "PintaColor" para llamar al módulo desde el informe? He visto que si lo quito da un error.

Me gusta aprender, para próximas ocasiones.

Fíjate en cómo está declarado el procedimiento (para una función sería igual):

Public Sub PintaColor(elInforme As Report)

Lo que va entre los paréntesis (y marco en negrita) es el parámetro de entrada del procedimiento, es decir, un valor que hay que pasarle para que el código funcione. En este caso, se trata de un parámetro llamado elInforme y es de tipo Informe (Report).

En el código del evento del informe, llamas al procedimiento con la linea:

PintaColor Me

Donde Me es es valor del parámetro: hace referencia al objeto actual, en este caso el informe.

Otro ejemplo: imagina esta función:

Public Function fncMedia(Valor1 as Integer, Valor2 as Integer) as Double

fncMedia=(valor1+valor2)/2

End Function

Esta sería una función que devuelve la media (valor de tipo doble) de dos números (Valor1 y Valor2 definidos como enteros). Para que funcione tienes que pasarle dos números enteros. Si no le pasas ninguno, solo uno, o alguno de ellos no es un entero, te dará errores.

Y ahora unos minutos de publicidad.. XD: pásate por la web de Neckkito (http://siliconproject.com.ar/neckkito/ ) y mira el manual de VBA que tiene (y en general todo el material). Yo empecé así y mírame ahora...

También te invito a seguir nuestra web (mía y de Neckkito), pues aunque de momento solo hay activo un foro dedicado a Access, estamos trabajando en nuevas secciones sobre Access, para tener todo integrado en un mismo espacio: http://nksvaccessolutions.com/

Ah, por cierto, que se me olvidaba comentarte: cuando declares una variable como public, has de hacerlo a nivel de módulo, es decir, debajo de las distintas Option que tengas en el módulo y fuera de cualquier Sub o Function. Por eso te daba el error.

Te quedaría así:

Option Explicit
Option Compare Database
'Aquí declaras una variable pública
Public Col As String
Public Function unaFuncion() as String
'aquí declaras variables para el procedimiento/función
Dim var As...
...
End Function

Muchísimas gracias.

Tomo nota de la web que me comentas y me la pondré en favoritos para tenerla a mano.

No hay de qué. Hasta la próxima

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas