Bonjour,

A l'ouverture de ma base, j'ai un code qui s'exécute automatiquement

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
Option Compare Database
Option Explicit
Private Sub Form_Open(Cancel As Integer)
 
Dim Base As DAO.Database
Dim Chemin As String
Dim I As Integer
Dim MonPc As Variant
Dim rst As Recordset
 
 
' V?rification et enregistrement des op?rations r?currentes
 
DoCmd.SetWarnings False
DoCmd.OpenQuery "R_Recurrente_Ajout", , acEdit
DoCmd.OpenQuery "R_Recurrente_MAJ", , acEdit
DoCmd.OpenQuery "R_Recurrente_Supression", , acEdit
DoCmd.SetWarnings True
 
 
' Chemin du fichier Excel de Synth?se
 
MonPc = Environ("COMPUTERNAME")
Set Base = CurrentDb
    Set rst = Base.OpenRecordset("SELECT * From T_Parametres where TPara1 = '" & MonPc & "'", dbOpenSnapshot)
    Chemin = rst.Fields("Tpara2").Value
    rst.Close
    Set rst = Nothing
 
Application.TempVars("MonFichExcel").Value = Chemin & "Synthese_des_comptes.xlsm"
 
 
' Calcul des Soldes de comptes
 
For I = 1 To 6
 
    Application.TempVars("Moncompte").Value = I
    CalculSoldeCompte Me
    CalculSoldeBanque Me
 
Next I
 
 
' Ouverture du formulaire des saisie op?ration et fermeture formulaire d?marage
 
Application.TempVars("Moncompte") = 4
DoCmd.OpenForm "F_Saisie_Operation", , , "TaOpNumCompte = " & 4
DoCmd.Maximize
DoCmd.GoToRecord , , acNewRec
DoCmd.Close acForm, "Demarage"
 
End Sub
Qui appel 2 fonctions pour chacun de mes comptes à calculer les différents soldes

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
Option Compare Database
Option Explicit
 
 
Public Base As DAO.Database
Public ClasExcel As DAO.Database
 
Public Col As Variant
Public CompteActuel As Variant
Public Credit As Variant
Public DateJ As Date
Public DateK As Date
Public DateL As Date
Public Debit As Variant
 
Public I As Integer
Public Lign As Variant
 
Public rst As Recordset
Public rstFiltered As Recordset
Public Solde As Variant
 
 
Public XLApp As Excel.Application
Public XLSheet As Excel.Worksheet
Public XLBook As Object
 
 
 
'  ***********************************
'  **  CALCUL DU SOLDE DES COMPTES  **
'  ***********************************
 
Function CalculSoldeCompte(ByRef CalculSoldeC As Form)
 
 
 
DateL = DateAdd("m", 1, DateSerial(Year(Date), Month(Date), 1))
 
' **  Calcul du solde fin de mois  **
' ***********************************
 
    Solde = 0
    CompteActuel = Application.TempVars("Moncompte").Value
 
    Set Base = CurrentDb
    Set rst = Base.OpenRecordset("SELECT * From T_Operation where TaOpNumCompte =" & CompteActuel, dbOpenSnapshot)
    Do
 
        If rst.Fields("TaOpMultiFils").Value = "Faux" Then
            DateJ = rst.Fields("TaOpDate").Value
            If DateJ < DateL Then
                If rst.Fields("TaOpMultiFils").Value = 0 Then
                    Debit = rst.Fields("TaOpDebit").Value
                    Credit = rst.Fields("TaOpCredit").Value
                   Solde = Solde + Credit - Debit
                End If
            End If
        End If
        rst.MoveNext
    Loop Until rst.EOF = True
 
    rst.Close
    Set rst = Nothing
 
    Set rst = Base.OpenRecordset("T_Comptes", dbOpenDynaset)
    rst.Filter = "TaCoCle = " & CompteActuel
    Set rstFiltered = rst.OpenRecordset
 
    rstFiltered.Edit
    rstFiltered.Fields("TaCoSoldeCompte").Value = Solde
    rstFiltered.Update
 
    rst.Close
    Set rst = Nothing
 
        ' Enregistrement dans Excel
        Lign = CompteActuel
        Col = 8
        DAOUpdateExcelFile Application.TempVars("MonFichExcel").Value, "Feuil2", Lign, Col, Lign
 
 '  **  Calcul du solde ? ce jour  **
 '  *********************************
 
    Solde = 0
 
     Set rst = Base.OpenRecordset("T_Operation", dbOpenDynaset)
 Set rst = Base.OpenRecordset("SELECT * From T_Operation where TaOpNumCompte =" & CompteActuel, dbOpenSnapshot)
    Do
        DateJ = rst.Fields("TaOpDate").Value
        If DateJ <= Date Then
            If rst.Fields("TaOpMultiFils").Value = "Faux" Then
                    Debit = rst.Fields("TaOpDebit").Value
                    Credit = rst.Fields("TaOpCredit").Value
                    Solde = Solde + Credit - Debit
            End If
        End If
        rst.MoveNext
    Loop Until rst.EOF = True
 
    rst.Close
    Set rst = Nothing
 
    Set rst = Base.OpenRecordset("T_Comptes", dbOpenDynaset)
    rst.Filter = "TaCoCle = " & CompteActuel
    Set rstFiltered = rst.OpenRecordset
 
    rstFiltered.Edit
    rstFiltered.Fields("TaCoSoldeJour").Value = Solde
    rstFiltered.Update
 
    rst.Close
        Set rst = Nothing
 
        ' Enregistrement dans Excel
        Col = 10
        DAOUpdateExcelFile Application.TempVars("MonFichExcel").Value, "Feuil2", Lign, Col, Lign
 
 
