Ampliando y mejorando el objeto PivotTable en VBA/Excel

Estándar

Hace poco estuve trabajando a fondo en un proyecto que calcularía a futuro (3 meses) los días de inventario para varias divisiones, categorías, mg y sku por cliente. Para empezar las bases de datos con los que tendría que hacer los cálculos (inventarios, sell in, sell out) eran bases de datos que superaban los 500 mil registros, tuve que verme en la necesidad de previamente compactar la información de manera manual usando tablas dinámicas, luego supuse que tendría que crear varios resúmenes de datos, ya sea por cliente, categoría, etc… así que pensé pudiera hacerlo en Access (y quizás hubiese sido buena alternativa), desgraciadamente el prototipo tenía que estar listo en el menor tiempo posible, así que decidí hacerlo en VBA/Excel sobre todo por tenía que manejar acumulados entre meses y no se hacer ese tipo de consultas en Access (ya aprenderé).

Así que… resúmenes de datos, eh? Nada mejor para resumir datos que una tabla dinámica! Pero no estaba muy familiarizado con los métodos y propiedades así que decidí crear un objeto para ayudarme en el proyecto, este objeto tendría que ayudarme a diseccionar los datos, es decir de un resumen obtenido, quedarme con cierta parte del mismo.

Vaya solo cree algunos pocos métodos y propiedades y eso basto para facilitarme el trabajo, pero aún me falta agregar más funcionalidad a mi clase, por el momento les comparto la misma.

Les comparto el archivo de ejemplo.

Saludos!

Anuncios

clsString – Clase en VBA/Excel para la gestión de cadenas de caracteres

Estándar

Un secreto importante de los programadores de éxito es que nunca pierden tiempo escribiendo el mismo código dos veces. Tienen pequeñas o incluso grandes partes de código que utilizan una y otra vez. Es por ello que desarrolle una clase que me brindara todas las funciones que utilizo en la mayor parte de mis desarrollos de software,  una clase para el manejo y gestión de cadenas en VBA/Excel. Esta nueva clase viene a sustituir a la que habia desarrollado previamente en este post.

Hace unas semanas decidí rediseñar nuevamente dicha clase a la cual nombre como clsString y que está totalmente inspirada en el en el objeto String que proporciona el lenguaje de programación Ruby. Continuar leyendo

Creación y uso de Listas en VBA/Excel

Estándar

Para todos aquellos que han programado en Python, sabrán la gran ventaja que se obtiene al utilizar Listas o quizás para aquellos que han probado Ruby y han utilizado Arrays, ambos… Listas y Arrays son lo mismo. Son colecciones ordenadas de elementos a las cuales se accede a través de un índice y con dichos objetos la programación se simplifica enormemente, ya que poseen métodos y propiedades que facilitan la labor del programador. Desgraciadamente para todos aquellos que programamos en VBA/Excel tendremos que conformarnos al usar simples matrices las cuales nos brindan pocas posibilidades al respecto, ya que las mismas no son objetos.

Mi fascinación respecto a estos objetos, me llevo a la tarea de tratar de emularlos en VBA/Excel con la creación de una clase llamada clsList la cual incorpora algunos elementos Python y otros de Ruby.

Espero que esta clase sea de gran utilidad para todos aquellos programadores de VBA/Excel que están en busca de herramientas que faciliten su labor diario y al mismo tiempo recibir comentarios y sugerencias para ampliar y mejorar la clase.

Comparto con ustedes el siguiente enlace, donde podrán descargar el módulo de clase y un libro con ejemplos sobre el funcionamiento de la misma.

Clase Lista

clsLog – Registrar el funcionamiento y operaciones que realiza una macro

Estándar

Hace unas semanas me encontraba elaborando la macro para recolectar los datos de varios libros en unos solo. Había casos en los que debido a la mala disposición de los datos, mi macro no sería capaz de tomar los datos. Entonces, que hacer para informar de ello al usuario?

Podría imprimir un mensaje en pantalla indicando el archivo y el tipo de error y detener la ejecución de la macro para que el usuario hiciera las modificaciones de forma manual y ejecutara nuevamente la macro. Este proceso no se me hizo tan fluido, así que me vino a la mente que en un anterior empleo había un sistema que llevaba un Log (bitácora) de todos los cambios y errores en el mismo, así que puse manos a la obra y programe un modulo de clase llamado clsLog con lo cual podría emular la funcionalidad de dicho sistema.

