Ejecutar comando CMD desde Excel y mostrarlo en formulario

La gran ventana que tenemos con el lenguaje vba es que casi cualquier código que antes usábamos en Visual Basic 6.0 se puede reciclar, por decirlo de alguna manera.

Y por supuesto, el código usado en este artículo no es la excepción.

Comandos MS-DOS

Las instrucciones Batch de MS-DOS o CMD vienen desde las primeras versiones de Windows y aunque antes eran más populares, su uso es aún vigente, sobretodo con los archivos por lotes .BAT.

Ventana de comandos CMD

Figura 1. Ventana de comandos CMD.

Por qué usar comandos CMD en Excel

Entre los usos que les podemos dar a una instrucción CMD desde Excel podemos enlistar los siguientes:

  1. Hacer un respaldo del archivo activo con el comando COPY.
  2. Buscar un archivo con el comando DIR.
  3. Hacer un PING a un servidor en caso de que nos genere error al guardar archivos en red.
  4. Entre otros.

Cómo funciona

Tenemos un formulario en Excel vba donde tendremos un cuadro de texto donde ingresaremos el comando a ejecutar y otro cuadro de texto que nos devolverá el resultado en caso de que la instrucción lo amerite.

Ejecutar comandos CMD desde Excel vba

Figura 2. En un formulario de Excel vba podemos visualizar el resultado el comando CMD.

Código vba

Para los elementos del formulario usamos el código.

'Ejecutar el comando CMD
'
Private Sub CommandButton2_Click()
Me.txtResultado = EjecutarCMD(Me.txtComando)
End Sub
'
'Cerrar el formulario
'
Private Sub CommandButton3_Click()
Unload Me
End Sub
'
'Al iniciar el formulario
'
Private Sub UserForm_Initialize()
With Me
    .txtResultado.MultiLine = True
    .txtResultado.ScrollBars = fmScrollBarsBoth
    .txtResultado.Font = "Terminal"
    .txtComando.Font = "Terminal"
End With
End Sub

Para la función que ejecutará el comando CMD usamos el siguiente código en un módulo normal.

Option Explicit
'
'Función para ejecutar el comando CMD
'
Function EjecutarCMD(Comando As String) As String
Dim FSObj As Object
Dim shellObj As Object
Dim tmpFileObj As Object
Dim sLine As String
Dim sFilename As String
'
On Error GoTo Errores
Set FSObj = CreateObject("Scripting.FileSystemObject")
Set shellObj = CreateObject("Wscript.Shell")
sFilename = FSObj.GetTempName
shellObj.Run "cmd /c " & Comando & " >" & sFilename, 0, True
Set tmpFileObj = FSObj.OpenTextFile(sFilename, 1)
Do While tmpFileObj.AtEndOfStream <> True
    sLine = tmpFileObj.Readline
    EjecutarCMD = EjecutarCMD & Trim(sLine) & vbNewLine
Loop
tmpFileObj.Close
FSObj.DeleteFile (sFilename)
Exit Function
Errores:
MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, "EXCELeINFO"
End Function
'
'Otra manera de ejecutar CMD
Private Sub CommandButton1_Click()
Shell "cmd.exe /c " & "dir *.* /s"
End Sub

Anexos

:: Descargar el ejemplo Ejecutar CMD desde Excel.zip

You may also like...

7 Responses

  1. er says:

    Buen aporte y si le pones el fondo negro y la fuente de color gris se ve mucho mas natural, alguna buena utilidad le encontrare. Muchas Gracias por el aporte

  2. Julian Biggio says:

    Hola, habrá alguna manera de hacer un “do events” para el shellObj.Run, ya que me gustaría poder “matar” el proceso despues de cierto tiempo de ejecución.

    • sergioacamposh says:

      Podrías usarlo desdepués de la línea que lo ejecuta:

      Set tmpFileObj = FSObj.OpenTextFile(sFilename, 1)
      DoEvents

      Aunque si haces una consulta recursiva, por ejemplo un PING -t, de todos modos sí puedes matar el proceso en el administrador de tareas.

  3. Andre says:

    Buenas Tardes:

    Deseo hacer una macro, la cual ejecute en modo administrador el cmd y a partir de allí poder abrir un programa, en dicho programa deseo ejecutar sentencias para sacar información, todo esto se podrá desde una macro???

    Necesito ayuda urgente por favor

  1. September 27, 2013

    […] Ejecutar comando CMD desde Excel y mostrarlo en formulario […]

Leave a Reply

Your email address will not be published.

%d bloggers like this: