Páginas

miércoles, 30 de noviembre de 2016

Como copiar una carpeta (y subcarpetas) usando la linea de comandos (Windows)


C:\robocopy carpetaOrigen CarpetaDestino /e /mir

El switch "/e" crea los subdirectorios que estan dentro de la carpeta de origen
El switch "/mir" sirve para crear un "espejo" de la carpeta de origen, ideal para un backup. Si lo elimino un archivo en la carpeta de origen, al copiar se eliminara tambien de la carpeta de destino.

martes, 15 de noviembre de 2016

Como agregar tus programas al boton derecho del mouse

Hace unos dias cree un programa en python que tomaba el path a un archivo de
excel, lo leia, extraia algunos datos y creaba un archivo csv con la
informacion.

Para pasar el path al script, tenia que escribir la ruta en la linea de
comandos, lo cual estaba bien para mi, pero si deseaba compartir mi programa
con algun companero tendria que encontrar una forma mas sencilla de utilizarlo.

Y nada mas facil que hacer click con el boton derecho del mouse sobre el archivo que
deseaba procesar. Asi que buscando un poco en internet encontre dos maneras de
agregar mi script al boton derecho:

La forma larga.
Utilizando el programa regedit.exe se puede crear un path hacia la aplicacion
el el registro de Windows.
1. En la linea de comandos buscamos el programa regedit.exe


