VBA Excel, problème peu commun

Résolu
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 24 févr. 2009 à 14:02
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 25 févr. 2009 à 09:13
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 14:33
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 15:11
les declarations sont a placer tout en haut de ton module
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 15:26
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
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
24 févr. 2009 à 16:34
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+
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
24 févr. 2009 à 16:44
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.
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 16:48
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 14:09
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"))
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 14:29
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 :)
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 14:54
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 : /
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 14:58
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
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 15:23
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 -->
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 15:38
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 ...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 15:42
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
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 15:51
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 15:55
t'es en .Net ?
sous windows 95 ?

parce que sinon, tu as pas les bons types là (Integer :S)
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 16:42
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 :(
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
24 févr. 2009 à 16:49
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)
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
24 févr. 2009 à 16:54
...
ce que propose Renfield est encore mieux (plus propre)
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 16:59
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
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 févr. 2009 à 17:19
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 >_<
0