Una vez contando con dicho modulo de clase el usuario ejecutaba la macro y si la macro encontraba algún error en cualquier archivo y por lo mismo no incorporaba los datos, se escribían las observaciones al archivo Log, con esto la ejecución era más fluida. Al terminar la macro, el usuario revisaba el archivo Log para ver si había archivos que tenían problemas y si era así corregirlos todos para ya solamente ejecutar la macro una vez mas.

La clase clsLog cuenta:

  • AddData              – Se encarga de agregar una cadena de texto al Log
  • NewLine             – Agrega un salto de línea al Log
  • Save                      – Escribe el contenido del Log en un archivo
  • Path                      – Establece la ruta de donde se escribirá el Log, en caso de no proporcionar una ruta y nombre, el Log se escribirá en la ruta del actual y con un nombre genérico como “Log-(ddmmyyyy)”

 

Dejo un archivo de ejemplo que incluye la clase clsLog, recuerden que solo deben importarla a sus proyectos con lo cual tendrán todas sus ventajas a su alcance.

Clase Dir – Gestion de archivos y directorios en VBA/Excel

Estándar

Es bien sabido que en VBA/Excel contamos con el FSO (File System Object) para la gestión de archivos y directorios, el cual es muy poderoso. Sinceramente debo confesar que no tengo mucha experiencia en su utilización y han sido contadas las veces que lo he utilizado.

Sin Embargo VBA incorpora un modulo llamado FileSystem el cual procedimientos utilizados para realizar operaciones que afecten a archivo, directorio o carpeta y del sistema. Estas constantes se pueden utilizar en cualquier parte del código. Tales procedimientos pueden ser: Dir, FileCopy, Kill, CurDir, entre otros…

Bueno en base a lo anterior tuve la inquietud de crear un modulo de clase para crear un objeto llamado Dir, el cual extienda y mejore las prestaciones del modulo FileSystem y brinde una interfaz más amigable y provechosa para el programador. Sera tan fácil listar el contenido de los directorios, borrar y eliminar archivos y directorios, renombrar archivos entre otras cosas más…

Comparto el archivo que contiene la clase y otros archivos para probar su funcionamiento.

Clase Dir

Ampliando VBA – Creando nuevos objetos con módulos de clase

Estándar

Con la introducción de Visual Basic 4, Microsoft brindo a los programadores una nueva herramienta:  “Módulos de clase”, los cuales dan la habilidad al programador de crear y manipular sus propios objetos de clase.

Si se tiene experiencia en lenguajes orientados a objetos como C++, SmallTalk se estará familiarizado con los beneficios de esta metodología. Si no, espero que el ejemplo proporcionado para este tema los sorprenda con el poder que brindan los módulos de clase al programador.

Con los módulos de clase podemos implementar estructuras de datos tales como listas enlazadas o hacer abstracciones de las funciones de la API de Windows.

Como saben soy fan de Python y Ruby, entonces haciendo uso de los módulos de clase, porque no crear objetos como los que disponen estos lenguajes y tenerlos disponibles en VBA/Excel, los cuales ahorran gran cantidad de tiempo al programador para el procesamiento de datos.

Este no es un tutorial de cómo crear clases en VBA (hay muchos tutoriales y libros en la web) sino más bien pondré al alcance de los interesados algunos módulos que iré desarrollando para facilitar nuestra vida como programadores VBA/Excel, así mismo estoy abierto a comentarios y sugerencias para poder crear clases de la mejor forma, entre mas ideas, mejor…

Si alguien está interesado en profundizar en este, les recomiendo el siguiente libro, el cual es un excelente libro que no puede faltar en la biblioteca personal de todo programador de VBA/Excel, este es el link (lo único mal es que esta en ingles):

VBA Developer’s Handbook, Second Edition

Y aquí está mi nuevo objeto (clsStr) quiero emular un objeto de la clase String como los que proporciona Ruby o Python, les dejo el enlace:

clsStr

Nota: esta clase no está finalizada, sino que iré agregando nuevas propiedades y métodos al mismo.