Objet Err restitue une erreur, alors que le code se déroule bien

7 réponses
Avatar
ElXav
Bonjour la Communaut=E9,

Migr=E9 depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
soucis avec mes applis Access et Excel.
Celles-ci fonctionnent tr=E9s bien sous XP, mais sous 2007, j'obtiens
des codes erreur dans l'objet Err, alors que le code ne se plante pas
m=EAme en d=E9sactivant le contr=F4le d'erreur!!


Or donc, le code list=E9 ci-dessous est l=E0 pour:
- Cr=E9er un RecordSet bas=E9 sur le contenu d'une table attach=E9e
contenant un seul enregistrement.
Cette table attach=E9e peut ne plus =EAtre valide, ce qui est normal
dans le cadre de l'exploitation de cette base.
Donc
- Si la cr=E9ation du RecordSet g=E9n=E8re une erreur, il est probable qu=
e
la table attach=E9e ne soit plus valide (lien rompu), dans ce cas,
j'alerte l'utilisateur et le dirige vers un formulaire permettant de
r=E9tablir tous les liens de la base de donn=E9es
- Si la cr=E9ation du RecordSet ne g=E9n=E8re pas d'erreur, je traite
l'enregistrement.


D'o=F9 le code suivant.


01 Function InitCodeCentraleTrait=E9e() As Boolean
02 ' Initialiser le Code Centrale ex=E9cutant l'application
03 ' Initialiser les variables globales
04 Dim frd As Recordset
05 Dim Fnct As Boolean

06 InitCodeCentraleTrait=E9e =3D False

07 On Error Resume Next
08 Err.Clear
09 Set frd =3D CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale trait=E9e] =3D True", dbOpenSnapshot)
10 If Err <> 0 Then
11 MsgBox "Impossible de trouver la table 'Centrales'. L'attache de
table est certainement incorrecte." & Chr$(10) & Chr$(13) &
Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
12 DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
acWindowNormal
13 GoTo InitCodeCentraleTrait=E9e_Fin
14 End If

15 On Error GoTo 0

16 If frd.BOF Then
17 CodeCentraleTrait=E9e =3D 0 'Non d=E9fini
18 MsgBox "Le Code Centrale Trait=E9e n'est pas d=E9fini." & Chr$(10) &
Chr$(13) & "Veuillez modifier ce param=E8tre dans la table
'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
19 GoTo InitCodeCentraleTrait=E9e_Fin
20 End If

21 Fnct =3D InitVariablesGlobales()

22 InitCodeCentraleTrait=E9e =3D True
23 CodeCentraleTrait=E9e =3D frd.Fields("Code_centrale")

24 InitCodeCentraleTrait=E9e_Fin:
25 frd.Close
26 Set frd =3D Nothing
27 End Function


Mon probl=E8me se situe en ligne 09.
La variable frd est bien initialis=E9e, je l'ai v=E9rifi=E9 par des ?
frd.fields(1).value dans la fen=EAtre Ex=E9cution de VBA.
Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
With non d=E9finie!!!!

Si je place un point d'arr=EAt sur la ligne 09, ex=E9cutant le Set, et que
je continue en pas =E0 pas, je n'obtiens pas l'erreur!
Si je place mon point d'arr=EAt sur la ligne 10, soit apr=E8s l'ex=E9cution
du Set, j'obtiens l'erreur.

Un Debug.Print Err.Number, Err.Description juste avant le Set donne
comme r=E9sultat "0".
C'est donc bien le Set qui d=E9clenche l'erreur, mais il ne plante pas.

J'ai un comportement similaire dans Excel.
Je me suis tourn=E9 vers nos amis Excelliens mais je n'ai pas obtenu de
r=E9ponse expliquant le probl=E8me.

On Error Resume Next
For intL =3D 3 To 15 Step 3
Err.Clear
.Cells(RngFind.Row, 33 + intL) =3D CDbl(Me.Controls ("TbxProPvc1" &
Format(CStr(intL), "00"))) <<--- G=E9n=E8re l'erreur
If Err.Number <> 0 Then
MsgBox "Donn=E9e incorrecte.", vbExclamation + vbOKOnly,
ETPP_NomApplication
Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
GoTo Restituer_Fin
End If
Next intL

L'interception d'erreur n'est la que au cas o=F9!
En effet, sans le On Error Resume Next, le code se d=E9roule sans
probl=E8me, du fait que je r=E9alise le maximum de v=E9rification en amont.
Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
n'appartient pas =E0 la s=E9lection.

Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
un code erreur?

Si vous avez des id=E9es je suis preneur.

D'avance merci et bon code.

Cordialement.

7 réponses

