2010-07-15 13 views
32

¿Qué es una buena práctica y una buena higiene del código? Poniendo código en Módulos o Hojas de cálculo?Ponga el código de Excel-VBA en el módulo o la hoja?

Tengo este Excel Workbook, con interfaces de usuario en cada hoja. Cada hoja dentro del libro de trabajo hace una parte diferente de alguna tarea general. ¿Debo colocar el código relevante para cada hoja dentro de los objetos de la Hoja o en Módulos? Agrupe en un módulo o módulos separados?

estoy usando Excel 2003.

Respuesta

40

Definitivamente en los módulos.

  • Las hojas se pueden eliminar, copiar y mover con resultados sorprendentes.
  • No puede llamar al código en la hoja "código subyacente" de otros módulos sin calificar completamente la referencia. Esto conducirá al acoplamiento de la hoja y el código en otros módulos/hojas.
  • Los módulos se pueden exportar e importar a otros libros y ponerlos bajo control de versión
  • El código dividido lógicamente en módulos (acceso a datos, utilidades, formato de hoja de cálculo, etc.) puede reutilizarse como unidades y es más fácil de administrar si tus macros se agrandan

Desde el utillaje es tan pobre en los sistemas primitivos como Excel VBA, las mejores prácticas, la higiene y obsesivo código siguiente religiosa de convenciones son importantes, especialmente si usted está tratando de hacer algo remotamente complejo con ella.

This article explica los usos previstos de diferentes tipos de contenedores de código. No califica por qué estas distinciones deberían hacerse, pero creo que la mayoría de los desarrolladores que intentan desarrollar aplicaciones serias en la plataforma Excel las siguen.

También hay una lista de VBA coding conventions que he encontrado útil, aunque no están directamente relacionados con Excel VBA. Por favor ignore las locas convenciones de nombres que tienen en ese sitio, es todo loco húngaro.

+1

notación húngara como im Completado en la Convención de Nombramiento Reddick ha sido más o menos el estándar para nombres variables para Visual Basic para Aplicaciones y VB6. Mientras que ciertamente evitaría su uso en .NET donde las herramientas son muy fuertes, no está de más usarlo en VBA, donde las herramientas son más antiguas. –

+0

@Ben - "Húngaro loco" se dijo irónicamente :) Mientras que el húngaro ayuda con la falta de tipado estático y las herramientas alrededor de "¿qué es esto otra vez?", Creo que se queda corto cuando se va más hacia el objetivo- VBA orientado y comienza a crear tus propios objetos de dominio. Mi mayor queja, sin embargo, es que el húngaro realmente ensucia con el flujo del código de * lectura *. Cada uno para los suyos, no es un punto religioso para mí. Pero si alguien pregunta, no lo recomendaré. – jevakallio

+0

Buen punto. Estoy de acuerdo con que al construir clases en VBA, el húngaro puede hacer que tus objetos se vean feos. Tal vez todavía lo uso en VB6 para recordarme a mí mismo que estoy trabajando en VB6 :-). –

9

Según mi experiencia, es mejor poner la mayor cantidad de código posible en módulos bien nombrados, y solo poner la cantidad de código necesaria en los objetos reales de la hoja de trabajo.

Ejemplo: cualquier código que utilice eventos de hoja de cálculo como Hoja de trabajo_Cambio de selección o Hoja de cálculo_calcular.

+0

Esa es mi política general también. – Lunatik

9

Sugeriría separar su código en función de la funcionalidad y el propósito específico de cada hoja o módulo. De esta manera, solo colocaría el código relativo a la UI de la hoja dentro del módulo de la hoja y solo colocaría el código relacionado con los módulos en los respectivos módulos. Además, utilice módulos separados para encapsular código que se comparte o reutiliza entre varias hojas diferentes.

Por ejemplo, digamos que varias hojas que son responsables de mostrar los datos de una base de datos de una manera especial. ¿Qué tipo de funcionalidad tenemos en esta situación? Tenemos funciones relacionadas con cada hoja específica, tareas relacionadas con la obtención de datos de la base de datos y tareas relacionadas con rellenar una hoja con datos. En este caso, podría comenzar con un módulo para el acceso a datos, un módulo para llenar una hoja con datos, y dentro de cada hoja tendré código para acceder al código en esos módulos.

Se podría disponer así.

Módulo: DataAccess:

Function GetData(strTableName As String, strCondition1 As String) As Recordset 
    'Code Related to getting data from the database' 
End Function 

Módulo: PopulateSheet:

Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset) 
    'Code to populate a worksheet ' 
End Function 

Hoja: Código Hoja1:

Sub GetDataAndPopulate() 
    'Sample Code' 
    Dim rs As New Recordset 
    Dim ws As Worksheet 
    Dim strParam As String 
    Set ws = ActiveSheet 
    strParam = ws.Range("A1").Value 

    Set rs = GetData("Orders",strParam) 

    PopulateASheet ws, rs 
End Sub 

Sub Button1_Click() 
    Call GetDataAndPopulate 
End Sub 
Cuestiones relacionadas