Páginas

viernes, 31 de julio de 2015

VBA Outlook: Como extraer una tabla de un email y guardarla en un libro nuevo de Excel

Para utilizar esta macro se necesita abrir el correo que contiene la tabla y especificar la direccion donde se guardará el archivo de excel.

Las claves son:
-La ventana abierta de outlook (el email) es in objeto "Inspector"
-El objeto inspector tiene un metodo "WordEditor" que convierte al mail en un objeto de Word
-El objeto de Word tiene la propiedad "Tables"


Sub guardarTabla()

'El correo abierto lo convierte a un objeto de word
Set correo = ActiveInspector.WordEditor

'Creo un objeto de excel y creo un libro nuevo
Set xl = CreateObject("Excel.Application")
Set reporte = xl.Workbooks.Add()

'Extrae la primera tabla del conjunto de tablas en el documento
'Si hubere mas tablas se especifica el numero
Set tabla = correo.Tables(1)

'Encuentra el numero de filas
numeroFilas = tabla.Rows.Count

'Encuentra el numero de columnas
numeroColumnas = tabla.Columns.Count

'Comienza a navegar por cada celda de la tabla
'Primero toma cada fila
For r = 1 To numeroFilas
    'Luego va por cada columna
    For c = 1 To numeroColumnas
        celda = tabla.Rows(r).Cells(c)
        celda = Left(celda, Len(celda) - 1) 'borra el ultimo caracter del texto
        'pega el valor en la celda del archivo de excel.
        reporte.Sheets(1).Cells(r, c) = celda
    Next c
    
Next r

'ahora creo un numero secuencial para agregar al nombre de archivo
'basado en la fecha y tiempo actual
numeroSecuencial = Format(Now(), "YYMMDDhhss")

'finalmente guardo el archivo.
reporte.SaveAs ("D:\OutlookGeneratedFile" & numeroSecuencial & ".xlsx")

End Sub

jueves, 23 de julio de 2015

Fundamentos de VBA Excel: Donde escribir el código?

Antes vimos que el primer paso para trabajar con VBA era habilitar las macros en Excel. Ahora para poder comenzar a escribir codigo hay que ingresar al Editor de Visual Basic:

El Editor es el lugar donde escribimos todos los comandos o instrucciones que componen la macro. Para poder acceder al Editor basta con teclear Alt+F11 o ir al menú Tools/Macro/Visual Basic Editor

En la parte superior izquierda de la pantalla aparecerá el siguiente recuadro:



Hacemos click derecho sobre VBAProject("Nombre de Archivo") e insertamos un nuevo Modulo.




Vemos que en la carpeta de "Modules" se ha creado un "Module1", hacemos click sobre este, y ya estamos listos para escribir código.




martes, 21 de julio de 2015

Python: Como convertir imagenes .tiff a texto


Excelente material en este link.

3 Razones para aprender a crear Macros con VBA

En resumen, porque tu trabajo se vuelve más rápido, más preciso y mucho menos tedioso.

Si tu trabajo es de escritorio, es casi seguro que implica alguna forma de manipulación de datos con Excel, Word y Outlook. VBA es un lenguaje de programación que permite crear Macros para manipular todos esos datos velozmente. En muchos casos algunas tareas que normalmente toman horas, al realizarlas con una Macro se reducen a segundos.

La rapidez no lo es todo, también es súper importante la precisión. Con un par de líneas de código, puedes realizar miles de operaciones matemáticas, copiado e ingreso de datos, búsquedas, ediciones y más sin preocuparte de errores de escritura, borrado accidental o errores de cálculo.

Y que satisfacción es ver que el trabajo aburrido se hace prácticamente solo! De un momento a otro te encuentras con una gran cantidad de tiempo libre, el cual puedes entonces dedicarlo a tareas mucho más importantes.

Si tienes una tarea que involucra una hoja de cálculo, parámetros de búsqueda o evaluación y que se repite constantemente, es una candidata perfecta a ser automatizada. Para comenzar a usar macros, en este post está el primer paso a seguir.

Fundamentos de VBA Excel: Habilitar el uso de Macros

Primer paso para programar en VBA

No se neceista instalar ningún software adicional para programar en VBA, todo viene ya incorporado en Excel. Solo debemos poner atención a las configuraciones siguientes:

La viñeta de Developer

Lo primero que debemos revisar es si se encuentra activada la viñeta de "Developer/Desarrollador":

Si no se encuentra activada, debemos ir a File/Options/Customize Ribbon y seleccionar la opcion "Developer":