Avatar
Sylvain Lafontaine
Possiblement un problème de compilation ou de référence. Vérifiez la liste
de vos références mais d'abord, prenez soin de décompiler au complet votre
fichier MDB ou ACCDB lorsque vous le transférez d'Access 2000 vers 2007:
changer la liste des références en ajoutant une référence bidon/inutile
(vous pouvez l'enlever plus tard) ce qui va forcer Access à recompiler tous
les modules ou créer un shortcut avec les options suivantes et utilisez-le
pour décompiler votre fichier:

/decompile /compact /repair

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web: http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"ElXav" wrote in message
news:
Bonjour la Communauté,

Migré depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
soucis avec mes applis Access et Excel.
Celles-ci fonctionnent trés bien sous XP, mais sous 2007, j'obtiens
des codes erreur dans l'objet Err, alors que le code ne se plante pas
même en désactivant le contrôle d'erreur!!


Or donc, le code listé ci-dessous est là pour:
- Créer un RecordSet basé sur le contenu d'une table attachée
contenant un seul enregistrement.
Cette table attachée peut ne plus être valide, ce qui est normal
dans le cadre de l'exploitation de cette base.
Donc
- Si la création du RecordSet génère une erreur, il est probable que
la table attachée ne soit plus valide (lien rompu), dans ce cas,
j'alerte l'utilisateur et le dirige vers un formulaire permettant de
rétablir tous les liens de la base de données
- Si la création du RecordSet ne génère pas d'erreur, je traite
l'enregistrement.


D'où le code suivant.


01 Function InitCodeCentraleTraitée() As Boolean
02 ' Initialiser le Code Centrale exécutant l'application
03 ' Initialiser les variables globales
04 Dim frd As Recordset
05 Dim Fnct As Boolean

06 InitCodeCentraleTraitée = False

07 On Error Resume Next
08 Err.Clear
09 Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)
10 If Err <> 0 Then
11 MsgBox "Impossible de trouver la table 'Centrales'. L'attache de
table est certainement incorrecte." & Chr$(10) & Chr$(13) &
Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
12 DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
acWindowNormal
13 GoTo InitCodeCentraleTraitée_Fin
14 End If

15 On Error GoTo 0

16 If frd.BOF Then
17 CodeCentraleTraitée = 0 'Non défini
18 MsgBox "Le Code Centrale Traitée n'est pas défini." & Chr$(10) &
Chr$(13) & "Veuillez modifier ce paramètre dans la table
'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
19 GoTo InitCodeCentraleTraitée_Fin
20 End If

21 Fnct = InitVariablesGlobales()

22 InitCodeCentraleTraitée = True
23 CodeCentraleTraitée = frd.Fields("Code_centrale")

24 InitCodeCentraleTraitée_Fin:
25 frd.Close
26 Set frd = Nothing
27 End Function


Mon problème se situe en ligne 09.
La variable frd est bien initialisée, je l'ai vérifié par des ?
frd.fields(1).value dans la fenêtre Exécution de VBA.
Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
With non définie!!!!

Si je place un point d'arrêt sur la ligne 09, exécutant le Set, et que
je continue en pas à pas, je n'obtiens pas l'erreur!
Si je place mon point d'arrêt sur la ligne 10, soit après l'exécution
du Set, j'obtiens l'erreur.

Un Debug.Print Err.Number, Err.Description juste avant le Set donne
comme résultat "0".
C'est donc bien le Set qui déclenche l'erreur, mais il ne plante pas.

J'ai un comportement similaire dans Excel.
Je me suis tourné vers nos amis Excelliens mais je n'ai pas obtenu de
réponse expliquant le problème.

On Error Resume Next
For intL = 3 To 15 Step 3
Err.Clear
.Cells(RngFind.Row, 33 + intL) = CDbl(Me.Controls ("TbxProPvc1" &
Format(CStr(intL), "00"))) <<--- Génère l'erreur
If Err.Number <> 0 Then
MsgBox "Donnée incorrecte.", vbExclamation + vbOKOnly,
ETPP_NomApplication
Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
GoTo Restituer_Fin
End If
Next intL

L'interception d'erreur n'est la que au cas où!
En effet, sans le On Error Resume Next, le code se déroule sans
problème, du fait que je réalise le maximum de vérification en amont.
Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
n'appartient pas à la sélection.

Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
un code erreur?

Si vous avez des idées je suis preneur.

D'avance merci et bon code.

Cordialement.
Avatar
Argyronet
Bonjour,

1/ Quels code d'erreur obtenez-vous ?
Voir point 2 et adaptez en conséquence

2/ Je vous suggère de ne pas utiliser le :
On Error Resume Next
Il est mal exploité ici et une vrai gestion d'erreur avec un On Error Goto...
serait mieux approprié et permettrait d'avoir un autre comportement :

