Ordenación de datos

Estándar

En el mundo de la informática, quizá no haya tareas más fundamentales o tan extensamente analizadas como lo son la ordenación y la búsqueda. Estas rutinas se utilizan virtualmente en todos los programas de bases de datos, así como en compiladores, intérpretes y sistemas operativos.

La ordenación es el proceso de colocar un conjunto de elementos similares de información en un orden ascendente o descendente.

Existen básicamente tres métodos generales que se pueden usar para ordenar arrays:

  • Por intercambio
  • Por selección
  • Por inserción

Imaginemos una baraja de cartas. Para ordenar las cartas por “intercambio”, se extenderían las cartas boca arriba, sobre una mesa y se procedería a intercambiar las cartas que no están en orden hasta que la baraja estuviese ordenada.

Para ordenar por “selección” se extenderían las cartas sobre la mesa, se seleccionaría la carta de menor valor y se sacaría de la baraja. Entonces de las cartas que quedan sobre la mesa, se seleccionaría la carta más baja y se colocaría detrás de la que ya se tiene en la mano. Este proceso continuaría hasta que todas las cartas estuviesen en la mano con lo cual las cartas estarían ordenadas.

Para ordenar por “inserción“, se mantendrían las cartas en la mano cogiendo una cada vez. Mientras se cogen cartas de una mano, se van colocando en un mazo sobre la mesa, siempre insertándolas en la posición correcta. La baraja estaría ordenada cuando ya no queden cartas en la mano. Les comparto una macro con el código de ejemplo de cada uno de los algoritmos de ordenación.

Mas adelante estare publicando algoritmos mas avanzados de ordenación.

Anuncios

Utilizando Arrays en VBA – Parte 1

Estándar

Muchos de los estudiantes de programación se sienten intimidados al escuchar la palabra Array (matriz) y evitan en muchos casos el uso de los mismos en sus proyectos, pero esto se debe al poco o mal conocimiento de los mismos. No se diga si se tiene que programar en C, C++ o Java. En estos lenguajes uno puede quedar frustrado al intentar hacer uso de los Arrays. Sin embargo existen otros lenguajes donde usar Arrays es cosa de niños (fácil e intuitivo).

Para el caso de VBA Excel se está en un punto medio, no es tan difícil hacer uso de ellos y realmente pueden hacer que algunas macros tarden tan poco tiempo, el problema de los Arrays en VBA es que existen pocas herramientas a nivel programación que nos brinda el lenguaje para poder procesarlos fácil y rápidamente.

¿Pero que es un array?, ¿Para qué sirve?  y  ¿Cómo se usan?. Antes que nada un array es un tipo de variable como lo es un integer, un string pero con la capacidad especial de poder albergar más de una variable y en el caso de VBA dichas variables pueden ser de distinto tipo.

Todos aquellos que han usado Excel, sean o no programadores ya han trabajado con una matriz o array, pero por supuesto!. Una hoja de cálculo no es más que una matriz (array) bidimensional de más de un millón de filas y poco más de 16 mil columnas (en el caso de Excel 2007 en adelante) y como todos sabemos podemos introducir un número, fecha o texto dentro de una celda, lo mismo es aplicable a los arrays en VBA.

En la próxima entrega empezaremos a trabajar de manera eficiente con los arrays, veremos más propiedades de los mismos y las herramientas que nos brinda VBA para su manipulación.

Cinta de opciones (RibbonX)

Estándar

Como es bien sabido a partir de la versión 2007, Microsoft agrego la cinta de opciones al Office, incluyendo a Excel, a muchos les disgusto el cambio ya que para entonces se podía ocultar, modificar y manipular la barra de menús y herramientas que proporcionaba Excel por medio de VBA. La cinta de opciones desplazo a la barra de menús y herramientas desde entonces.

Aun se puede recurrir a VBA para crear barras de menús y herramientas dentro de la cinta opciones pero no se aprovecha al máximo las prestaciones y personalización de la nueva cinta. Para poder programar la cinta y sacar ventaja de la misma en nuestras macros o aplicativos se puede utilizar Visual Studio u otras herramientas.

