Bonjour à tous le monde,
Voila avec mon entreprise on a récupéré un programme dont l'interface sont des formulaires access, qui interroge une base oracle qui est elle même incrémenté à l'aide de programmes sas. Autant vous dire que pour un débutant en vba et sas c'est pas facile de comprendre les programmes.
Si vous pouviez donc m'éclairer sur certains points du programme ce serait super sympa.
Mon premier souci est lors de l’exécution d'un filtre dans un formulaire, je vous passe la partie du programme qui fonctionne pour arriver directement à l'endroit qui ne fonctionne pas:
De plus je ne comprend pas la ligne de code surligné en vert (et plus globalement tous le sub shellwait) j'ai chercher un peu de partout notamment sur le forum ou j'ai pu voir que je ne suis pas le seul a l'utiliser mais j'ai jamais trouver d'explication.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 execution = """SAS.exe""" execution = execution & "-sysin """ + CStr(fichiercible) + ".sas""" execution = execution & "-log """ + CStr(fichiercible) + ".log""" execution = execution & "-sysparm """ & CStr(fichiercible) + ".txt""" ShellWait (CStr(execution)) Dim hProcess As LongPtr, RetVal As Long hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CStr(execution), vbMinimizedNoFocus)) filtre_form = "FILTRE_" & UCase(CStr(USER_CON)) Do GetExitCodeProcess hProcess, RetVal DoEvents Sleep 100 Loop While RetVal = STILL_ACTIVE La ligne de code en rouge étant la ligne qui beugue. Il me semble qu'elle appelle la fonction suivante qui se trouve dans un module: Public Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As LongPtr, ByVal bInheritHandle As LongPtr, ByVal dwProcessID As LongPtr) As LongPtr Public Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As LongPtr, lpExitCode As Long) As LongPtr Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) ----------------------------------------------------------------------------------------------------------------------------------- Public Sub ShellWait(ByVal JobToDo As String) Dim hProcess As Long, RetVal As Long hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus)) Do GetExitCodeProcess hProcess, RetVal DoEvents Sleep 100 Loop While RetVal = STILL_ACTIVE End Sub
Et troisième et dernière question: l'application plante également à un autre endroit sur la ligne de code:
shell(cstr(execution))
execution ayant la même valeur que dans le bout de code collé ci-dessus.
Mais cela me semble logique vus que shell() est sensé exécuter un programme au bout d'un chemin d’accès et dans mon cas ce sont plutôt 3 chemins d’accès mi bout à bout. La fonction peut elle exécuter trois programmes à la fois? Si oui comment? Et quel est la différence entre:
execution="sas.exe" et execution="""sas.exe"""??
Merci en tous cas par avance pour toute information qui pourrait faire avancer le schmilblick.
Cordialement,
Partager