Const MODE_DEBUG = True
Dim frd As DAO.Recordset
Dim DB As DAO.Database
On Error Goto ErrHandler
Set DB = CurrentDB
Set frd = DB.OpenRecordset(...
....
....
frd.Close
DB.Close
ExitHandler :
If MODE_DEBUG Then
Stop 'S'arrête ici pour vérifie pourquoi...
Else
Exit Sub
End If
set frd = Nothing
set DB = Nothing
ErrHandler :
MsgBox Err.Description, 48, Err.Number
Resume ExitHandler

3/ En complément des vérifications, s'assurer que vous avec bien DAO 3.6 et
seulement DAO 3.6 non couplé avec un ADO X.X (object library)

--
Argy
http://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN 2742982442)
VBA pour Office 2007 (ISBN 2742983910)



"ElXav" wrote:

Bonjour la Communauté,

Migré depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
soucis avec mes applis Access et Excel.
Celles-ci fonctionnent trés bien sous XP, mais sous 2007, j'obtiens
des codes erreur dans l'objet Err, alors que le code ne se plante pas
même en désactivant le contrôle d'erreur!!


Or donc, le code listé ci-dessous est là pour:
- Créer un RecordSet basé sur le contenu d'une table attachée
contenant un seul enregistrement.
Cette table attachée peut ne plus être valide, ce qui est normal
dans le cadre de l'exploitation de cette base.
Donc
- Si la création du RecordSet génère une erreur, il est probable que
la table attachée ne soit plus valide (lien rompu), dans ce cas,
j'alerte l'utilisateur et le dirige vers un formulaire permettant de
rétablir tous les liens de la base de données
- Si la création du RecordSet ne génère pas d'erreur, je traite
l'enregistrement.


D'où le code suivant.


01 Function InitCodeCentraleTraitée() As Boolean
02 ' Initialiser le Code Centrale exécutant l'application
03 ' Initialiser les variables globales
04 Dim frd As Recordset
05 Dim Fnct As Boolean

06 InitCodeCentraleTraitée = False

07 On Error Resume Next
08 Err.Clear
09 Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)
10 If Err <> 0 Then
11 MsgBox "Impossible de trouver la table 'Centrales'. L'attache de
table est certainement incorrecte." & Chr$(10) & Chr$(13) &
Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
12 DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
acWindowNormal
13 GoTo InitCodeCentraleTraitée_Fin
14 End If

15 On Error GoTo 0

16 If frd.BOF Then
17 CodeCentraleTraitée = 0 'Non défini
18 MsgBox "Le Code Centrale Traitée n'est pas défini." & Chr$(10) &
Chr$(13) & "Veuillez modifier ce paramètre dans la table
'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
19 GoTo InitCodeCentraleTraitée_Fin
20 End If

21 Fnct = InitVariablesGlobales()

22 InitCodeCentraleTraitée = True
23 CodeCentraleTraitée = frd.Fields("Code_centrale")

24 InitCodeCentraleTraitée_Fin:
25 frd.Close
26 Set frd = Nothing
27 End Function


Mon problème se situe en ligne 09.
La variable frd est bien initialisée, je l'ai vérifié par des ?
frd.fields(1).value dans la fenêtre Exécution de VBA.
Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
With non définie!!!!

Si je place un point d'arrêt sur la ligne 09, exécutant le Set, et que
je continue en pas à pas, je n'obtiens pas l'erreur!
Si je place mon point d'arrêt sur la ligne 10, soit après l'exécution
du Set, j'obtiens l'erreur.

Un Debug.Print Err.Number, Err.Description juste avant le Set donne
comme résultat "0".
C'est donc bien le Set qui déclenche l'erreur, mais il ne plante pas.

J'ai un comportement similaire dans Excel.
Je me suis tourné vers nos amis Excelliens mais je n'ai pas obtenu de
réponse expliquant le problème.

On Error Resume Next
For intL = 3 To 15 Step 3
Err.Clear
.Cells(RngFind.Row, 33 + intL) = CDbl(Me.Controls ("TbxProPvc1" &
Format(CStr(intL), "00"))) <<--- Génère l'erreur
If Err.Number <> 0 Then
MsgBox "Donnée incorrecte.", vbExclamation + vbOKOnly,
ETPP_NomApplication
Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
GoTo Restituer_Fin
End If
Next intL

L'interception d'erreur n'est la que au cas où!
En effet, sans le On Error Resume Next, le code se déroule sans
problème, du fait que je réalise le maximum de vérification en amont.
Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
n'appartient pas à la sélection.

Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
un code erreur?

Si vous avez des idées je suis preneur.

D'avance merci et bon code.

Cordialement.
.

Avatar
Sylvain Lafontaine
Autre suggestion: essayez de remplacer « Dim frd as Recordset » par « Dim
frd as DAO.Recordset ».

