VBA Excel, problème peu commun [Résolu]

Signaler
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
Yunchi
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
Bonjour,


Je vais essayer d'exposer mon problème clairement :)


En gros :


J'ai un dossier dans lequel j'ai un xls, un exe et un txt.


L'exe est un programme codé en C qui ouvre le txt, l'analyse et crée un autre fichier txt avec des statistiques. Quand je double click sur l'exe, tout se passe normalement et analyse le fichier texte et fait son boulot.


Dans mon xls, j'ai une macro qui lance l'exe via :


Path = Workbooks("Simulateur_RRC.xls").Path
RetVal = Shell(Path + "" + "file_analyzer.exe", 1)
Windows("Simulateur_RRC.xls").Activate



Et quand je click sur le bouton, ça lance bien mon exe mais l'exe ne fait pas ce qu'il faut. On arrive directement en fin de l'exe et il ne fait pas son boulot.


Plus de détails :


L'exe en gros :


if (fichier = fopen("nom.txt","r"))
{
analyse ....
affichage avancement ...
fclose(fichier);
}


printf("info...");
system("PAUSE");


Donc :


quand je double click sur l'exe : je sais que tout se passe bien grâce aux infos sur l'avancement de l'analyse


quand je lance mon exe via VB, j'ai juste le printf("info"); et le system("PAUSE"); de la fin mais bien sur les infos affichés sont vides.


Bref je comprends vraiment et en essayant avec un autre exe basique qui affiche des nombres aléatoires, tout marche très bien ...


Voilà s'il y'a quelqu'un qui connait ce problème ou un spécialiste de VB ....


Merci


 




 

23 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
le Shell démarre l'exe et rend la main a ta macro.
le programme lancé lui, n'a pas encore finit de tourner.

voir

http://www.vbfrance.com/codes/SHELLANDWAIT-EXECUTER-APPLICATION-ATTENDRE-FIN-RENVOYER-SON-CODE_34867.aspx
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
les declarations sont a placer tout en haut de ton module
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
les declarations sont a placer tout en haut de ton module

donc ça

Declare Function ShellExecute Lib "Shell" (hWnd As Integer, lpszOp As String, lpszFile As String, lpszParams As String, lpszDir As String, fsShowCmd As Integer) As Integer
Declare Function FindWindow Lib "User" (lpClassName$, lpWindowName As Long) As Integer

n'a rien a faire là.

place les haut dessus de la première Sub ou Function de ton module
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

apparementle probleme de Yunchi ce trouve au niveau VBA !

deja pour commencer je te deconseil d'utiliser un nom de variable identique a un nom reservé VBA comme peut l'etre "Path" cela evite les conflits qui amenent à des situations bizards.
De plus les signes + pour la concatenation sont à eviter surtout en VBA excel

J'ai eu un probleme similaire en debut semaine et la conclusion est que l'appli lancée depuis excel ne fonctionnait pas car le repertoire dans le quel elle demarrait était le repertoire courant d'excel:
je te propose donc d'essayer 2 solutions :

1\ changer le repertoire courant avant de lancer ton exe

MonChemin = Workbooks("Simulateur_RRC.xls").Path
Chdir = MonChemin
RetVal = Shell(MonChemin & "" & "file_analyzer.exe", 1)

2\ passer par la commande start du commande.com ce qui permet de definir un repertoire de demarage pour l'appli
MonChemin = Workbooks("Simulateur_RRC.xls").Path
RetVal = Shell("cmd.exe /c start /d " & MonChemin & " " & MonChemin &"\file_analyzer.exe", 1) 'Attention aux espaces !

A+
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
re...

apres lecture de ton exe je suis de plus en plus certain d'avoir raison car il n'y a dans le code rien qui lui permet de retrouver le chemin du fichier text si le repertoire de demarage n'est pas le meme que le repertoire qui contient le fichier.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Quand tu regarde les propriétés d'un raccourci windows tout bête, tu vois que l'on peut renseigner un 'working directory' un dossier de travail.

quand tu ne précise pas le chemin de tes fichiers, windows se sert de ce working directory pour identifier les fichiers.

donc soit dans ton code en C tu exploite GetModuleBaseName pour retrouver le repertoire courant de l'application

soit tu utilises ShellExecute pour indiquer à windows quel repertoire de travail utiliser.

pour mettre en place la deuxieme option, reprenons.


a placer tout en haut du module (IMPORTANT)
+------------------------------------------------------------
Private Declare Function ShellExecute Lib "Shell" (hWnd As Long, lpszOp As String, lpszFile As String, lpszParams As String, lpszDir As String, fsShowCmd As Long) As Long

Sub analyser_fichier()
ShellExecute 0&, "open", ActiveWorkBook.Path & "\file_analyzer.exe", vbnullstring, ActiveWorkBook.Path, 1
End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
concatène pas avec +

ActiveWorkbook.Path suffit ^^

enfin, ici, on attend pas la fin de l'execution de l'exe externe, c'est peut etre voulu.

mais le soucis, pour moi, c'est que tu précise pas le Working directory...
fopen("nom.txt","r"))
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

Ah peux-tu développer le "enfin, ici, on attend pas la fin de l'execution de l'exe externe, c'est peut etre voulu. " stp ?

Pour le code en C j'ai tapé juste quelques lignes pour expliquer le principe mais c'est un peu plus complexe dedans :)
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

J'ai essayé d'incorporer ta fonction à mon fichier excel mais je ne sais pas trop comment faire en fait ...

