Erreur 3251 avec AbolutePosition [Résolu]

Signaler
Messages postés
116
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 septembre 2020
-
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
-
Bonjour,

Mon problème est simple à expliquer. Pour tester l'utilisation d'AbsolutePosition sur un RecordSet, je code le texte suivant :
Set tb = db.OpenRecordset("mots")
tb.MoveFirst
MsgBox tb.AbsolutePosition

Je reçois alors une erreur 3251 sur la commande Msgbox :



Pourquoi cette erreur et comment ne plus l'avoir ?

Merci de votre aide à venir

Notpa

6 réponses

Messages postés
116
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 septembre 2020
1
Ne cherchez pas. J'ai trouvé l'erreur. La table était initialement ouverte avec une instruction SQL (Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots") dans laquelle je récupérais la position d'un enreg. via AbsolutePosition, et la table était fernée (tb.Close). Là, ça marche. Mais plus loin dans le code je ré-ouvrais cette table de façon standard (Set tb = db.OpenRecordset("mots") et recherchais l'enreg. via AbsolutePosition. Et là, ça coince : c'est normal le dynaset créé n'est pas le même.

En ne fermant pas la table, tout fonctionne comme je le veux. Problème résolu.

Et tous mes vœux pour 2020 !

Notpa
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
Bonjour Notpa

Bientôt un an que tu es inscrit et un an que tu ne fais pas l’effort de rendre ton code facile/agréable à lire pour celui ou celle qui pourrait avoir envie de t’aider.
Je te rappelle que celui qui répond est bénévole, et que couleurs et indentations peuvent l’inciter un peu plus à regarder ton problème qu’un pavé tout gris.

Je te remets, une fois de plus le lien vers le petit tuto, des fois que...
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
116
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 septembre 2020
1
Désolé. Afin d'expliquer plus clairement la raison du problème dans le but d'aider ceux qui auraient éventuellement le même problème, je met une partie du code incriminé :

With frm_prim.grille
Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots")
If tb.RecordCount = 0 Then Exit Sub
tb.MoveFirst
r = 0
c = 0
.Clear
.Rows = 1
Do Until tb.EOF
If Trim(tb("mots")) = "" Then GoTo suivant:
If .Text = "" Then
.Col = 0
.Text = tb("mots")
.Text = Trim(.Text)
.Col = 1
.Text = tb.AbsolutePosition
.Rows = .Rows + 1
.Row = .Row + 1
End If
suivant:
tb.MoveNext
Loop
End With
tb.Close ' --> 1
....
Set tb = db.OpenRecordset("mots") ' --> 2
tb.AbsolutePosition = Val(grille.Text)
tb.Edit
tb("mots") = zone_modif
tb.Update
tb.Close ' --> 3


Le fait de fermer la table ( --> 1 ) et de la ré-ouvrir en mode standard (--> 2), le dynaset n'est plus le même, d'où l'erreur. En supprimant des point 1, 2 et 3, le problème n'existe plus.

Voilà. J'ai pris note de tes remarques, et tous mes vœux 2020 !
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
Regarde ceci
With frm_prim.grille
Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots")
If tb.RecordCount = 0 Then Exit Sub
tb.MoveFirst
r = 0
c = 0
.Clear
.Rows = 1
Do Until tb.EOF
    If Trim(tb("mots")) = "" Then GoTo suivant:
    If .Text = "" Then
        .Col = 0
        .Text = tb("mots")
        .Text = Trim(.Text)
        .Col = 1
        .Text = tb.AbsolutePosition
        .Rows = .Rows + 1
        .Row = .Row + 1
    End If
suivant:
    tb.MoveNext
Loop
End With
tb.Close           '  --> 1
.... 
Set tb = db.OpenRecordset("mots")                  '  --> 2
    tb.AbsolutePosition = Val(grille.Text)
    tb.Edit
    tb("mots") = zone_modif
    tb.Update
    tb.Close                    '  --> 3

Et compare avec ton message.
Dans ma « version » il y a de la couleur, les numéros de lignes, un ascenseur vertical (et horizontal quand c’est nécessaire).
C’est expliqué dans le petit tuto que je t’ai mis en lien comment afficher de cette façon.
Messages postés
116
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
28 septembre 2020
1
OK. J'avais sélectionné Code (<>) mais pas Basic (▼). C'est fait :

With frm_prim.grille
Set tb = db.OpenRecordset("SELECT * FROM mots ORDER BY mots")
If tb.RecordCount = 0 Then Exit Sub
tb.MoveFirst
r = 0
c = 0
.Clear
.Rows = 1
Do Until tb.EOF
    If Trim(tb("mots")) = "" Then GoTo suivant:
    If .Text = "" Then
        .Col = 0
        .Text = tb("mots")
        .Text = Trim(.Text)
        .Col = 1
        .Text = tb.AbsolutePosition
        .Rows = .Rows + 1
        .Row = .Row + 1
    End If
suivant:
    tb.MoveNext
Loop
End With
tb.Close           '  --> 1
.... 
Set tb = db.OpenRecordset("mots")                  '  --> 2
    tb.AbsolutePosition = Val(grille.Text)
    tb.Edit
    tb("mots") = zone_modif
    tb.Update
    tb.Close                    '  --> 3


Bon dimanche

Notpa
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
Bon dimanche et bonne année 2020