Si cela ne fonctionne toujours pas, remplacez dbOpenSnapshot par
dbOpenDynaset.

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web: http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.


"ElXav" wrote in message
news:
Bonjour la Communauté,

Migré depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
soucis avec mes applis Access et Excel.
Celles-ci fonctionnent trés bien sous XP, mais sous 2007, j'obtiens
des codes erreur dans l'objet Err, alors que le code ne se plante pas
même en désactivant le contrôle d'erreur!!


Or donc, le code listé ci-dessous est là pour:
- Créer un RecordSet basé sur le contenu d'une table attachée
contenant un seul enregistrement.
Cette table attachée peut ne plus être valide, ce qui est normal
dans le cadre de l'exploitation de cette base.
Donc
- Si la création du RecordSet génère une erreur, il est probable que
la table attachée ne soit plus valide (lien rompu), dans ce cas,
j'alerte l'utilisateur et le dirige vers un formulaire permettant de
rétablir tous les liens de la base de données
- Si la création du RecordSet ne génère pas d'erreur, je traite
l'enregistrement.


D'où le code suivant.


01 Function InitCodeCentraleTraitée() As Boolean
02 ' Initialiser le Code Centrale exécutant l'application
03 ' Initialiser les variables globales
04 Dim frd As Recordset
05 Dim Fnct As Boolean

06 InitCodeCentraleTraitée = False

07 On Error Resume Next
08 Err.Clear
09 Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)
10 If Err <> 0 Then
11 MsgBox "Impossible de trouver la table 'Centrales'. L'attache de
table est certainement incorrecte." & Chr$(10) & Chr$(13) &
Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
12 DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
acWindowNormal
13 GoTo InitCodeCentraleTraitée_Fin
14 End If

15 On Error GoTo 0

16 If frd.BOF Then
17 CodeCentraleTraitée = 0 'Non défini
18 MsgBox "Le Code Centrale Traitée n'est pas défini." & Chr$(10) &
Chr$(13) & "Veuillez modifier ce paramètre dans la table
'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
19 GoTo InitCodeCentraleTraitée_Fin
20 End If

21 Fnct = InitVariablesGlobales()

22 InitCodeCentraleTraitée = True
23 CodeCentraleTraitée = frd.Fields("Code_centrale")

24 InitCodeCentraleTraitée_Fin:
25 frd.Close
26 Set frd = Nothing
27 End Function


Mon problème se situe en ligne 09.
La variable frd est bien initialisée, je l'ai vérifié par des ?
frd.fields(1).value dans la fenêtre Exécution de VBA.
Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
With non définie!!!!

Si je place un point d'arrêt sur la ligne 09, exécutant le Set, et que
je continue en pas à pas, je n'obtiens pas l'erreur!
Si je place mon point d'arrêt sur la ligne 10, soit après l'exécution
du Set, j'obtiens l'erreur.

Un Debug.Print Err.Number, Err.Description juste avant le Set donne
comme résultat "0".
C'est donc bien le Set qui déclenche l'erreur, mais il ne plante pas.

J'ai un comportement similaire dans Excel.
Je me suis tourné vers nos amis Excelliens mais je n'ai pas obtenu de
réponse expliquant le problème.

On Error Resume Next
For intL = 3 To 15 Step 3
Err.Clear
.Cells(RngFind.Row, 33 + intL) = CDbl(Me.Controls ("TbxProPvc1" &
Format(CStr(intL), "00"))) <<--- Génère l'erreur
If Err.Number <> 0 Then
MsgBox "Donnée incorrecte.", vbExclamation + vbOKOnly,
ETPP_NomApplication
Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
GoTo Restituer_Fin
End If
Next intL

L'interception d'erreur n'est la que au cas où!
En effet, sans le On Error Resume Next, le code se déroule sans
problème, du fait que je réalise le maximum de vérification en amont.
Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
n'appartient pas à la sélection.

Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
un code erreur?

Si vous avez des idées je suis preneur.

D'avance merci et bon code.

Cordialement.
Avatar
ElXav
Bonjour Sylvain,

Je viens de faire l'essai suivant:
- Décompiler ma base sous XP
- L'ouvrir dans Access 2007, puis l'enregistrer au format 2007 sous
un autre nom
- Ouvrir la nouvelle base sous 2007 => erreur de compilation sur les
objet DAO (normal)
- J'ajoute DAO3.6, et enlève la référence à ADO 2007

J'ai donc les Ref suivantes:
* Visual Basic for Application
* Microsoft Access 12.0 Object Library
* Microsoft DAO 3.6 Object Library
* OLE Automation
* Microsoft ActiveX Data Objetcts 2.1 Library
* Microsoft Windows Common Controls 6.0 (SP6)
* Visual Basic for Applicationx Extensibility 5.3


