Bonjour,
Mon niveau en VBA est faible, merci d'en tenir compte.
J'utilisais pour faire une mise à jour d'une application la fonction "Shell", malheureusement l'anti virus installé par mon siège bloque dorénavant cette commande...
J'essaie de trouver une solution alternative.
Je fais une mise à jour automatique d'une application "SuiviSAV.accdb"
Après un test de version, si mise a jour nécessaire, se lance le code suivant:
j'ai fait un copié collé dans un module du code présent dans la FAQ access:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Call fOpenRemoteForm("C:\SuiviSAV\MAJVersion.accdb", "FormCopieEnCours") Application.Quit
MAJVersion.accdb a pour seul but d'effectuer une copie de l'application située sur un NAS local (la nouvelle version) qui va venir écraser l'application présente sur le PC (l'ancienne version)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 Option Compare Database Private Declare Function apiSetForegroundWindow Lib "user32" _ Alias "SetForegroundWindow" _ (ByVal hwnd As Long) _ As Long Private Declare Function apiShowWindow Lib "user32" _ Alias "ShowWindow" _ (ByVal hwnd As Long, _ ByVal nCmdShow As Long) _ As Long Private Const SW_MAXIMIZE = 3 Private Const SW_NORMAL = 1 Function fOpenRemoteForm(strMDB As String, _ strForm As String, _ Optional intView As Variant) _ As Boolean Dim objAccess As Access.Application Dim lngRet As Long On Error GoTo fOpenRemoteForm_Err If IsMissing(intView) Then intView = acViewNormal If Len(Dir(strMDB)) > 0 Then Set objAccess = New Access.Application With objAccess lngRet = apiSetForegroundWindow(.hWndAccessApp) lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE) 'le premier appel à ShowWindow semble rester sans effet lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE) .OpenCurrentDatabase strMDB .DoCmd.OpenForm strForm, intView Do While Len(.CurrentDb.Name) > 0 DoEvents Loop End With End If fOpenRemoteForm_Exit: On Error Resume Next objAccess.Quit Set objAccess = Nothing Exit Function fOpenRemoteForm_Err: fOpenRemoteForm = False Select Case Err.Number Case 7866: ' MDB ouverte en mode exclusif MsgBox "The database you specified " & vbCrLf & strMDB & _ vbCrLf & "is currently open in exclusive mode. " & vbCrLf _ & vbCrLf & "Please reopen in shared mode and try again", _ vbExclamation + vbOKOnly, "Could not open database." Case 2102: ' Ce formulaire n'existe pas MsgBox "The Form \'" & strForm & _ "\' doesn\'t exist in the Database " _ & vbCrLf & strMDB, _ vbExclamation + vbOKOnly, "Form not found" Case 7952: ' L'utilisateur a fermé la base de données fOpenRemoteForm = True Case Else: MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description, _ vbCritical + vbOKOnly, "Runtime error" End Select Resume fOpenRemoteForm_Exit End Function
Le code qui fait ça est attaché au formulaire "FormCopieEnCours" sur l'évènement load.
J'ai aussi mis un module dans l'application "MAJVersion.accdb" avec la même fonction
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 Private Sub Form_Load() DoCmd.Maximize DoCmd.ShowToolbar "Ribbon", acToolbarNo DoCmd.NavigateTo "acNavigationCategoryObjectType" DoCmd.RunCommand acCmdWindowHide Dim objFSO As Object Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFolder "\\1xx.xx.xx.241\Public\Logiciels\SuiviSAV", "C:\SuiviSAV", True Call fOpenRemoteForm("C:\SuiviSAV\SuiviSAV.accdb", "FormBienvenue") Application.Quit End Sub
Pour tester je lance "artificiellement" la mise à jour depuis une application qui est identique, mais nommée "SuiviSAV V5.2".
La copie se fait bien, mais j'ai un message
de plus mon application "SuiviSAV V5.2"(ancienne version) ne se ferme pas pas plus que l'application "MAJVersion.accdb" , je suppose bloquées par l'erreur.Error 91, Variable objet ou variable de bloc with non définie
Par contre la nouvelle version "SuiviSAV" s'ouvre bien .
Merci d'avoir eu le courage de me lire jusque là et merci d'avance pour vos lumières...
Partager