2. Seleccionamos la carpeta HKEY_CLASSES_ROOT/*/shell
3. En 'shell' con boton derecho agregamos un 'KEY' con New->Key y le ponemos
el nombre con el que queremos que salga en el menu derecho del mouse. En mi
caso la aplicacion se llama "Make CSV"



4. Agregamos otro key dentro de la carpeta recien creada, esta vez con el
nombre de 'command'
5. Hacemos doble click sobre '(Default)' y emerge una ventana dentro de la
cual ingresamos el path hacia el interprete de python y el path hacia el
programa.
En mi caso el valor a ingresar fue: "C:\Python27\python.exe"
"D:\myScripts\csvmaker\main.py" "%1"
El '%1' se utiliza para pasar a python el path del archivo sobre el cual se
hace click derecho.


Y eso es todo, el script esta ahora accesible desde el menu derecho del mouse.


La forma corta. 
Se crea un archivo '.reg' que contenga la siguiente informacion:

Windows Registry Editor Version 5.00
 [HKEY_CLASSES_ROOT\*\Shell\Make CSV\command]
@="\"C:\\Python27\\python.exe\" \"D:\\myScripts\\csvmaker\\main.py\" \"%1\""

Entro los brackets [] va la ruta donde se alojara la aplicacion
Luego de '@=' va la ruta hacia el interprete de Python y el Script, tal como
especificamos arriba, aunque con muchos 'scape characters'

En mi caso guarde el archivo como csvmaker.reg. Al ejecutar este archivo, el
script se agrega automaticamente al menu. Este metodo tiene la gran ventaja de
que hace mas sencillo aun compartir tus aplicaciones con otros usuarios. Basta
con enviarles el archivo '.reg' y sus maquinas quedaran configuradas para
utilizar tus aplicaciones sin
ningun esfuerzo.

martes, 19 de enero de 2016

VBA OUTLOOK: Como guardar los adjuntos en una seleccion de correos

La clave es utilizar la propiedad "Selection" del Objeto explorer:


Sub guardarAdjuntos()

Dim mensaje As MailItem
Dim mensajes As Variant
Dim adjunto As Attachment
Dim carpeta As String

'escribo el nombre de la carpeta
carpeta = "D:\miCarpeta\"

'Va por cada elemento seleccionado
For Each element In Application.ActiveExplorer.Selection
   'verifica que el elemento sea un mensaje de correo
   If TypeName(element) = "MailItem" Then
        Set mensaje = element
        If mensaje.Attachments.Count > 0 Then 'si hay algun adjunto
            For Each adjunto In mensaje.Attachments 'explora cada adjunto en el mensaje
                adjunto.SaveAsFile (carpeta & adjunto.FileName)
            Next
        MsgBox "Adjuntos guardados: " + mensaje.Subject
        End If
   End If
Next
End Sub

viernes, 20 de noviembre de 2015

Python: Funcion para crear un numero de identidad basado en la fecha

 
from datetime import datetime

def create_id(prefix = "test"):
    '''creates id with a prefix chosen by user'''
    thisday = datetime.now()
    return prefix+str(thisday.year)+str(thisday.month)+str(thisday.year)+ str(thisday.hour)+str(thisday.minute)+str(thisday.second)
    
if __name__ == "__main__":
    new_id = create_id("RUBEN")
    print new_id

viernes, 23 de octubre de 2015

Test sobre Valoracion Aduanera en los Estados Unidos

Para mis amigos profesionales del comercio exterior, una vez mas pónganse a prueba!

Cuales de los siguientes Incotermos son utilizados por la aduana de los Estados Unidos como base imponible para el cálculo de los impuestos a la importación?
  • FAS
  • FOB
  • CIP
  • CIF
  • CPT
  • FCA
  • CFR

jueves, 22 de octubre de 2015

VBA Excel: Como abrir, pasar y extraer datos de una pagina web usando Macros.

Hace poco mas de un año escribí un post sobre como abrir una pagina web desde excel, pero viéndolo bien, estába un poco complicado. Así que decidí hacer una nueva publicación un poco mas didáctica y fácil de reproducir por cualquiera que desee intentarlo.

Esta macro entra al sitio web de Airbnb y extrae los precios que se despliegan en la primera página de resultados. Las técnicas que se utilizan en este ejemplo pueden servir para que cada uno las aplique a algun otro tipo de investigación para su trabajo o estudio.

Comenzamos con un archivo en el cual ingreso una ciudad, fecha de check in, fecha de salida y número de huéspedes. Las celdas de fecha tienen formato de texto para que coincida con el formato que exige la página.


 Antes de escribir el código, debemos incluir las librerías que nos permiten acceder a los controles de internet que vamos a utilizar, eso lo hacemos en el editor de visual basic, en tools/references. Allí seleccionamos las opciones que vemos a continuación (Microsoft Internet Controls y Microsoft HTML Object Library):



Ahora sí comenzamos a escribir la macro:


Sub navegar()

'las declaraciones son opcionales, pero ayudan a visualizar las opciones mientras se digita
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim buscar As HTMLButtonElement
Dim precios As Object
Dim precio As Object

'crea el explorador de internet
Set ie = New InternetExplorer

'hacemos visible el explorador
ie.Visible = True

'navega a la página de aribnb
ie.navigate "https://www.airbnb.com/"

'espera a que la página cargue
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE

'la página cargada la asignamos a la variable "pagina"
Set pagina = ie.document

Interrumpo el código para explicar algo: Para ir llenando los campos que pide la página, con hacer click en el boton derecho e "inspeccionar elemento" podemos identificar los nombres de cada campo:



El campo de la ciudad, que se llama "location":

El campo para la fecha de check in, se llama "checkin":

El campo de check out es "checkout":

La lista de huéspedes, tiene un id ("guests") y a su vez varias opciones dentro de si:

Y el botón de enviar, que tiene el id "submit_location":

Ahora que ya sabemos como ubicarlos, procedemos a pasarles valores los cuales tomamos del libro de excel:


'asignamos el valor de una ciudad
pagina.getElementById("location").Value = Range("B1").Value

'esperamos un segundo para que puedas visualizar los cambios que estas realizando
Application.Wait (Now + TimeValue("0:00:02"))

'pasamos a "checkin" la fecha de ingreso
pagina.getElementById("checkin").Value = Range("B2").Value

Application.Wait (Now + TimeValue("0:00:02"))

'pasamos la fecha de check out
pagina.getElementById("checkout").Value = Range("B3").Value

Application.Wait (Now + TimeValue("0:00:02"))

'pasamos el "value" que nos interesa a la lista "guests"
pagina.getElementById("guests").Value = Range("B4").Value

Application.Wait (Now + TimeValue("0:00:02"))

'seleccionamos el botón de buscar y hacemos click
pagina.getElementById("submit_location").Click

'asignamos a una variable el estado de la página
stat = pagina.readyState

'Espera a que la página cargue
Do While stat = "loading"
    Application.Wait (Now + TimeValue("0:00:01"))
    stat = pagina.readyState
Loop


En la página siguiente vemos los precios de todas las habitaciones, lo que nos interesa es el valor del elemento que contiene la suma en dólares.

Como queremos todos los precios, hay que buscar la manera de recogerlos todos. Vemos que el elemento no tiene un "id",  pero todos tienen en común un nombre de "class". Con el método getElementsByClassName, buscamos ese nombre de clase y así obtendremos una colección de todos los campos:



'creamos la lista de precios

Set precios = pagina.getElementsByClassName("h3 text-contrast price-amount")

'comenzaremos a llenar el excel en la fila 7
fila = 7

'hacemos un loop por cada elemento de la lista de precios y lo agregamos al excel:
For Each precio In precios
    Range("A" & fila).Value = precio.innerText
    fila = fila + 1
Next


End Sub

Y listo, este es el resultado final:

Cada pagina web es diferente, si la macro no funciona como esperabas, enviame un mail y si no es muy complicado el asunto quizás pueda darte una ayuda extra.

lunes, 5 de octubre de 2015

Test super sencillo sobre el uso de los INCOTERMS



Los que estudiaron Comercio Exterior, o los que trabajamos en ello, llevamos tanto tiempo tratando con los Incoterms, que ya ni les hacemos mucho caso... Tendemos a asumir muchas cosas sobre ellos y damos respuestas casi automáticas y condescendientes cuando alguien de otra área nos molesta con preguntas 'tan básicas'.

El único problema que le veo a esta actitud es que ya ni pensamos realmente en lo que cada uno significa. Para nostros está TAN sobreentendido que 'FOB es sobre la borda del buque' y que 'CIF incluye flete y seguro' que pensamos que ya sabemos todo sobre los Incoterms (o al menos lo mas importante) pero lo mas probable es que NO sea así...

Las 5 preguntas que vienen a continuación se las hice a algunos amigos que trabajan en Comercio Exterior y la mayoria no pudo responderlas correctamente. Si las contestas todas sin mucho inconveniente, pues te felicito por ser parte de una minoría con buen entendimiento del correcto manejo de los Incoterms:

1. Describe dos Incoterms de tu preferencia.
2. ¿Cual es el Incoterm mas fácil para el importador y cual es el más difícil para el importador?
3. Los incoterms DAP, DAT y DDP no incluyen seguro, ¿por que?
4. ¿Por qué un país en desarrollo preferiría que sus importaciones sean CFR o CPT y no CIF o CIP?
5. Una empresa de comercio internacional exige siempre que el exportador le entregue la carga en terminos FCA fabrica del exportador. ¿Cual sería el principal motivo?

miércoles, 30 de septiembre de 2015

Cursos para mejorar tu hoja de vida.

Muchas veces he escuchado de conocidos que hacen cursos, diplomados, maestrías para 'mejorar su currículum', casi nadie me ha dicho "porque quiero aprender X, Y...". Siempre me ha parecido que ir por el título es una motivación incorrecta y hoy leí algo que de cierta forma suma a mi punto. Dice así:

"Esto va a sonar controversial pero ahí va: si eres sobresaliente, sorprendente o simplemente espectacular en tu trabajo probablemente ni siquiera deberías tener un curriculum. Si tienes experiencia haciendo las cosas que te vuelven indispensable pues bien un curriculum esconde ese hecho. Un curriculum da al empleador todo lo que necesita saber para descartarte. Si no tienes un curriculum, ¿que tienes?. ¿Que tal tres extraordinaras cartas de recomendación de gente que el empleador conozca o respete?, O ¿un proyecto muy sofisticado que El empleador pueda ver o incluso tocar?, o ¿una reputación que te preceda? Algunos dirán 'eso suena bien, pero no tengo ninguna de ellas'. Sí, ese es mi punto. Si no tienes estas cosas que nos llevan a creer que eres una persona sobresaliente suena para mí que lo único que tienes es un curriculum. Busca una empresa que no utilice una computadora para escanear currículums, una empresa que contrate gente no papel." -Seth Godin. 

Suena bien eso de "soy tan bueno que no necesito una hoja de vida", pero en la realidad de nuestro mercado laboral eso está muy lejos de ser aceptado. 

Y si lo piensas bien, ser todo lo que Godin propone no es nada fácil, de hecho es más fácil obtener un título. ¿Dónde me inscribo?

miércoles, 23 de septiembre de 2015

VBA Excel: Como eliminar las celdas vacias en un rango.

Fue mucho mas facil de lo que imaginaba, la clave fue el metodo SpecialCells del objeto Range:

'Defino el rango que contiene las celdas en blanco
set rango = Thisworkbook.Sheets("Sheet1").Range("A1", "A500")

'Con el metodo SpecialCells genero un rango que agrupa las celdas vacias
Set celdasVacias = rango.SpecialCells(xlCellTypeBlanks)

'Elimino las filas
celdasVacias .EntireRow.Delete

miércoles, 2 de septiembre de 2015

VBScript: Como enviar un reporte por correo automáticamente

"Por favor envíame tu reporte..." Si no es la frase más detestada para cualquiera que trabaje en un área administrativa, de seguro debe estar en el top 5 fijo...

Aunque bueno, no debería molestarnos porque se supone que es nuestra responsabilidad que la información sea oportunamente distribuida al equipo de trabajo, por lo que este tipo de solicitudes nunca deberían presentarse. 

La persona organizada y disciplinada establecería uno o dos momentos en el día para realizar esta tarea. El vago hace un script que se encargue de eso. 

Pequemos de vagos entonces:

Crea un archivo de texto con el block de notas, por ejemplo enviarReporte.txt

Dentro del archivo escribe el siguiente texto, en el cual vas a modificar el texto en azul según tus necesidades:

para = "mail1@empresa.com; mail2@empresa.com; mail3@empresa.com"
asunto = "Reporte"
mensaje = "Estimados, adjunto reporte."
adjunto = "C:\reportes\reporte.xlsx"
Set outlook = CreateObject("Outlook.Application")
Set correo = outlook.CreateItem(olMailItem)
correo.To = para 
correo.Subject = asunto
correo.Body = mensaje
correo.Attachments.Add(adjunto)
correo.Send 

Ahora cambia la extensión del archivo de ".txt" a ".vbs".

Qué cosa? No sabes? Mr MBA?! Bueno ya aquí te explico cómo hacerlo

Ya tienes un script de Visual Basic, basta con hacer doble click sobre este para enviar un correo a los destinatarios que especificaste con tu reporte como adjunto.

Pero yo no quiero tener que hacer click, nadie quiere. La idea es que todo esto se haga automáticamente. 

En esta parte nos ayuda el programador de tareasAllí vas a indicar la hora y los días de la semana en que quieres que se ejecute el script, y listo nunca más tendrás que escuchar la espantosa frase con la que comenzamos el post.


Fundamentos: Usar el programador de tareas

Para ejecutar un script automáticamente a una determinada hora, se utiliza el programador de tareas:

  • Inicio
  • Control Panel
  • System and Security
  • Administrative Tools >>> Schedule Tasks

Se abre el Task Scheduler, entonces:

  • Action >>> Create Basic Task
  • Se pone un nombre de la tarea y una descripcion para saber que es lo que hará
  • Click en siguiente.
  • Luego se especifica si se quiere que la tarea se ejecute diario, semanal, mensual etc...
  • Click en siguiente.
  • Se especifica la fecha y la hora en la que comenzará la tarea. 
  • Click en siguiente.
  • En la accion seleccionamos "Start a Program"
  • Click en siguiente.
  • Buscamos con browse la direccion del script y lo seleccionamos. 
  • Click en siguiente y luego en Finish.

Fundamentos: Como cambiar la extension de un archivo


  • Entrar a la carpeta que contiene el archivo.
  • Ir a tools > folder options
  • Ir a View
  • En la seccion de Advanced Settings, buscarla opcion 'Hide extensions for known file types' y deseleccionarla.
  • Hit Ok.

Ahora si, ir al archivo, click derecho y cambiar la extension.