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:

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
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.

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,