VBA: ejecutar un comando

sifusalade Mensajes publicados 142 Estado Miembro -  
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   -
Hola,

Para convertir un PNG a GIF dinámicamente para poder usarlo en un UserForm, encontré un ".exe" que permite hacer la conversión.

Sin embargo, para funcionar, necesita que arrastremos/soltemos el PNG a convertir directamente sobre el ".exe"

A través de la consola cmd, si escribo la ruta del exe -> (espacio) -> ruta del PNG, funciona.
Además, me gustaría poder ejecutar esta línea de comando en VBA automáticamente. (Y cerrar la ventana cmd una vez finalizado).

He encontrado en internet la función Shell. Puedo ejecutar el cmd, pero necesito ingresar la línea de comando manualmente.

No entiendo cómo proporcionar los argumentos de la función shell para eso.

¿Alguien puede ayudarme?

Agradeciéndoles de antemano.

11 respuestas

f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola,
Entre otros sitios.
A ver: https://www.easy-micro.org/shell-vba.php&id=401 sobre todo por las comillas dobles (")
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
Muchas gracias. Miré y traté, pero aún no funciona.

Aquí está el código que ingresé:
Sub test() Dim appli As String Dim fichier As String appli = "C:\apng2gif.exe" fichier = DOSSIER_LOGOS & "toto.png" 'DOSSIER_LOGOS es una función que devuelve 'la ruta del directorio (como String), esta ruta 'tiene espacios Shell "C:\WINDOWS\system32\cmd.exe " & appli & " " & """ & fichier & """, vbMinimizedNoFocus End Sub
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola,

esto sigue sin funcionar
No quiere decir nada, ¿qué está pasando o no? ¿Un mensaje de error?
Ponga un punto de ruptura en la línea Shell
Ejecute el código, pase el cursor del ratón sobre DOSSIER_LOGOS para ver el contenido
Quizás falte un \ delante de Toto.png

A ver:
Faltarían dos " delante de "C: y uno después de archivo

ejemplo:
Shell """C:\Program Files (x86)\Nuance\PDF Professional 8\bin\GaaihoDoc.exe"" """ & path1 & """", vbNormalFocus
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
La consola se inicia, pero está vacía. Solo muestra una localización en la carpeta documentos y eso es todo.

He intentado colocar las comillas dobles exactamente como en su ejemplo, pero reacciona exactamente de la misma manera.

La función DOSSIER_LOGOS devuelve la ruta con una \ al final.

No entiendo qué está mal.
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola,

DOSSIER_LOGOS

¿De dónde sale esta cosa?

Pase el cursor del ratón sobre el archivo.
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
Como dije, esta función devuelve una cadena que es la ruta de una carpeta.
Esta función devuelve:
 Function DOSSIER_LOGOS() as String DOSSIER_LOGOS = ThisWorkbook.Path & "\Images\Logos\" End Function


Cuando paso el mouse en modo de depuración, me devuelve esto correctamente. De hecho, también he probado poner un
MsgBox DOSSIER_LOGOS
en un procedimiento de prueba, y me muestra la ruta correctamente.

Así que estoy seguro de que el problema no viene de ahí. Las carpetas "Images" y "Logos" están escritas sin errores (a través de copiar/pegar para estar seguro).
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Hola,

para lanzar una aplicación en 64 bits, ve esto:

http://www.office-loesung.de/ftopic619862_0_0_asc.php

--
@+ El Pivert
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola a los dos,

Lanzó la aplicación con un comando shell simple y funciona. Sin embargo, se abre la ventana de la aplicación y debo hacer clic en convertir.
Con otros comandos, incluido el del sitio dado por cs_Le Pivert, también se abre la ventana de la aplicación...
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
¡Muchas gracias a los dos! El método proporcionado por cs_Le Pivert funciona. Y para mí, no tengo que hacer clic en la consola. ¡Perfecto! Hice la prueba escribiendo el comando directamente. Solo queda generarlo con variables y estará listo.

 Public Sub prcStartMSConfig64Cmd() Const WND_HIDE As Integer = 0 Dim objWshShell As Object Set objWshShell = CreateObject("WScript.Shell") objWshShell.Run "%windir%\Sysnative\cmd.exe " & _ "/C start c:\apng2gif.exe c:\toto.png", WND_HIDE, True 'solo he modificado esta línea Set objWshShell = Nothing End Sub 
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Re,
Llego a lo mismo con esto:

Shell "cmd /c start " & aplicación & " " & archivo & """", vbMinimizedFocus
0
sifusalade Mensajes publicados 142 Estado Miembro 7 > f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención  
 
Los grandes espíritus se encuentran. También acabo de probar esto, y también funciona para mí. Parece que lo que me faltaba era el
/c start
. No lo había puesto antes.
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > sifusalade Mensajes publicados 142 Estado Miembro
 