En este artículo no explicare como se programa la cinta, si no que les comparto el libro: “RibbonX for Dummies ” el cual explica y brinda números ejemplos para acceder y manipular la cinta de opciones.

Web scraping – Obteniendo la temperatura de los próximos días

Estándar

En esta ocasión vamos a extraer la temperatura de un portal de internet, de la siguiente página: openweathermap.org/city/3530597 que muestra la temperatura de los próximos días de la ciudad de México.

Para efectuar esta tarea haremos uso del objeto Internet Explorer para poder navegar a dicha página y una vez cargada la misma empezamos a realizar la extracción del texto correspondiente y lo vaciamos en las celdas de nuestro libro.

Antes que nada tendremos que agregar la referencia necesaria para trabajar con el navegador de la siguiente forma:

001

Una vez agregada la referencia correspondiente podemos hacer uso las propiedades y métodos del objeto IE y tener la ventaja del intellisense al codificar con el objeto, después de ello procedemos a escribir el siguiente código:


Sub Clima()
Dim oIE As InternetExplorer
Dim sContenido As String
Dim lPosicion As Long
Dim vContenido As Variant
Dim i As Integer
Set oIE = New InternetExplorer 'aqui se crea y se ejecuta una instancia del navegador
With oIE
.Visible = True 'con esta instruccion hacemos visible el navegador
.Navigate "http://openweathermap.org/city/3530597"
'esperamos hasta que se haya cargado la pagina en el navegador
While .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
sContenido = .Document.body.innertext 'se almacenatodo el texto desplegado por la pagina
'vemos que la cadena "next days" solo aparece una vez en el texto de la pagina y de ahi en adelante viene la
'temperatura de los dias siguiente...
lPosicion = InStr(1, sContenido, "Next Days", vbTextCompare) 'encontramos su posicion
sContenido = Mid(sContenido, lPosicion + Len("Next Days"), 1000) 'cortamos la cadena
vContenido = Split(sContenido, vbNewLine) 'spliteamos por linea de texto
'procesamos cada linea de texto, vemos que las lineas que nos interesan tienen una ma longitud menor a
'40 caracteres (a ojo de buen cubero)
For i = LBound(vContenido) To UBound(vContenido)
If Len(vContenido(i)) > 0 And Len(vContenido(i)) < 40 Then
Range("A65500").End(xlUp).Offset(1, 0) = vContenido(i) 'escribos la info en nuestra hoja de excel
End If
Next
.Offline = False
.Quit 'cerramos el navegador para que no cnsuma memoria
MsgBox "Temperaturas extraidas con éxito", vbInformation
End With
Set oIE = Nothing
End Sub

Aquí comparto la macro con el código de ejemplo.

Realizando “benchmark” en el rendimiento del código en VBA – Pte 2

Estándar

Tal como mencione en la parte anterior de este artículo, comparto con ustedes la clase desarrolla para medir el tiempo que toma una macro, loop, rutina o función en ejecutarse. Dicha clase tiene como nombre: “clsTimer”. La cual nos permite obtener el tiempo consumido en minutos, segundos y milisegundos

Un ejemplo de cómo usar dicha clase seria:

Sub test()
Dim oTimer As clsTimer
Dim i As Long
Dim contador As Long
Set oTimer = New clsTimer
oTimer.StartTimer
For i = 1 To 400000000
contador = contador + 1
Next
MsgBox oTimer.GetElapsedTime(Seconds) & " segundos!", vbInformation
End Sub

Comparto el enlace con el ejemplo y el módulo de clase para que puedan usarlo en sus propios proyectos. Ejemplo

MXUtilities Ver 1.5

Estándar

