Abrir Excel desde la línea de comandos

Cómo abrir Excel desde la línea de comandos y pasarle parámetros (o argumentos)

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.

  • 1

    Averiguando dónde se encuentra Excel

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”.

Abrir Excel desde la línea de comandos

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:

Abrir Excel desde la línea de comandos

Terminada esta parte, ya sabemos dónde está nuetro querido Excel. Ahora, vamos con lo que sigue.

  • 2

    Crear una función que reciba el argumento pasado por línea de comandos

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
  • 3

    Insertar tu propia función.

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.

Abrir Excel desde la línea de comandos

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:

Abrir Excel desde la línea de comandos

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!

Raymundo

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

 

 

11 thoughts on “Cómo abrir Excel desde la línea de comandos y pasarle parámetros (o argumentos)”

  1. 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

  2. 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

      1. 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.

        1. 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

        2. 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

  3. 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 ?

    1. 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”.

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *