2009-05-28 14 views
5

Tenemos un montón de informes que se generan a través de VBA & Excel. Solo un pequeño porcentaje de los informes son cálculos reales: la mayoría del trabajo son llamadas sql y formateo/escritura de celdas. El más largo de los cuales toma varias horas, la mayoría toma alrededor de 20-30 minutos cada uno.Libre perfil VB6/VBA y mejores prácticas de Excel

El código de VBA/Excel se conecta a un dll que utilizan las aplicaciones de escritorio VB6, es aquí donde se realizan todas las llamadas sql. Aunque estoy seguro de que hay margen de mejora aquí, no es esto lo que me preocupa: las aplicaciones de escritorio son bastante rápidas.

Dos funciones VBA se utilizan en abundancia: se llaman GetRange y SetupCell y casi siempre aparecen juntas. La función GetRange es un contenedor para el objeto Excel.Range. Toma una hoja y 4 valores para las extensiones del rango. Su uso principal es elegir la celda para editar. No parece haber muchas posibilidades de optmizarlo, pero ¿es la mejor manera?

Su socio es SetupCell. Esto toma un objeto Excel.Range, texto y una docena de parámetros sobre la celda (fuente, bordes, etc.). La mayoría de estos parámetros son booleanos opcionales pero, una vez más, parece un desperdicio. Algunos de estos pueden configurarse póstumamente, pero algunos dependen de los valores contenidos en la celda.

Hay un montón de código en estas funciones, principalmente si las declaraciones y el trabajo no me agradecerán que lo publique.

supongo Tengo dos preguntas: ¿Existe una mejor manera y para qué sirve y es que hay perfilador libre que puedo usar para ver si la mayor parte del tiempo está aquí o en el DLL?

Respuesta

3

¿Ha pensado en utilizar una solución de informes real? ¿Cuál es tu backend db? Si está utilizando MSSQL 2000 o superior, existe una solución de informes bastante decente que puede usar sin cargo. SQL Server Reporting Services.

Parece que los informes pasan la mayor parte de su tiempo formateando celdas. Esta podría ser la razón por la que los informes parecen tan lentos y la aplicación de escritorio no.

Alternativamente, si conoce el formateo de antemano y es bastante estático, puede preformatear las hojas para reducir parte del trabajo.

Voy a arrojar esto allí también. La mayoría de las soluciones de informes permitirán el formato condicional y demás, pero dado que están diseñados para funcionar, el rendimiento será mucho mejor que tener Excel.

+0

No es tan fácil. Los informes deben ser de diferentes longitudes, algunas de las celdas deben colorearse según el valor de las celdas (o la suma de las celdas). –

+0

SSRS podrá hacer frente a casi todo lo que le arroje; en segundo lugar esta respuesta. –

3

Esto no es una recomendación de perfiles, pero es una sugerencia para acelerar las macros de Excel que están gastando su tiempo actualizando la pantalla. He obtenido resultados excelentes al desactivar la actualización de la pantalla mientras se ejecuta la macro: configure Application.ScreenUpdating = False y also using a number of other similar settings. Sólo asegúrese de volver a activarlos de nuevo cuando termina la macro: P

+0

Ya hacemos esto y configuramos Application.Calculation en manual (xlCalculationManual). –

1

No es gratis, pero puede perfilar con esto. Sospecho que la demostración será adecuada a sus necesidades: http://www.aivosto.com/vbwatch.html

+0

Para algunos de los informes, sí. Para otros, no. Para cada hoja de trabajo tenemos un vba 'archivo', más varios 'archivos' de soporte. Definitivamente no funcionará en el dll, ya que tiene más de 100 cientos clases y módulos. –

6

varias horas es ridículo para un informe.

Si el problema es comprar VBA "Professional Excel Development" (stephen Bullen, Rob Bovey et al): esto tiene un perfilador de VBA gratuito llamado PerfMon.

Si el problema es de cálculo Excel ver http://msdn.microsoft.com/en-us/library/aa730921.aspx?ppud=4

pero me imagino que el problema es la alta sobrecarga asociada con referencia a cosas celda por celda: siempre se debe trabajar en grandes bloques de celdas a la vez.

+0

Bonito pimpollo para ti :-) En serio, aunque el problema no está en el cálculo, hacemos muy poco cálculo (excelente o no). Un generador de perfiles ayudaría a determinar si las llamadas a la base de datos están matando al sistema o si el formateo lento célula por celda lo está matando. ¿Cómo se puede trabajar con un gran bloque de células a la vez? –

+2

Si no desea utilizar el PerfMon de Stephen Bullen, ¿por qué no simplemente agrega un código de tiempo de espera con el temporizador de Windows de alta resolución? hacer las cosas en bloques: el enfoque básico es asignar un rango a una variable variante: Dim varR como variante varR = Range ("B4: z456") valor2 esto le dará una variante que contiene un 2-D. matriz Puede manipular la matriz y enviarla de nuevo a excel Rango ("B4: z456") = vArr similarmente al formatear celdas formatee un rango de celdas (probablemente utilizando copy/pastespecial desde una hoja de plantilla) en lugar de una sola celda. etc. etc. –

0

Parece que el código VBA (o el código VB que está escribiendo en las hojas) lo está haciendo línea por línea, esto puede tomar años, y es un diseño pobre. Escriba a Excel como una variante de una vez. Formatee la hoja después de importar todos los datos. Gracias Ross