Las opciones de seguridad de Excel

Para poder ejecutar las Macros sin que Excel nos haga una advertencia de seguridad a cada instante, es necesario ir a las opciones de seguridad, y seleccionar la opción para habilitar Macros:

Guardar el archivo con la extensión correcta

Normalmente, los archivos de Excel tienen la extensión .xlsx la cual no permite que se guarde ninguna macro el archivo. Por lo que nuestros archivos que contengan código VBA deben guardarse con la extensión .xlsm que significa "Macro Enabled":

Una cuestión muy importe: Si envías tu archivo con macros a otro usuario, el destinatario deberá permitir la ejecución al momento de abrir el documento, de lo contrario las macros no se ejecutarán.

lunes, 20 de julio de 2015

Python para Excel: Como insertar hipervinculos

El objeto "Sheet" del modelo de objetos de Excel, tiene una propiedad Hyperlinks. Hyperlinks tiene un metodo llamado Add, que acepta 5 parametros, de los cuales solo uso 3, los que no utilizo los dejo en blanco con comillas.

En este ejemplo, en mi hoja de calculo tengo una columna donde quiero insertar hipervinculos y poner como referencia la palabra "documents"

import os, re, traceback
from win32com import client
try:
    #Rutas de archivos y posiciones de referencia
    pathServidor = '//servidor/'
    pathReporte= 'C:/reporte.xls'
    columaPedidos = "C" #en que columna se encuentran los numeros de pedido
    primeraFilaPedidos = "8" #la primera fila de los pedidos

    #crear listado con los numeros de pedido (solo el primer PL en caso de haber multiples)
    pedidos = []
    xl = client.Dispatch("Excel.Application")
    #itera por cada hoja del reporte
    for sheetNumber in range(1,5):
        reporte = xl.workbooks.open(pathReporte)
        lastRow = reporte.Sheets(sheetNumber).usedrange.rows.count #ultima fila del reporte
        for c in reporte.Sheets(sheetNumber).Range(columaPedidos+primeraFilaPedidos, columaPedidos+str(lastRow)): #itera por cada celda de pedidos
            pedido = unicode(c.value)
            #elimina los dahses del pedido y agrega solo el primer pl al listado
            if "/" in pedido:
                pedidos.append(pedido.split("/")[0])
            else:
                pedidos.append(pedido.split()[0])

    #itera por cada numero de pedido en el listado
    #tomar el path al servidor y combinarlos con cada numero de pedido
    #ver si el path que resulta existe en el servidor
    #si el path existe busca el numero de pedido en el reporte
    #ubicado el pedido, inserta hipervinculo en la columna N
            
    n= len(pedidos)
    for pedido in pedidos:
        if os.path.exists(pathServidor+pedido): #si existe el file path
            for sheetNumber in range(1,5): #itera por cada hoja
                if reporte.Sheets(sheetNumber).usedrange.find(pedido): #busca el pedido en cada hoja
                    print "\rArchivando %s en %s, %i files remaining." %(pedido, reporte.Sheets(sheetNumber).Name,(n-1)),
                    print " ",
                    #sys.stdout.flush()
                    documentsColumn = reporte.Sheets(sheetNumber).usedrange.find("Documents").Column #ubica la columna de documentos
                    pedidoRow = reporte.Sheets(sheetNumber).usedrange.find(pedido).Row
                    hyperlinkCell = reporte.Sheets(sheetNumber).Cells(pedidoRow,documentsColumn)#encuentra la celda donde insertar el hipervinculo
                    hyperlinkPath = pathServidor+pedido #crea el path del hipervinculo
                    reporte.Sheets(sheetNumber).Hyperlinks.Add(hyperlinkCell, hyperlinkPath,"","","documents")
                    #print "Archivado."
                    break
        #print "\rFiles Remaining... %i" %(n-1),
        #sys.stdout.flush()
        n-=1
    reporte.Save
    reporte.Close
except:
    traceback.print_exc()
print "Terminado."
raw_input()

martes, 14 de julio de 2015

Python para Excel: Como explorar los objetos de la libreria win32com

Lo correcto es buscar en la referencia de desarrolladores de Microsoft, pero si se quiere ojear en python se debe hacer click en este archivo:

C:\Python27\pywin32-219\com\win32com\client\combrowse.py

Vamos a 'Registered Typre Libraries' y buscamos 'Microsoft Excel 15.0 Object Library':

Los objetos que buscamos aparecen con una 'I' adelante mas la palabra 'Interfase', por ejemplo 'IRange - Interfase':