End Function
 
'  *********************************
'  **  CALCUL DU SOLDE DE BANQUE  **
'  *********************************
Function CalculSoldeBanque(ByRef CalculSoldeB As Form)
 
CompteActuel = Application.TempVars("Moncompte").Value
 
    Solde = 0
 
    Set rst = Base.OpenRecordset("T_Operation", dbOpenDynaset)
    rst.Filter = "TaOpNumCompte = " & CompteActuel & "And TaOpPointageBanque = -1" ' AND TaOpMultiFils = -1"
      Set rstFiltered = rst.OpenRecordset
 
    Do
 
        'If rst.Fields("TaOpCle").Value = 394 Then MsgBox rst.Fields("TaOpMultiFils").Value
        'If rst.Fields("TaOpMultiFils").Value = 0 Then
            Debit = rstFiltered.Fields("TaOpDebit").Value
            Credit = rstFiltered.Fields("TaOpCredit").Value
            Solde = Solde + Credit - Debit
        'End If
        rstFiltered.MoveNext
    Loop Until rstFiltered.EOF = True
 
    rst.Close
    Set rst = Nothing
 
    Set rst = Base.OpenRecordset("T_Comptes", dbOpenDynaset)
    rst.Filter = "TaCoCle = " & CompteActuel
    Set rstFiltered = rst.OpenRecordset
 
    rstFiltered.Edit
    rstFiltered.Fields("TaCoSoldeBanque").Value = Solde
    rstFiltered.Update
 
    rst.Close
    Set rst = Nothing
 
 
        ' Enregistrement dans Excel
        Lign = CompteActuel
        Col = 9
        DAOUpdateExcelFile Application.TempVars("MonFichExcel").Value, "Feuil2", Lign, Col, Lign
 
End Function
qui appellent à leur tour un code pour l'enregistrer dans une cellule d'un classeur Excel fermé (code copié à Cafeine https://access.developpez.com/faq/?p...egChangeExcell.)

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
 
'  ******************************************************
'  **  ENREGISTREMENT DANS SYNTHESE DES COMPTES EXCEL  **
'  ******************************************************
 
Sub DAOUpdateExcelFile(ByVal strFullPath As String, _
                       ByVal strTab As String, _
                       ByVal RowIndex As Long, _
                       ByVal ColumnIndex As Long, _
                       ByVal setValue As Variant)
 
    ' Ajoutez la r?f?rence DAO
    Dim db As DAO.Database
    Dim rec As DAO.Recordset
 
    ' On ouvre le fichier Excel en tant que base de donn?es DAO
    Set db = OpenDatabase(strFullPath, False, False, "Excel 8.0;")
    DoEvents
 
    Set rec = db.OpenRecordset(strTab & "$", DAO.dbOpenDynaset)
 
    ' On se d?place sur l'enregistrement souhait?
    rec.Move RowIndex - 1
    ' On ?dite l'enregistrement
 
 
    rec.Edit
        rec.Fields(ColumnIndex - 1).Value = Solde
    rec.Update
    ' On sauvegarde
 
    ' Fermez les objets
    rec.Close
    db.Close
 
    ' Lib?rez les objets !
    Set db = Nothing
    Set rec = Nothing
 
End Sub
Jusque là, tout va bien, mon tableau se met à jour sans problème.

Mais lors de saisie de nouvelles opérations dans un formulaire, lors d'une saisie d'un débit ou crédit ou lors de pointage banque, je refait appel aux fonctions de calculs de solde de compte

exemple de mon code à la saisie d'une opération Crédit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Private Sub TaOpCredit_AfterUpdate()
 
If IsNull(Me!TaOpCredit.Value) Then TaOpCredit = 0
If IsNull(Me!TaOpDebit.Value) Then TaOpDebit = 0
Form.Refresh
CalculSoldeCompte Me
Form.Refresh
 
End Sub
J'ai le mme code pour le débit et pointage banque.
Mes Soldes se mettent bien à jour, mais là j'ai un message qui s'affiche
Nom : Capture.PNG
Affichages : 130
Taille : 7,6 Ko

et au débogage, ma ligne dans mon dernier code lors de l'enregistrement dans ma cellule Excel
est surlignée


Je me permets d'ajouter quelques précisions :

- au démarrage avec Access fermé (démarrage avec un raccourci sur le bureau) , le code CalculSoldeBanque et CalculSlodeCompte s'exécutent 6 fois chacun (puisqu'il y a une boucle pour passer tous nos comptes bancaires). Pour le CalculSoldeCompte, il appelle 2 fois le code d'enregistrement dans la cellule Excel et pour le code CalculCodeBanque, 1 fois. Donc le code d'enregistrement dans la cellule Excel est appelé 18 fois au démarrage et donc sans problème.
- mais si j'interompre mes saisies et que je veux redémarrer en double cliquant sur le fichier de démarrage dans le volet de navigation Access, le bug est là.
- de même que si je n'enregistre pas dans les cellules accès au démarage, mais que je le faits simplement en quittant access, le bug est aussi là.

En fait, ce code ne fonctionne qu'au démarrage, access fermé.


Si quelqu'un pourrait m'aider à résoudre ce problème

Merci d'avance et bonne journée