- Je compile
ET même problème.

Complément d'info: si je place un "Stop" dans le Form_Activate du
formulaire à l'origine de l'appel de ma fonction
InitCodeCentraleTraitée, et que je laisse filer le code en appuyant
sur "F5', je n'ai pas d'erreur.
D'où, l'essai consistant à placer un DoEvents à la place du Stop,
susceptible de laisser le système terminer des choses... Et plus
d'erreur!!

Le code initial:

Private Sub Form_Activate()
'Réinitialisation de l'environnement
Dim Fnct As Boolean

If InitCodeCentraleTraitée() Then <<<*** Appel de la
fonction ici
Me.TbxNomCentraleTraitée.Requery
Call InitTitreEcranFrancCibleEuro(Me)
End If
End Sub


Le code modifié où je n'ai plus l'erreur:

Private Sub Form_Activate()
'Réinitialisation de l'environnement
Dim Fnct As Boolean

DoEvents
If InitCodeCentraleTraitée() Then <<<*** Appel de la
fonction ici
Me.TbxNomCentraleTraitée.Requery
Call InitTitreEcranFrancCibleEuro(Me)
End If
End Sub

Et comme je le disais dans mon post initial, l'exécution des 2
instructions

08 Err.Clear
09 Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)

Aboutit à ce que l'objet Err passe en code erreur 91 alors que le
recordset "frd" est bien initialisé!!
Vraiment étrange...

Je n'ai pas essayé la déclaration du recordset avec le préfixage DAO
comme conseillé.
Il est vrai qu'il faudrait toujours qualifier entièrement les
propriétés, méthodes, fonctions et types de donnée.

Merci tout de même pour les conseils.
Cordialement.
Xavier.


On 8 avr, 17:49, "Sylvain Lafontaine"
wrote:
Possiblement un problème de compilation ou de référence.  Vérif iez la liste
de vos références mais d'abord, prenez soin de décompiler au comple t votre
fichier MDB ou ACCDB lorsque vous le transférez d'Access 2000 vers 2007 :
changer la liste des références en ajoutant une référence bidon/i nutile
(vous pouvez l'enlever plus tard) ce qui va forcer Access à recompiler tous
les modules ou créer un shortcut avec les options suivantes et utilisez -le
pour décompiler votre fichier:

/decompile /compact /repair

--
Sylvain Lafontaine, ing.
MVP pour « Windows Live Platform »
Blogue/site web:http://paparazzi-codeur.sylvainlafontaine.com
Consultant indépendant et programmation à distance pour Access et
SQL-Server.

"ElXav" wrote in message

news:
Bonjour la Communauté,

Migré depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
soucis avec mes applis Access et Excel.
Celles-ci fonctionnent trés bien sous XP, mais sous 2007, j'obtiens
des codes erreur dans l'objet Err, alors que le code ne se plante pas
même en désactivant le contrôle d'erreur!!

Or donc, le code listé ci-dessous est là pour:
  - Créer un RecordSet basé sur le contenu d'une table attachée
contenant un seul enregistrement.
    Cette table attachée peut ne plus être valide, ce qui est nor mal
dans le cadre de l'exploitation de cette base.
Donc
  - Si la création du RecordSet génère une erreur, il est probabl e que
la table attachée ne soit plus valide (lien rompu), dans ce cas,
j'alerte l'utilisateur et le dirige vers un formulaire permettant de
rétablir tous les liens de la base de données
  - Si la création du RecordSet ne génère pas d'erreur, je traite
l'enregistrement.

D'où le code suivant.

01 Function InitCodeCentraleTraitée() As Boolean
02 ' Initialiser le Code Centrale exécutant l'application
03 ' Initialiser les variables globales
04  Dim frd     As Recordset
05  Dim Fnct    As Boolean

06  InitCodeCentraleTraitée = False

07  On Error Resume Next
08  Err.Clear
09  Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)
10  If Err <> 0 Then
11    MsgBox "Impossible de trouver la table 'Centrales'. L'attache d e
table est certainement incorrecte." & Chr$(10) & Chr$(13) &
Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
12    DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
acWindowNormal
13    GoTo InitCodeCentraleTraitée_Fin
14  End If

15  On Error GoTo 0

16  If frd.BOF Then
17    CodeCentraleTraitée = 0     'Non défini
18    MsgBox "Le Code Centrale Traitée n'est pas défini." & Chr$( 10) &
Chr$(13) & "Veuillez modifier ce paramètre dans la table
'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
19    GoTo InitCodeCentraleTraitée_Fin
20  End If

21  Fnct = InitVariablesGlobales()

22  InitCodeCentraleTraitée = True
23  CodeCentraleTraitée = frd.Fields("Code_centrale")

