Tengo bastantes instancias en las que comienzo con un subformulario básico, luego tengo otros 3 subformularios que se basan en él, cada uno añadiendo algunos elementos diferentes a los básicos. Esto significa que tengo una página de códigos para cada subformulario, con muchas repeticiones. ¿Está bien colocar los elementos comunes en un módulo separado y dejar solo el código adicional relevante para cada subformulario en su página de códigos? ¿Hay algún problema de rendimiento con esto?¿Cuándo debo mover el código de VBA de un módulo de formulario a un módulo separado?
Respuesta
En cuanto a la última parte de su pregunta, "? ¿Hay problemas de rendimiento con este"
Hay 2 consecuencias Soy consciente de:
- tiempo de carga del formulario
- uso de memoria
Como ejemplo hipotético, imagine que tiene un formulario con un control de tabulación. Ese control de pestañas contiene 10 páginas, y cada página contiene un subformulario. Si esos subformularios incluyen copias del mismo código VBA, ese código común debe cargarse nuevamente para cada subformulario. Eso lleva tiempo y aumenta el uso de la memoria.
Si mueve el código común a un módulo estándar y lo referencia desde sus subformularios, necesita cargarlo solo una vez ... reduciendo tanto el tiempo de carga de formulario como el consumo de memoria.
El resultado neto es que el enfoque que está considerando podría hacer que su aplicación sea más receptiva ... lo que puede conducir a usuarios más felices.
Sin embargo, incluso si ese enfoque no produce una mejora notable en el rendimiento, aún así lo haría de todos modos, ya que significa que necesitará mantener una sola copia del código común.
Las computadoras parecen ser lo suficientemente rápidas estos días que los problemas de rendimiento que mencionas rara vez son obvios para el usuario. +1 para su última línea. La centralización de código es tan importante cuando se trata de la administración futura de su código/aplicación. – HK1
@ HK1 He visto la aplicación de Chelle. La forma principal es similar a mi caso "hipotético", y hay un retraso * significativo * en la carga de formulario. Sin embargo, no estoy realmente en desacuerdo con su punto ... no sería un gran problema con una forma menos compleja. De todos modos, parece que usted y yo estamos totalmente de acuerdo con la centralización del código RE. :-) – HansUp
Todavía estoy aprendiendo nuevas formas de mejorar la capacidad de administración de los códigos. Parece que es un proceso interminable de aprendizaje y refinamiento. – HK1
Respuesta corta, sí, hazlo, divide el código que se repite entre cada uno de los formularios.
Respuesta larga, pero extraer el código que se repite en un módulo o clase por separado es, en mi opinión, la mejor manera de hacerlo.
Las clases hacen que su código sea más manejable y más fácil de mantener. Si tiene un código similar en varios lugares, dificulta el mantenimiento porque debe cambiarlo en cada ubicación. Tenerlo ubicado en un solo lugar hace que sea más fácil de administrar y mantener.
La lista de ventajas fue tomada desde un Chicago Access Users Group (CAUG) talk - "Class Modules in Access"
:
Advantages of using classes/objects:
- let's you create more complex objects than tables or queries provide
alone
- using classes within classes let's you restrict function visibility
- class methods & attributes are more descriptive than module's
function list alone
- let's you use Intellisense for more efficient coding
- no "ambiguous name" errors with multiple copies of the same class
module
- can copy class modules without worry of creating ambiguous function
names
- static variables are implicit in class objects, and so are easier to
manage
- isolating access layers within wrapper classes promote
portability/maintainability
- better support for separation of UI/business logic/data access =
n-tier development
- promotes modular thinking in analysis, design
- easier to adapt many publicly-available object models to Access apps
- prepares you for transition to .NET and other fully object-oriented
architectures
+1 Nunca me había tomado el tiempo para compararlos realmente antes, uso ambos pero siempre he preferido el módulo estándar sobre la clase, pero esos puntos son interesantes. –
Si estoy entender la pregunta, sí se puede centralizar una cierta cantidad de código moviéndolo en un módulo de código estándar. Probablemente haya varias formas de hacerlo, pero una de las mejores formas es pasar el objeto de formulario a sus funciones. He aquí un ejemplo:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If ValidateContact = False Then Cancel = True
End Sub
'This code goes in a standard code module not associated with any form
Public Function ValidateContact(ByRef frm as Form) as Boolean
Dim bValid as Boolean
bValid = True
If Nz(frm!FirstName, "") = "" Then
MsgBox "First Name cannot be blank."
bValid = False
ElseIf Nz(frm!LastName, "") = "" Then
MsgBox "Last Name cannot be blank."
bValid = False
End If
ValidateContact = bValid
End Function
Además, si he entendido bien tu eres cuestión no es en absoluto acerca del uso de módulos de clase/clase objetos, al menos no de forma explícita. (En verdad, básicamente cada bit de código que escribe en Access está haciendo uso de un objeto de clase, la mayoría de las veces implícitamente). Otro usuario de SO ya ha publicado una gran respuesta sobre los beneficios de usar objetos de clase en Access, por lo que no expondré mucho más en eso. En verdad, los módulos de código estándar son básicamente una clase Singleton que no tiene que ser instanciada como lo hace un objeto de clase. Hay razones por las que se prefieren los módulos de código único/estándar, al menos para algunas cosas, aunque solo sea por el simple hecho de que es más fácil llamar a las funciones. Sin embargo, si se encuentra escribiendo funciones que tienen cuatro o más argumentos, probablemente se beneficie al cambiarlo a un objeto de clase que le permita establecer propiedades antes de llamar a métodos relacionados.
- 1. McAfee elimina el código del módulo de VBA
- 2. Obtener un valor de texto de un formulario en Access utilizando un módulo de VBA
- 3. Crear formulario mediante programación en el módulo utilizando vba
- 4. Llamar a una subrutina desde un módulo diferente en VBA
- 5. ¿Cómo debo pasar opciones a un módulo de nodo?
- 6. ¿Qué es un módulo de objeto público en VBA?
- 7. Reconociendo cuándo usar el operador de módulo
- 8. Definición de modelos de mangosta en el módulo separado
- 9. Mover un grupo de configuración personalizado a un archivo separado
- 10. Mover constantes a un ensamblaje separado
- 11. Cuándo usar un módulo y cuándo usar una clase
- 12. ¿Debo cambiar mis utilities.pl a un módulo utilities.pm?
- 13. socket.io de un módulo
- 14. Cómo dividir el código de un módulo en archivos separados
- 15. Ponga el código de Excel-VBA en el módulo o la hoja?
- 16. Construyendo un módulo kernel de Linux fuera de árbol en un directorio de objetos separado
- 17. Ejecutando un formulario Tkinter en un hilo separado
- 18. Incluyendo un módulo en otro módulo
- 19. Error al instalar un módulo de python
- 20. Importación de un módulo opcional
- 21. ¿Mover elementos de compilación en msbuild a un archivo separado?
- 22. Módulo VBA que ejecuta otros módulos
- 23. de objetos Python Importación que se origina en un módulo de un módulo diferente en un tercer módulo
- 24. Haciendo que un módulo herede de otro módulo en Ruby
- 25. Llamar a un método en un módulo de Rubí
- 26. ¿Hay un módulo Equivlant Perl para el módulo pydbg?
- 27. Drupal - mover la carpeta del módulo
- 28. Cómo codificar un módulo kernel de Linux?
- 29. Enviando un paquete a través de un módulo kernel
- 30. ¿Cómo incluir C backtrace en un código de módulo kernel?
cuando dice "Clase", ¿quiere decir Módulo de clase o Módulo de código de formulario? – HK1
@ HK1: No mencioné 'Clase' en absoluto. Intenté configurar un nuevo módulo para uno de los subformularios y mover todo el código repetido en él, pero no funcionó, los cambios en los otros subformularios no desencadenaron el código del evento correctamente. – Chelle
La palabra "clase" aparece en el título. – HK1