Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 avril 2009
-
24 févr. 2009 à 14:02
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 :
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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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
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+
Vous n’avez pas trouvé la réponse que vous recherchez ?
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 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
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 : /
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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
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 -->
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 :(
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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
Yunchi
Messages postés100Date d'inscriptionlundi 30 octobre 2006StatutMembreDernière intervention14 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 >_<