J'ai tout copier coller dans un module et en testant avec ExecCmd "P:\Excel simulateur RRC\file_analyzer.exe", j'ai une petite erreur ... il me dit que seul les commentaires peuvent apparaitre après les End Sub

Ca concerne les lignes :

Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Public Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Je pense que ça doit être comme des déclarations de prototypes en C mais je ne sais pas où les mettre par contre : /
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

euh idem pour la fonction ShellExecute, je ne sais pas où mettre

Declare Function ShellExecute Lib "Shell"(hWnd As Integer, lpszOp
As String, lpszFile As String, lpszParams As String, lpszDir As
String, fsShowCmd As Integer) As Integer
Declare Function FindWindow Lib "User"(lpClassName$, lpWindowName As
Long) As Integer
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

Merci pour tes réponses

Suite à ce que j'ai compris, j'ai mis ça :

Sub analyser_fichier()


Declare Function ShellExecute Lib "Shell" (hWnd As Integer, lpszOp As String, lpszFile As String, lpszParams As String, lpszDir As String, fsShowCmd As Integer) As Integer
Declare Function FindWindow Lib "User" (lpClassName$, lpWindowName As Long) As Integer

hWnd = FindWindow("OPUSAPP", 0)
X = ShellExecute(hWnd, "Open", "P:\Excel simulateur RRC\file_analyzer.exe", "", "", 1)

End Sub

Par contre quand je lance, j'ai de nouveau le même message disant que seuls les commentaires peuvent apparaitre après les End machin :(  <!-- / message -->
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

ah ok :)

j'ai déplacé les declare en haut et je n'ai plus la même erreur mais quand j'exécute je pense que il y'a un problème avec

hWnd = FindWindow("OPUSAPP", 0)
X = ShellExecute(hWnd, "Open", "P:\Excel simulateur RRC\file_analyzer.exe", "", "", 1)

J'ai essayer de changer le paramètre "OPUSAPP" par le nom de la feuille ou du fichier xls mais ça ne change pas ...

j'ai une erreur disant que le fichier User est introuvable ...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
hWnd = FindWindow("OPUSAPP", 0)
inutile
transmets simplement 0& comme handle

quand aux autres paramètre, ne pas confondre vbNullString et ""
ça n'a RIEN a voir, lorsuqe l'on joues avec les APIs

pointeur vers chaine vide / pointeur nul

ShellExecute 0&, "open", ActiveWorkBook.Path & "\file_analyzer.exe", vbNullString, ActiveWorkBook.Path, 1
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

euh en fait ça semble venir de :

DeclareFunction FindWindow Lib"User"(lpClassName$, lpWindowName AsLong)As IntegerPublic

Il y'a une erreur la dessus : Type défini par l'utilisateur non défini : /

Le code ressemble à ça maintenant :

DeclareFunction ShellExecute Lib"Shell"(hWnd AsInteger, lpszOp AsString, lpszFile AsString, lpszParams AsString, lpszDir AsString, fsShowCmd AsInteger)AsInteger
DeclareFunction FindWindow Lib"User"(lpClassName$, lpWindowName AsLong)As IntegerPublic
 
Sub analyser_fichier()
 
X = ShellExecute(0, "Open", "P:\Excel simulateur RRC\file_analyzer.exe", "", "", 1)
 
EndSub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
t'es en .Net ?
sous windows 95 ?

parce que sinon, tu as pas les bons types là (Integer :S)
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

Merci pour vos réponses. Même chose en passant par cmd.exe

Je travaille sous Excel 2003 avec windows

Bref je pense avoir identifié le problème mais je n'arrive pas à le fixer. En gros d'après la doc microsoft, il y'a un problème avec la fonction Shell. Elle ne permet pas au programme lancé via Shell d'ouvrir d'autres fichiers. Or mon programme fait du traitement de texte et important un fichier txt.

Donc voilà il faudrait que j'arrive à implémenter la fonction ShellExecute mais bon j'ai des erreurs à chaque fois :(
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
je répète, en passant, dans le code que tu as testé, tu as utilisé de mauvaises déclarations APIs, propres à windows 95 (16 bits)
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
...
ce que propose Renfield est encore mieux (plus propre)
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

Le bout de code en C que j'ai mis pour illustrer mon exe n'est là que pour mieux comprendre le principe de mon programme mais il est plus complexe que ça.

En ce qui concerne la partie VB, j'ai mis

Private Declare Function ShellExecute Lib "Shell" (hWnd As Long, lpszOp As String, lpszFile As String, lpszParams As String, lpszDir As String, fsShowCmd As Long) As Long

tout en haut du module et il est pris en compte comme étant une déclaration

Cependant la commande ShellExecute ne marche pas -> fichier introuvable : Shell
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

Bon ..... j'ai trouvé une source sur le net pour ShellExecute

Ca marche mais toujours le même problème >_<

Const SW_SHOW = 1
Const SW_SHOWMAXIMIZED = 3


Public Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, _
   ByVal lpOperation As String, _
   ByVal lpFile As String, _
   ByVal lpParameters As String, _
   ByVal lpDirectory As String, _
   ByVal nShowCmd As Long) As Long


Sub RunYourProgram()
  Dim RetVal As Long
  On Error Resume Next
                         
X = ShellExecute(0, "Open", "P:\Excel simulateur RRC\file_analyzer.exe", "", "", 1)
End Sub


 


Bon comme tu l'as dit bigfish je vais relire mon code C ça vient peut être de là en fait >_<
1 2