sábado, 11 de julio de 2015

Python: Como obtener la fecha de hoy (Y cambiar el formato de fecha)

 
Con el modulo datetime ha sido super sencillo! incluso se puede especificar la forma en que  queremos que se presente la fecha, mes dia año o viceversa.
Aqui un ejemplo:  

 
>>> import datetime
>>> fecha = datetime.date.today()
>>> fecha
datetime.date(2015, 7, 11)
>>> fecha.day
11
>>> fecha.month
7
>>> fecha.year
2015
>>> fecha.strftime('%d-%m-%y')
'11-07-15'
>>> fecha.strftime('%Y/%m/%d')
'2015/07/11'
>>> 

miércoles, 8 de julio de 2015

Python para Excel: Script para registrar actividades

Este script escanea varias hojas de mi reporte contando cuantas veces aparece la palabra "documents" en una columna. Cada vez que se ejecuta el programa, registra los resultados en un archivo de texto:


import time, re
from  win32com import client

#the log file
f = open('C:/Users/Ruben Torres/Desktop/Scripts/KPIs/filinglog.txt', 'a')

#open report
xl = client.Dispatch("Excel.Application")
report = xl.workbooks.open('D:/RubenBK/REPORTS/cctableruben.xlsm')

#file records counters
guayaquilCount = 0
quitoCount = 0
expressCount = 0
sparesCount = 0

lastrow = report.sheets("Guayaquil").usedrange.Rows.Count
for cel in report.sheets("Guayaquil").Range("N8", "N" + str(lastrow)):
    if re.search(r'^[dD]\w+[sS]', str(cel.value)):
        guayaquilCount += 1

lastrow = report.sheets("Quito").usedrange.Rows.Count
for cel in report.sheets("Quito").Range("N8", "N" + str(lastrow)):
    if re.search(r'^[dD]\w+[sS]', str(cel.value)):
        quitoCount += 1

lastrow = report.sheets("Express").usedrange.Rows.Count
for cel in report.sheets("Express").Range("K8", "K" + str(lastrow)):
    if re.search(r'^[dD]\w+[sS]', str(cel.value)):
        expressCount += 1

lastrow = report.sheets("Spare Parts").usedrange.Rows.Count
for cel in report.sheets("Spare Parts").Range("N8", "N" + str(lastrow)):
    if re.search(r'^[dD]\w+[sS]', str(cel.value)):
        sparesCount += 1

t = time.localtime()        
f.write("\nFecha: %s-%s-%s" %(t.tm_year, t.tm_mon, t.tm_mday) +  " Archivado en Guayaquil: %i; Quito: %i; Express: %i; Spares: %i " %(guayaquilCount, quitoCount, expressCount, sparesCount))

f.close
f = open('C:/Users/Ruben Torres/Desktop/Scripts/KPIs/filinglog.txt')

for l in f.readlines():
    print l

f.close
raw_input()

viernes, 3 de julio de 2015

Python para Excel: Como encontrar la ultima fila utilizada en una columna (Con Openpyxl)

Con get_highest_row() se puede encontrar la ultima fila de toda la hoja de calculo, pero y si quiero la ultima fila de una columa especifica?

Hago un for loop por la columna deseada, y cuando encuentre una celda vacia (None) guarda el numero e interrumpe el loop.



import openpyxl

reporte = openpyxl.load_workbook('d:/test.xlsx')
hoja = reporte.get_sheet_by_name('Sheet1')
ultimafilahoja = hoja.get_highest_row()
ultimafila = 1
for r in range (1, ultimafilahoja):
    if not hoja.cell(row = r, column= 3).value is None:
        ultimafila = r + 1
    else: break

print ultimafila
 
El resultado es 12.

Python para Excel: Buscar un patron de texto en un rango de celdas

 
import re
from win32com import client

xl = client.Dispatch("Excel.Application")

reporte = xl.workbooks.open("C:/miReporte.xls")
for c in reporte.sheets(1).Range("G4:G117"):
    if re.search(r'HTM\d{13}', str(c.value)):
        c.offset(1,4).value = re.search(r'HTM\d{13}', str(c.value)).group()
        print re.search(r'HTM\d{13}', str(c.value)).group()
 
 
Que significa cada cosa: 
import re = Importo la libreria de expresiones regulares from win32com import client = de la libreria win32com =  importo el modulo client
xl = representa a la aplicacion de excel
reporte = es el reporte que vamos a abrir
re.search(r'HTM\d{13}', str(c.value)) = busca un patron de texto que comience con "HTM" seguido de 13 digitos