Re,

lo que me faltaba era el /c start

No, funciona sin eso, lo probé con para ver la diferencia...
0
sifusalade Mensajes publicados 142 Estado Miembro 7 > f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención  
 
Para mí no funcionaba sin. Estoy totalmente perdido. Voy a tomarme unos días de descanso y a mirar esto de nuevo. Porque ahora, estoy totalmente desorientado. No entiendo. Pero estoy seguro de que me he perdido algo.

Sobre todo porque incluso al volver a poner el
/c start
, después de haberlo intentado sin, ya no funcionaba, me abría directamente el PNG. Así que estoy seguro de que he metido la pata en algún lugar, tengo el cerebro que no puede seguir ahora ????.. Estoy haciendo cualquier cosa.

Muchas gracias de todos modos por esta ayuda y el tiempo dedicado ????
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > sifusalade Mensajes publicados 142 Estado Miembro
 
Hola,
intenta escribiendo los valores aplic y archivo en la línea de comando, con start para ti. Solo hará una cadena simple entre comillas.
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
gracias.
(PD: mis emoticonos han sido reemplazados por ??? así que eso cambia el sentido de la frase jaja)
Voy a hacer una pausa en el VBA unos días. Y volveré a aclarar mi (o mis errores). Eso puede ser útil para otros ^_^
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
Hola,

Incluso después de descansar, sigo volando igual. Me di cuenta de que el problema viene de las comillas dobles.

 Sub Test(Str_Fichier as String) 'Str_Fichier contiene la ruta completa hacia un archivo Dim appli As String Dim Fichier As String Dim commande As String appli = DOSSIER_LOGOS & "apng2gif.exe" Fichier = DOSSIER_LOGOS & Str_NomFichier commande = "cmd /C start " & appli & " " & Fichier Shell commande, vbMinimizedNoFocus End Sub 


En mis últimas pruebas, funcionaba porque para la variable appli tenía
appli = "C:\apng2gif.exe"
(una ruta sin espacios).
Ahora que lo he reemplazado, ya no funciona.

La función DOSSIER_LOGOS devuelve una ruta que contiene espacios.
(D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\)

Y el problema viene de ahí.

Todavía no he entendido cómo colocar mis comillas dobles.

En el estado actual, obtengo un mensaje de error que dice que Windows no puede encontrar D:\99.
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola,
¡Sal de la arena!

Hay algo, ¿por qué D: es más que C:?
en tu código añade esta línea
después de comando=
Debug.print comando


coloca un punto de interrupción en la línea Shell

Ejecuta el código
Muestra la ventana de ejecución para ver el contenido de comando
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
De hecho, puse C: para probar, pero la ruta de Appli debe seguir la carpeta que contiene el archivo de Excel.
Así que potencialmente D: y rutas con espacios. Quería probar cómo reaccionaría.

Pensé que solo tendría que cambiar el contenido de mi variable Appli una vez encontrada la orden correcta. Pero estaba completamente equivocado.

Hice muchas pruebas, incluyendo debug.print.

con
 comando = "cmd /c start " & """" & appli & """" & " " & """" & Fichier & """" Debug.Print comando 

Debug.Print me da :
cmd /c start "D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\apng2gif.exe" "D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\58.png"


y
Shell comando, vbMinimizedNoFocus

Tengo dobles comillas que rodean mis rutas, pero por otro lado, me abre directamente el archivo 58.png. Sin embargo, quiero lanzar este archivo 58.png con la aplicación apng2gif.exe (Appli)

PD: mi escritorio no está en C:, sino en D:
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Re,
Bizarro.

Antes de Appli=, pongan esta línea
Chdir DOSSIER_LOGOS
Cambien las asignaciones de aplicación y archivo sin DOSSIER_LOGOS
para posicionarse en el directorio de sus archivos.
0
sifusalade Mensajes publicados 142 Estado Miembro 7
 
¡MUCHAS GRACIAS!!!! Funciona.

De hecho, justo un minuto antes de ver esta genial respuesta, estaba pensando que no era posible y resolví el problema haciendo una copia de "apng2gif.exe" en "C:\TEMP\". Esto me permitía tener una ruta sin espacios para la aplicación. Y me obligaba a eliminar "C:\TEMP\apng2gif.exe" en Workbook_BeforeClose.

Pero ahora, es mucho mejor. Es realmente lo que quería hacer desde el principio.

No soy del tipo que pide ayuda para que la gente haga el trabajo por mí. También busco entender y aprender.

Si entiendo bien, la línea Chdir DOSSIER_LOGOS me posiciona en esa carpeta en la consola, ¿verdad? Y entonces, si es eso, y si lo entiendo bien, estando posicionado allí, no necesito una ruta absoluta.
0
f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
 
Hola,
David Bowie.
0