24 InitCodeCentraleTraitée_Fin:
25  frd.Close
26  Set frd = Nothing
27 End Function

Mon problème se situe en ligne 09.
La variable frd est bien initialisée, je l'ai vérifié par des ?
frd.fields(1).value dans la fenêtre Exécution de VBA.
Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
With non définie!!!!

Si je place un point d'arrêt sur la ligne 09, exécutant le Set, et qu e
je continue en pas à pas, je n'obtiens pas l'erreur!
Si je place mon point d'arrêt sur la ligne 10, soit après l'exécuti on
du Set, j'obtiens l'erreur.

Un Debug.Print Err.Number, Err.Description juste avant le Set donne
comme résultat "0".
C'est donc bien le Set qui déclenche l'erreur, mais il ne plante pas.

J'ai un comportement similaire dans Excel.
Je me suis tourné vers nos amis Excelliens mais je n'ai pas obtenu de
réponse expliquant le problème.

 On Error Resume Next
 For intL = 3 To 15 Step 3
   Err.Clear
   .Cells(RngFind.Row, 33 + intL) = CDbl(Me.Controls ("TbxProPvc1" &
Format(CStr(intL), "00")))  <<--- Génère l'erreur
   If Err.Number <> 0 Then
     MsgBox "Donnée incorrecte.", vbExclamation + vbOKOnly,
ETPP_NomApplication
     Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
     GoTo Restituer_Fin
   End If
 Next intL

L'interception d'erreur n'est la que au cas où!
En effet, sans le On Error Resume Next, le code se déroule sans
problème, du fait que je réalise le maximum de vérification en amon t.
Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
n'appartient pas à la sélection.

Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
un code erreur?

Si vous avez des idées je suis preneur.

D'avance merci et bon code.

Cordialement.
Avatar
ElXav
Bonjour Argy,

1/ Quels code d'erreur obtenez-vous ?


91 - Variable objet ou variable de bloc With non définie!!!! (comme
indiqué dans mon post initial).

2/ Je vous suggère de ne pas utiliser le :
On Error Resume Next
Il est mal exploité ici et une vrai gestion d'erreur avec un On Error G oto...
serait mieux approprié et permettrait d'avoir un autre comportement :


En quoi le On Error Resume Next est mal exploité?
Je suis preneur de tout critique, afin de corriger ma façon de coder.

J'utilise souvent ce principe, lorsque quelque soit l'erreur, je dois
me débrancher des traitements en cours.
Le On Error Goto aboutirait au même fonctionnement non?

Exemple tel que je code:

Function MaProc() as Boolean
...
MaProc = False ' Erreur pendant l'exécution de la fonction

On Error Resume Next
Err.Clear
Ici Instruction suceptible de planter, ne permettant pas une
reprise, le On Error Resume Next évite le plantage, et on contrôle
Err.Number juste après
If Err.Number <> 0 Then Si plantage sur instruction
précédente, Err.Number n'est plus à 0
MsgBox....
Goto MaProcExit
End If

Suite du code si Ok

MaProc = True ' Tout est OK

MaProcExit:
Ici, code pour fermer les objets et libérer la mémoire (des Close et
des Set ... Nothing)

End Function

Exemple que vous proposez

Function MaProc() as Boolean
...
MaProc = True ' Tout est Ok

On Error Goto MaProcErr
Err.Clear
Ici Instruction suceptible de planter, ne permettant pas une reprise

Suite du code si Ok

MaProcExit:
Ici, code pour fermer les oblets et libérer la mémoire (des Close et
des Set ... Nothing)
Exit Function

MaProcExit:
If Err.Number <> 0 Then Si plantage sur instruction
précédente, Err.Number n'est plus à 0
MsgBox....
MaProc = False
Resume MaProcExit
End If

End Function

L'inconvénient du Goto HandleError, c'est que lorsque l'on arrive dans
cette gestion des erreurs, on ne sait pas d'où l'on vient, à moins de
gérer une variable interne indiquant les différentes étapes en cours.
Chose que j'ai déjà mis en oeuvre.

La discussion reste ouvert ;-)


3/ En complément des vérifications, s'assurer que vous avec bien DAO 3.6 et
seulement DAO 3.6 non couplé avec un ADO X.X (object library)


C'est vérifié, suite aux premiers conseils de Sylvain.
Je n'active jamais DAO et ADO en même temps, ne développant que sous
DAO actuellement.

Comme indiqué dans ma réponse à Sylvain, j'ai contourné mon probl ème
(DoEvents), mais je n'arrive pas à comprendre pourquoi, dans un
certain contexte d'exécution j'ai:

