Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2011, 23h24   #1
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 148
Points : 36
Points : 36
Par défaut Erreur 2108 et 2115

Bonsoir à tous,

Je m'arrache les cheveux à cause des erreurs 2108 "Vous devez enregistrer le champ avant d'exécuter l'action AtteindreContrôle, la méthode GoToControl ou la méthode SetFocus." et 2115 "La macro ou fonction attribuée à la propriété AvantMAJ ou ValideSi pour ce champ empêche Microsoft Office Access d'enregistrer les données dans le champ.".

J'ai un formulaire de recherche de client pour lequel j'ai, entre autres, ces portions de code :
Code :
1
2
3
Private Sub Form_Load()
    InitFrmRechercheClients
End Sub
Code :
1
2
3
4
5
Public Sub InitFrmRechercheClients()
    Me.lstClients.RowSource = CurrentDb.QueryDefs!qryListeClients.SQL
    Me.lstClients.Requery
    Me.txtNom.SetFocus
End Sub
Code :
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
Public Sub RefreshQuery()
    Dim ctrl As Control
    'Booléen servant à savoir si au moins l'un des champs contient quelque chose
    Dim bool As Boolean
    Dim SQL As String
 
    bool = False
    For Each ctrl In Me.Controls
        If ctrl.ControlType = acTextBox Then
            If ctrl.Value = "" Or IsNull(ctrl.Value) Then
                bool = False
            Else
                bool = True
                Exit For
            End If
        End If
    Next ctrl
 
    SQL = CurrentDb.QueryDefs!qryListeClients.SQL
 
    If bool = True Then
        'Pour supprimer le point-virgule, il faut retirer 3 caractères à la chaîne contenant la requête SQL car un retour chariot est
        'automatiquement généré dans l'objet Requête qryListeClients et compte pour 2 caractères Chr(10) (saut de ligne)
        ', et Chr(13) (retour chariot).
        SQL = Left(SQL, Len(SQL) - 3) & " WHERE NumCl > 0"
 
        If Me.txtNom <> "" Then
            SQL = SQL & " AND NomCl LIKE '*" & Me.txtNom & "*'"
        End If
 
        If Me.txtPrenom <> "" Then
            SQL = SQL & " AND PrenomCl LIKE '*" & Me.txtPrenom & "*'"
        End If
 
        If Me.txtDateNaiss <> "" Then
            SQL = SQL & " AND DateNaissCl = #" & Me.txtDateNaiss & "#"
        End If
 
        If Me.txtVille <> "" Then
            SQL = SQL & " AND VilleCl LIKE '*" & Me.txtVille & "*'"
        End If
 
        SQL = SQL & ";"
        Me.lstClients.RowSource = SQL
        Me.lstClients.Requery
    Else
        InitFrmRechercheClients
    End If
End Sub
Code :
1
2
3
Private Sub txtNom_BeforeUpdate(Cancel As Integer)
    RefreshQuery
End Sub
Code :
1
2
3
Private Sub txtNom_LostFocus()
    txtNom.Value = UCase(txtNom.Value)
End Sub
Quand je lance mon formulaire, je suis positionnée sur le champ txtNom. Si je fais TAB, rien ne se passe. Si je tape un caractère et que je l'efface, l'événement BeforeUpdate entre en jeu. C'est là que j'ai l'erreur 2108 avec la ligne
Me.txtNom.SetFocus
de la Sub InitFrmRechercheClients() surlignée. Si je fais Débogage, j'ai l'erreur 2115 avec la ligne
txtNom.Value = UCase(txtNom.Value)
de la Sub txtNom_LostFocus() surlignée.

Quelqu'un pourrait-il m'aider svp ?
Shankara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 00h20   #2
Membre éclairé
 
Avatar de tee_grandbois
 
Inscription : novembre 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 216
Points : 321
Points : 321
Bonsoir,
1) dans ton événement txtNom_BeforeUpdate tu fais appel au sub RefreshQuery qui rafraichit ta requète SQL :
Code :
1
2
        Me.lstClients.RowSource = SQL
        Me.lstClients.Requery
Ce n'est pas très cohérent : dans l'événement Before Update, tu ne devrait avoir que des contrôles de saisie et surtout pas de mises à jour de champs.
2) De plus, dans le sub InitFrmRechercheClients tu donnes le focus au champ que tu es en train de mettre à jour (appelé dans sub RefreshQuery) :
Code :
1
2
3
4
5
Public Sub InitFrmRechercheClients()
    Me.lstClients.RowSource = CurrentDb.QueryDefs!qryListeClients.SQL
    Me.lstClients.Requery
    Me.txtNom.SetFocus
End Sub
Ce qui peux expliquer ces messages d'erreurs.
Essaie d'enlever le sub InitFrmRechercheClients dans le RefreshQuery pour voir si cela fonctionne mieux.
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h25   #3
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 148
Points : 36
Points : 36
1) La requête RefreshQuery remet à jour la liste qui se situe en-dessous des champs de saisie
2) Comment puis-je faire pour rendre le focus au champ txtNom alors ? Ce formulaire sert à effectuer une recherche en actualisant la requête SQL source de la liste en quittant le champ dans lequel on se place. Si l'on efface la saisie sans l'enregistrer, je veux que le formulaire soit réinitialisé avec la requête de départ. Comment puis-je faire cela sans rencontrer ces messages d'erreur ?
Shankara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h12   #4
Nouveau Membre du Club
 
Inscription : février 2007
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 148
Points : 36
Points : 36
Finalement, j'ai retiré la ligne
Me.txtNom.SetFocus
de la Sub InitFrmRechercheClients().

Lorsque je saisis quelque chose dans le champ txtNom et que je l'efface avant de changer de champ, la liste est bien réinitialisée. Seul différence, le curseur ne se repositionne pas sur le champ txtNom, mais cela reste un détail acceptable. Je m'en tiens donc là.
Merci tee_grandbois pour ta réponse.
Shankara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h24.


 
 
 
 
Partenaires

Hébergement Web