Hace unos días recibí en la caja de comentarios una pregunta de Marisol, la cual apuntaba a encontrar la forma de abrir Excel desde la línea de comandos y además pasarle parámetros o argumentos para las macros.
Bueno, la verdad es que el asunto me pareció interesante. Recuerdo que una vez lo hice, para alguna tarea por ahí que luego terminé reemplazando por los viejos DTS de Microsoft SQL Server, pero eso ya es otra historia.
En esta entrada me permitiré ir directo al grano, porque se trata de algo más avanzado que no le interesará (de momento) a los principiantes en Excel.
Cómo abrir Excel desde la línea de comandos.
Bien, empecemos por el principio. ¿Cómo abrir Excel desde la línea de comandos?
Puede parecer un poco peliaguda la pregunta, pero en realidad es muy sencillo. Incluso, lo vamos a simplificar un poco más.
[pasos paso=”1″]Averiguando dónde se encuentra Excel[/pasos]
Así que antes de aventurarnos en la línea de comandos, vamos a averiguar cuál es la ruta completa a nuestro archivo ejecutable de Excel.
Para esto, ve al menú inicio y haz un clic derecho sobre el icono de Excel.
En el menú que se muestra, elige la opción “Propiedades”.
Una vez hecho esto, se mostrará un cuadro de propiedades, en el cual vas a copiar la ruta completa del archivo ejecutable de Excel, tal y como te muestro en la imagen siguiente:
Terminada esta parte, ya sabemos dónde está nuetro querido Excel. Ahora, vamos con lo que sigue.
[pasos paso=”2″]Crear una función que reciba el argumento pasado por línea de comandos[/pasos]
Esta parte es más peliaguda, porque tienes que utilizar las API de Windows, pero en realidad no vamos a detenernos aquí. Bastará con que copies esta función tal cual está y no tendrás que preocuparte más ya que su uso será transparente para ti.
Primero, crea un módulo nuevo y en él vas a pegar este código que te dejo aquí:
Option Base 0 Option Explicit Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long) Function CmdToSTr(Cmd As Long) As String Dim Buffer() As Byte Dim StrLen As Long If Cmd Then StrLen = lstrlenW(Cmd) * 2 If StrLen Then ReDim Buffer(0 To (StrLen - 1)) As Byte CopyMemory Buffer(0), ByVal Cmd, StrLen CmdToSTr = Buffer End If End If End Function
[pasos paso=”3″]Insertar tu propia función.[/pasos]
Pues empezamos todo esto porque tenías una función a la que le querías pasar un argumento por línea de comandos. ¿No es verdad?
Bien, entonces ahora es el momento de insertar esa función.
En mi caso, para mantener el ejemplo original, voy a utilizar la siguiente:
Private Sub Workbook_Open() Dim ComandoCrudo As Long Dim ComandoTexto As String Dim miArgumento As String ComandoCrudo = GetCommandLine ComandoTexto = CmdToSTr(ComandoCrudo) miArgumento= Right(ComandoTexto, 6) MsgBox miArgumento End Sub
¡Y listo! Nada más que estos tres pasos son suficientes. ¡Ahora a probar tu obra maestra!
Explicando un poco el código.
Lo primero que vemos es que en la variable “ComandoCrudo” estamos recibiendo el comando enviado a través de la consola, gracias a la función GetCommandLine.
Pero pasa y resulta, que esa función te está devolviendo un valor numérico de tipo Long. Así que debemos “transformarlo” a texto normalito para poder utilizar ese parámetro tan escurridizo.
Es así que en la variable “ComandoTexto”, estamos almacenando justamente el comando en formato de texto, gracias a la función CmdToSTr(ComandoCrudo) que tenemos en el módulo que creamos al principio. ¿Recuerdas?
La función CmdToSTr, utiliza como argumento la variable “ComandoCrudo” y la transforma a un texto que podremos manipular de acuerdo a nuestras necesidades.
Finalmente, para demostrar que ya lo podemos manipular, en la variable “miArgumento”, almacenamos los seis últimos caracteres de “ComandoTexto” para luego mostrarlo en un cuadro de mensaje.
Probando el código resultante.
¿Recuerdas que al principio de todo esto, averiguamos la ruta de Excel?
Bien, pues no fue en vano. Ahora lo vamos a necesitar.
Abre tu consola o ventana de línea de comandos y escribe la ruta completa de Excel (entre comillas, tal cual la copiaste) y deja un espacio.
Luego del espacio, escribe también entre comillas el nombre de tu archivo, con la extensión incluída.
Y finalmente, para terminar, la parte que más nos interesaba desde el principio. El argumento.
Solamente debes de dejar un espacio después del nombre del archivo y colocas el texto siguiente:
/e/UsuarioAsiduo
La parte que dice “UsuarioAsiduo”, es el argumento que tú le quieres pasar al archivo. Puede ser una fecha, un número, un nombre de archivo, un código, etc.
Ahora si le das a la tecla Enter, Excel abrirá el archivo y le pasará el argumento “UsuarioAsiduo”.
Pero como nuestra función indicaba que solo mostraría los seis últimos caracteres, entonces:
Solo se muestra la parte que dice “Asiduo”.
¡Sencillo!
No me dirás que te pareció complicado, ¿o sí?
Concluyendo.
Como puedes ver, la función que colocamos en el módulo es la única que hace todo el verdadero trabajo aquí. La función que colocarás dentro de la rutina Workbook_Open(), solamente manipulará el argumento de acuerdo a tu conveniencia para utilizarlo en el resto de operaciones que realice tu código.
De aquí en adelante, solo debes personalizarlo para que se adapte a tus necesidades.
Con esto, ya puedes agregar un archivo .BAT para ejecutarlo con el programador de tareas, pasarle argumentos dinámicos a tu archivo de Excel y varios etc como tu imaginación pueda crear.
Ahora te toca a ti.
Si te ha gustado esta entrada y también quieres implementar un archivo de Excel al que se le pueda pasar argumentos, entonces deja tu comentario, suscríbete a la lista de correos y añádete a mis redes sociales. Si te pasas por mi canal de Youtube, podrás ver los últimos vídeos que voy colgando para engordar el repositorio.
Eso es todo por ahora. Marisol, espero tu comentario. Ojalá te ayude.
¡Nos vemos!
[firma]
Referencias:
- https://social.technet.microsoft.com/Forums/office/en-US/bb9fa94f-a1d4-45cd-9279-b12e7a7e69c0/passing-a-parameter-to-an-excel-file-when-opening-it?forum=excel
10 comentarios en “Cómo abrir Excel desde la línea de comandos y pasarle parámetros (o argumentos)”
Hola Raymundo muchas gracias por tu rapida respuesta aunque lamentablemente no consigo hacer funcionar lo que quiero.
Te paso el codigo que he utilizado :
Option Base 0
Option Explicit
Declare Function GetCommandLine Lib “kernel32” Alias “GetCommandLineW” () As Long
Declare Function lstrlenW Lib “kernel32” (ByVal lpString As Long) As Long
Declare Sub CopyMemory Lib “kernel32” Alias “RtlMoveMemory” (MyDest As Any, MySource As Any, ByVal MySize As Long)
Sub Auto_Open()
Dim ComandoCrudo As Long
Dim ComandoTexto As String
Dim miArgumento As String
ComandoCrudo = GetCommandLine
ComandoTexto = CmdToSTr(ComandoCrudo)
miArgumento = Right(ComandoTexto, 6)
MsgBox miArgumento
MsgBox ComandoTexto
Workbooks.OpenText Filename:=ComandoTexto, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False _
, Space:=False, Other:=True, OtherChar:=”|”, FieldInfo:=Array(Array(1, 2 _
), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2), Array(6, 2))
Cells.Select
Selection.ColumnWidth = 8.14
Cells.EntireColumn.AutoFit
Range(“A1”).Select
Columns(“A:A”).ColumnWidth = 12.14
Rows(“2:2”).Select
With Selection.Font
.Name = “Arial”
.Size = 16
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Selection.Font.Bold = True
Selection.Font.Italic = True
Selection.Font.Underline = xlUnderlineStyleSingle
Range(“A1”).Select
ChDir “C:TMP”
End Sub
Function CmdToSTr(Cmd As Long) As String
Dim Buffer() As Byte
Dim StrLen As Long
If Cmd Then
StrLen = lstrlenW(Cmd) * 2
If StrLen Then
ReDim Buffer(0 To (StrLen – 1)) As Byte
CopyMemory Buffer(0), ByVal Cmd, StrLen
CmdToSTr = Buffer
End If
End If
End Function
Hola de nuevo perdón pero no he lanzado el comentario sin terminarlo.
Verás que en el comentario anterior te he puesto el código que he utilizado.
El problema es que MsgBox no me devuelve el parámetro que le paso.
Si indico :
c:excel.xls /e/c:tmpfichero.txt
el mensaje que me sale en pantalla es :
c:program files(x86)Microsoft OficceOficceexcel.exe” /e
Me puedes ayudar ?
Muchísimas gracias de antemano
Hola, Marisol. ¿Dónde estás colocando todo elcódigo? ¿Lo estás colocando en un solo lugar?
Si , tengo una macro y todo el código lo he puesto junto (tal como me contaron ya que no tengo muchos conocimientos de excel).
El problema que tengo es que la instrucción Right(ComandoTexto, 6) puedo recoger el nombre del fichero si siempre tiene la misma longitud.
En mi caso los nombres de ficheros varían en longitud y no sé como capturar el nombre con el path.
No existe una instrucción que me devuelva directamente todo el parámetro ?
Muchísimas gracias.
Hola, Marisol. Tienes que seguir el paso a paso.
En el paso 2, indico que tienes que crear un módulo para insertar la función que recibe el parámetro. De otro modo, tendrás un resultado inesperado.
Solo son dos pasos:
1.- Crear el módulo con su código.
2.- Tomar el parámetro e invocar a tu función, desde el evento Workbook_Open
Saludos
Y en cuanto al path completo, solamente debes tomar el ComandoTexto, sin ninguna función. Yo utilicé la función “Right”, solamente para poner un ejemplo de aplicación.
Saludos
Hola y muchas gracias, yo también estaba buscando ejecutar una macro pasando un fichero y me ha funcionado bien.
El problema es que esto lo ejecutan varias personas en un mismo Pc (Terminal server).
Al ejecutar todos la macro mimacro.xls cada uno abriendo un fichero distinto (usu1.txt, usu2.txt…) a partir del primero que lo usa sale el siguiente mensaje :
“mimacro.xls esta bloqueado por usuario1 para modificarlo” y ya no se puede cargar los datos.
Es posible ejecutar una misma macro varias veces ?
Hola, Susana. Haz la prueba poniéndolo como libro compartido. Ve a la ficha “Revisar” y haz clic en “Compartir libro”.
En el cuadro que aparece, marca la opción “permitir la modificación por varios usuarios a la vez”.
Muchas gracias Raymundo, espero que sigas con esto mucho tiempo.
Gracias, Susana. Esperemos que sí.
Saludos