Estoy de regreso con la versión 1.5 del complemento MXUtilities a la cual se le han corregido algunos bugs para Excel 2013. Como novedad este complemento incorpora tres nuevas funcionalidades:

  1. Poder prorratear un total en un conjunto contiguo de celdas
  2. Poder prorratear una cantidad en un conjunto de celdas visibles
  3. Poder descargar el audio en formato MP3 de algunos videos de Youtube

Las dos primeras utilidades serán de gran ayuda para todos aquellos que trabajen en contabilidad y finanzas. Cabe mencionar que se debe ser cuidadoso ya que al hacer uso de estas do herramientas no se podrán deshacer los cambios.

La tercera será de gran entretenimiento para todos aquellos que deseen descargar una canción de su gusto a formato MP3 desde Youtube. Esta utilidad puede que no funcione para todos los videos y solo se pueden descargar como máximo 7 minutos de audio.

MXUtilities Ver 1.5

Utilizar Access como aplicación de soporte para mejorar el acceso multiusuario a los datos

Estándar

Desde la versión 2007 de Excel, se cuenta con más de un millón de filas, una mejora sustancial de la versión 2003 donde solo se contaban con 65 mil, pero aunque parezca que un millón puede ser suficiente, en algún momento se tiene que admitir que, aunque Excel es el mejor producto del mundo, ha llegado el momento de pasarse a Access y aprovecharse de los archivos ACCDB de Access.

Incluso antes de que tenga que se tenga un millón de filas, otra razón irresistible para utilizar archivos de datos ACCDB es permitir el acceso multiusuario a los datos sin los dolores de cabeza asociados a los libros compartidos.

Excel ofrece una opción para compartir un libro, pero automáticamente pierde un número de importantes características Excel cuando lo hace. Después de compartir un libro, no se puede utilizar subtotales automáticos, tablas dinámicas, agrupaciones, escenarios, protección, autoformato, estilos, imágenes, añadir gráficos o insertar hojas.

Al utilizar la interfaz de Excel VBA y almacenar los datos en una base de datos ACCDB, tiene lo mejor de dos mundos. Tiene la potencia y flexibilidad de Excel y la posibilidad de acceso multiusuario disponible de Access.

ACCDB es el nuevo formato de archivo oficial tanto de Microsoft Access como de Microsoft Visual Basic (en versiones anteriores, el formato era MDB). Esto significa que se puede desarrollar una solución Excel que lea y escriba de un ACCDB para clientes que no tengan Microsoft Access. Por supuesto, ayuda si como desarrollador tiene una copia de Access, porque puede utilizar la interfaz de Access para configurar tablas y consultas.

Caso Práctico

Linda y Virginia son dos compradoras de una cadena minorista de tiendas. Cada mañana importan datos de las cajas registradoras para obtener la información actual de ventas y el inventario para 2000 referencias. Durante el día, cualquier compradora puede incorporar transferencias de inventario de una tienda a otra. Sería ideal si Linda pudiera ver las transferencias pendientes incorporadas por Virginia y viceversa.

Cada compradora tiene una aplicación Excel con VBA ejecutándose en su escritorio. Ambas importan los datos de la caja registradora y tienen rutinas VBA que facilitan la creación de informes de tabla dinámica que les ayudan a tomar decisiones de compra.

Tratar de almacenar los datos de la transferencia en un archivo Excel común genera problemas. Cuando la compradora trata de escribir en el archivo Excel, el archivo se convierte en sólo lectura para la otra compradora. Con un libro compartido, Excel deshabilita la posibilidad de crear tablas dinámicas y esto es necesario en nuestra aplicación.

Ni Linda ni Virginia cuentan con la versión profesional de Office, por lo que no tienen Access ejecutándose en sus PC.

La solución es generar una base de datos Access en un disco de red que puedan ver tanto Linda como Virginia.

La aplicación proporciona acceso multiusuario a ambas compradoras. Tanto Linda como Virginia pueden leer y escribir en la tabla al mismo tiempo. El único momento en el que podría ocurrir un conflicto es si ambas tratan de actualizar el mismo registro al mismo tiempo.