'Reset de l'objet Err
Err.Clear
'Tentative d'accés à la table Centrales (table attachée dont le lien
peux être rompu)
Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHERE
[Centrale traitée] = True", dbOpenSnapshot)
Debug.Print Err.Number & ' * ' & Err.Description & "*"
Debug.Print frd.Fields(2).Name, frd.Fields(2).Value

Résultat dans la fenêtre Exécution
91*Variable objet ou variable de bloc >With non définie*
Centrale traitée Vrai

Curieux non?

Cordialement.
Xavier.


On 8 avr, 22:35, Argyronet
wrote:
Bonjour,

1/ Quels code d'erreur obtenez-vous ?
Voir point 2 et adaptez en conséquence

2/ Je vous suggère de ne pas utiliser le :
On Error Resume Next
Il est mal exploité ici et une vrai gestion d'erreur avec un On Error G oto...
serait mieux approprié et permettrait d'avoir un autre comportement :

Const MODE_DEBUG = True
Dim frd As DAO.Recordset
Dim DB As DAO.Database
    On Error Goto ErrHandler
    Set DB = CurrentDB
    Set frd = DB.OpenRecordset(...
....
....
    frd.Close
    DB.Close
ExitHandler :
    If MODE_DEBUG  Then
        Stop 'S'arrête ici pour vérifie pourquoi...
    Else
        Exit Sub
    End If
    set frd = Nothing
    set DB = Nothing
ErrHandler :
    MsgBox Err.Description, 48, Err.Number
    Resume ExitHandler

3/ En complément des vérifications, s'assurer que vous avec bien DAO 3.6 et
seulement DAO 3.6 non couplé avec un ADO X.X (object library)

--
Argyhttp://argyronet.developpez.com/
Créez des programmes avec Microsoft Access 2007 (ISBN 2742982442)
VBA pour Office 2007 (ISBN 2742983910)



"ElXav" wrote:
> Bonjour la Communauté,

> Migré depuis peu de Office XP vers Office 2007 SP2, j'ai quelques
> soucis avec mes applis Access et Excel.
> Celles-ci fonctionnent trés bien sous XP, mais sous 2007, j'obtiens
> des codes erreur dans l'objet Err, alors que le code ne se plante pas
> même en désactivant le contrôle d'erreur!!

> Or donc, le code listé ci-dessous est là pour:
>   - Créer un RecordSet basé sur le contenu d'une table attachée
> contenant un seul enregistrement.
>     Cette table attachée peut ne plus être valide, ce qui est n ormal
> dans le cadre de l'exploitation de cette base.
> Donc
>   - Si la création du RecordSet génère une erreur, il est proba ble que
> la table attachée ne soit plus valide (lien rompu), dans ce cas,
> j'alerte l'utilisateur et le dirige vers un formulaire permettant de
> rétablir tous les liens de la base de données
>   - Si la création du RecordSet ne génère pas d'erreur, je trai te
> l'enregistrement.

> D'où le code suivant.

> 01 Function InitCodeCentraleTraitée() As Boolean
> 02 ' Initialiser le Code Centrale exécutant l'application
> 03 ' Initialiser les variables globales
> 04  Dim frd     As Recordset
> 05  Dim Fnct    As Boolean

> 06  InitCodeCentraleTraitée = False

> 07  On Error Resume Next
> 08  Err.Clear
> 09  Set frd = CurrentDb.OpenRecordset("SELECT * FROM Centrales WHER E
> [Centrale traitée] = True", dbOpenSnapshot)
> 10  If Err <> 0 Then
> 11    MsgBox "Impossible de trouver la table 'Centrales'. L'attache de
> table est certainement incorrecte." & Chr$(10) & Chr$(13) &
> Err.Description, vbCritical + vbOKOnly, SMT_NOMAPPLICATION
> 12    DoCmd.OpenForm "Menu Attacher Tables", acNormal, , , ,
> acWindowNormal
> 13    GoTo InitCodeCentraleTraitée_Fin
> 14  End If

> 15  On Error GoTo 0

> 16  If frd.BOF Then
> 17    CodeCentraleTraitée = 0     'Non défini
> 18    MsgBox "Le Code Centrale Traitée n'est pas défini." & Chr $(10) &
> Chr$(13) & "Veuillez modifier ce paramètre dans la table
> 'Centrales'.", vbCritical + vbOKOnly, SMT_NOMAPPLICATION
> 19    GoTo InitCodeCentraleTraitée_Fin
> 20  End If

> 21  Fnct = InitVariablesGlobales()

> 22  InitCodeCentraleTraitée = True
> 23  CodeCentraleTraitée = frd.Fields("Code_centrale")

> 24 InitCodeCentraleTraitée_Fin:
> 25  frd.Close
> 26  Set frd = Nothing
> 27 End Function

> Mon problème se situe en ligne 09.
> La variable frd est bien initialisée, je l'ai vérifié par des ?
> frd.fields(1).value dans la fenêtre Exécution de VBA.
> Or l'objet Err prend la valeur 91 - Variable objet ou variable de bloc
> With non définie!!!!

> Si je place un point d'arrêt sur la ligne 09, exécutant le Set, et que
> je continue en pas à pas, je n'obtiens pas l'erreur!
> Si je place mon point d'arrêt sur la ligne 10, soit après l'exécu tion
> du Set, j'obtiens l'erreur.

> Un Debug.Print Err.Number, Err.Description juste avant le Set donne
> comme résultat "0".
> C'est donc bien le Set qui déclenche l'erreur, mais il ne plante pas.

> J'ai un comportement similaire dans Excel.
> Je me suis tourné vers nos amis Excelliens mais je n'ai pas obtenu de
> réponse expliquant le problème.

>  On Error Resume Next
>  For intL = 3 To 15 Step 3
>    Err.Clear
>    .Cells(RngFind.Row, 33 + intL) = CDbl(Me.Controls ("TbxProPvc1 " &
> Format(CStr(intL), "00")))  <<--- Génère l'erreur
>    If Err.Number <> 0 Then
>      MsgBox "Donnée incorrecte.", vbExclamation + vbOKOnly,
> ETPP_NomApplication
>      Me.Controls("TbxProPvc1" & Format(CStr(intL),"00")).SetFocus
>      GoTo Restituer_Fin
>    End If
>  Next intL

> L'interception d'erreur n'est la que au cas où!
> En effet, sans le On Error Resume Next, le code se déroule sans
> problème, du fait que je réalise le maximum de vérification en am ont.
> Pas de plantage et cependant, l'objet Err prend la valeur 9 - L'indice
> n'appartient pas à la sélection.

> Ma question: Pourquoi le code ne plante alors que l'objet Err restitue
> un code erreur?

> Si vous avez des idées je suis preneur.

> D'avance merci et bon code.

> Cordialement.
> .- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -
Avatar
ElXav
Bingo comme disent certains.
J'ai trouvé.

En ré-analysant plus précisément l'enchainement des traitements, j'ai
de nouveau confirmation qu'en mode pas à pas, certains évènements ne
sont pas tracés, on n'y saute pas... Totalement transparent... Super
simple pour pister des anomalies.
Je l'avais constaté sous XP, et même jusqu'à l'ordre des évènemen ts
qui n'était pas identique en debug et en exécution normale.

Or donc, voici le cheminement:
Ouverture Form1 (qui est un menu principal)
Form_Activate
Appel à ma fonction InitCodeCentraleTraitée() dans laquelle
j'ai mon problème et retour Ok

Clique sur un bouton pour ouvrir Form2
Form2_OnLoad
Call Routine1

Dans Routine1
Set FrmAttenteTrait (Variable public déclaré dans un module) = New
Form_AttenteTraitements
et plus loin mais conditionné par certains paramètres
Set Frd = ... Initialisation d'un recordset. Cette ligne à ce
moment là n'est pas exécutée. Frd est donc non initialisé.

Clique sur un bouton pour fermer Form2 (par un Docmd.Close...)

Form_Close de Form2
Call Routine2

Dans Routine2
Set FrmAttenteTrait = Nothing ce qui provoque la fermeture du
formulaire AttenteTraitements

Dans Form_Close de AttenteTraitements
On Error Resume Next
Frd.Close
Set Frd = Nothing

C'est ici que l'erreur 91 est généré si Frd n'est pas initialisé (d ans
le cas présent, c'est le cas).

Continuons....
Les formulaire AttenteTraitements et Form2 étant fermés, Form1 reçoit
le focus, et relance l'appel à ma fonction.
Jusque là rien d'anormal.

Ce qui est curieux, c'est que cette fameuse erreur déclenchant à la
fermeture de AttenteTraitements est sensée être effacée par Err.Clear
juste avant le Set dans ma fonction, laquelle fonction est appelée
lorsque mon formulaire principal reprend le focus, donc à ce stade,
les deux autres formulaires sont fermés, et leur code devrait être
terminé.

Je sais difficile à suivre. :-/

Ce peut-il que pendant l'exécution du code Form_Close de mon
formulaire AttenteTraitements soit encore en cours alors que mon
formulaire principal reçoit le focus et déclenche donc son propre
évènement Activate?

En tout cas, encore merci pour vos suggestions.

Cordialement.
Avatar
ElXav
Ooops.. Lire


Ce peut-il que l'exécution du code Form_Close de mon
formulaire AttenteTraitements soit encore en cours alors que mon
formulaire principal reçoit le focus et déclenche donc son propre
évènement Activate?

Merci.
Cordialement.