Problème code VBA sous access

Shifty62 -  
 nivek -
Bonjour,

Voila je suis actuellement en stage de développement informatique. Ma mission consiste a créer un logiciel sous access 2000 (eh oui ça arrive ^^) qui ferait de la relance client. J'ai déjà pas mal avancer dans mon projet mais la je suis bloqué...

Je vous explique : J'ai un formulaire relance client avec dedans tous mes sous formulaires répartis dans des onglets. Dans un onglet "facture", j'ai donc un sous-formulaire "facture" avec le code facture comme clé primaire et ses autres champs (date facture, montant...) et dans un autre onglet "gammes" j'ai un sous-formulaire "liste des actions" (de la gamme) avec également le code facture comme clé primaire et aussi d'autres champs (code action,date action...).
A savoir bien sur que mes 2 tables (facture et liste action) sont bien liées entre elles dans mon modèle relationnel via le code facture (1 facture peut avoir plusieurs actions possibles).

Ce que je veux faire : j'aimerai, grâce à un double clic sur le code facture que j'aurai taper moi même dans le sous-formulaire facture, insérer ce fameux code facture directement dans le sous-formulaire liste action. J'espère que je me suis fait comprendre XD

Ainsi j'ai donc créer une procédure événementielle pour taper le code sous VBA. Et c'est là que les ennuis commencent...

J'ai récupérer le code d'un collègue qui ne peut pas vraiment m'aider à dire comment il fonctionne ni comment l'adapter (vous savez, c'est un ami d'un ami d'un ami qui m'a refiler le code ;) ).
Je l'ai récupérer et "essayer" de l'adapter à mon formulaire, le voici :

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

Dim nom_facture As Integer
Dim NOMBRE As Integer

nom_facture = Me.Form.Recordset.Fields("Code_Facture").Value
[Form_Gestion Relance Client].CtlTab21.Value = 0
[Form_Gestion Relance Client].Recordset.MoveLast
NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

Dim Rs As DAO.Recordset
Set Rs = [Form_Gestion Relance Client].RecordsetClone

Rs.MoveFirst
For i = 1 To NOMBRE
If Rs.Fields("CODE_FACTURE").Value = nom_facture Then
GoTo valid
Else
Rs.MoveNext
End If
Next
valid:
[Form_Gestion Relance Client].Recordset.Absolute = i + 1
End sub

Je vous avouerai que je ne comprend pas la moitié, VB n'étant pas vraiment ma tasse de thé ^^
Après quelques manip' et résolutions d'erreurs, le code ne fonctionne toujours pas.
Mon problème est cette ligne qui ne veut pas s'exécuter :

[Form_Gestion Relance Client].Recordset.Absolute = i + 1 (c'est la dernière ligne du code)

Le message d'erreur est : propriété ou méthode non gérée par cette objet.
Ma petite idée sur cette erreur serait que ce code n'envoie pas sur le bon onglet et donc le bon formulaire.
Au cas où je vous met l'ordre des onglets : clients(avec 2 sous-formulaires) - factures(avec sous 1 formulaire) - gammes(avec 1 sous formulaire)

Voilà j'espère avoir été assez clair dans mon explication !!!
En vous remerciant d'avance pour vos réponses,

Alex
A voir également:

11 réponses

Utilisateur anonyme
 
Bonjour,

Non expert de VBA Access, et ne pouvant tester le code, voici tout de même un suggestion :

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer, NOMBRE As Integer
    Dim Rs As DAO.Recordset

    nom_facture = Me.Form.Recordset.Fields("Code_Facture").Value
    [Form_Gestion Relance Client].CtlTab21.Value = 0
    [Form_Gestion Relance Client].Recordset.MoveLast
    [Form_Gestion Relance Client].Recordset.MoveFirst
    NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

    Set Rs = [Form_Gestion Relance Client].RecordsetClone

    For i = 1 To NOMBRE
        If Rs.Fields("CODE_FACTURE").Value <> nom_facture Then
            Rs.MoveNext
        Else
            Exit For
        End If
    Next
    [Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1
    
End Sub
'

Lupin
0
Shifty62
 
Bonjour Lupin ! Merci pour ta réponse ;)

Donc j'ai essayer ton code et maintenant je n'ai plus le même problème ^^

Je t'explique Lupin :
Dès que je double clic sur un numéro de facture (n'importe lequel) il me renvoie sur l'onglet client (le 1er onglet) au lieu de me renvoyer sur l'onglet gamme (le 3e onglet). Je réessaye donc une 2e fois la même manip' et là il me renvoie un message d'erreur '3021' : "Aucun enregistrement en cours". Le message d'erreur ne survient que quand je clic une 2e fois sur le même code facture.

Dès lors, il me renvoie sur mon code (enfin le tient lupin ;) ) et il me montre que l'erreur se trouve dans cette ligne :

nom_facture = Me.Form.Recordset("CODE_FACTURE").Value (la 3e ligne)

Maintenant je suis à peu près sur que c'est un problème de position des onglets.
0
nivek > Shifty62
 
Salut Shifty, je suis actuellement en stage, et nous devons faire des relances clients, mon patron ma demander de voir si je pouver automatiser ces lettres, et la seul solution possible avec les logiciels de la boites est access, je voudrais donc savoir si tu a réussi a terminer ton logiciel, et si tu pourrais me conseiller.
0
Utilisateur anonyme
 
re:

Je pense que l'erreur vien du fait que tu nomme 2 fois l'objet !

nom_facture = Me.Form.Recordset("CODE_FACTURE").Value

Si tu utilise le mot clé [ Me ], c'est que tu veux adresser le
formulaire actif, donc après le [ Me ] il te faut adresser directement
un objet de la form (du formulaire).

L'instruction se lit donc :

nom_facture = Me.Recordset("CODE_FACTURE").Value

et je crois avoir inverser le test dans la boucle :

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer, NOMBRE As Integer
    Dim Rs As DAO.Recordset

    nom_facture = Me.Recordset.Fields("Code_Facture").Value
    [Form_Gestion Relance Client].CtlTab21.Value = 0
    [Form_Gestion Relance Client].Recordset.MoveLast
    [Form_Gestion Relance Client].Recordset.MoveFirst
    NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

    Set Rs = [Form_Gestion Relance Client].RecordsetClone

    For i = 1 To NOMBRE
        If Rs.Fields("CODE_FACTURE").Value = nom_facture Then
            Exit For
        Else
            Rs.MoveNext
        End If
    Next
    [Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1
    
End Sub
'



C'est comme si tu utilisait :

Me.[Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1

mauvaise syntaxe !

Lupin
0
Shifty62
 
Bonjour lupin !

J'ai changé l'expression et j'ai toujours la même erreur au niveau de cette ligne de code.

Ce que je trouve vraiment bizarre, c'est que lorsque je clic sur la facture en question, il me renvoie vers l'onglet "client" au lieu de "gamme" et après un 2e clic il m'envoie l'erreur...
0
Utilisateur anonyme
 
re:

nom_facture = Me.Form.Recordset.Fields("Code_Facture").Value

Donc la variable [ nom_facture ] devrait prendre la valeur du champs sur lequel
tu viens de double-cliquer.

essaie simplement :

nom_facture = Me.Value

Lupin
0
Utilisateur anonyme
 
re:

Ou, je n'ai pas accès à Access, mais de mémoire :

nom_facture = Me.CODE_FACRURE.Value

nom_facture = Me.CODE_FACRURE.Text

Lupin
0
Shifty62
 
Rebonjour lupin !!

J'ai donc retester le code et voila où il en ai :

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

Dim nom_facture As Integer, NOMBRE As Integer
Dim Rs As DAO.Recordset

nom_facture = Me.CODE_FACTURE.Value
[Form_Gestion Relance Client].CtlTab21.Value = 0
[Form_Gestion Relance Client].Recordset.MoveLast
[Form_Gestion Relance Client].Recordset.MoveFirst
NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

Set Rs = [Form_Gestion Relance Client].RecordsetClone

For i = 1 To NOMBRE
If Rs.Fields("CODE_FACTURE").Value = nom_facture Then
Exit For
Else
Rs.MoveNext
End If
Next
[Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1

End Sub
'

Donc maintenant quand je double clic sur le code facture, il me lance toujours sur le mauvais onglet (client) et c'est seulement après avoir cliqué plusieurs fois sur les différents codes facture qu'il m'envoie une erreur qui se trouve sur la ligne :

If Rs.Fields("CODE_FACTURE").Value = nom_facture Then

J'ai l'impression que petit à petit, on y arrive ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
re:

Alors voici une autre possibilité !

Il m'est difficile de coder sans voir la BD !!!

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer, NOMBRE As Integer

    nom_facture = Me.CODE_FACTURE.Value
    [Form_Gestion Relance Client].CtlTab21.Value = 0
    [Form_Gestion Relance Client].Recordset.MoveLast
    [Form_Gestion Relance Client].Recordset.MoveFirst
    NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

    For i = 1 To NOMBRE
        If Me.CODE_FACTURE.Value = nom_facture Then
            Exit For
        Else
            Me.Recordset.MoveNext
        End If
    Next
    If (i < NOMBRE) Then
        [Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1
    End If
    
End Sub
'


Lupin
0
Shifty62
 
Salut lupin !

Bon il semble maintenant qu'il ne me met aucune erreur quoique je fasse.
Le problème est toujours celui de l'onglet.

Peut être que le problème pourrait être au niveau du MoveFirst ou du MoveNext ???
0
Utilisateur anonyme
 
re:

Je ne crois pas, j'ai toujours du appliquer cette séquence pour obtenir le nombre d'enregistrement :
[Form_Gestion Relance Client].Recordset.MoveLast
[Form_Gestion Relance Client].Recordset.MoveFirst
NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount


Question :

Est-ce que le champs [ CODE_FACTURE ] est bien sur le formulaire [Form_Gestion Relance Client]?
Je ne crois pas selon tes dire :

<Citation>
Ce que je veux faire : j'aimerai, grâce à un double clic sur le code facture que j'aurai taper moi même dans le sous-formulaire facture, insérer ce fameux code facture directement dans le sous-formulaire liste action.
<Fin citation>



Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer, NOMBRE As Integer

    nom_facture = [Form_Facture].CODE_FACTURE.Value
    [Form_Gestion Relance Client].CtlTab21.Value = 0
    [Form_Gestion Relance Client].Recordset.MoveLast
    [Form_Gestion Relance Client].Recordset.MoveFirst
    NOMBRE = [Form_Gestion Relance Client].Recordset.RecordCount

    For i = 1 To NOMBRE
        If [Form_Gestion Relance Client].CODE_FACTURE.Value = nom_facture Then
            Exit For
        Else
            [Form_Gestion Relance Client].Recordset.MoveNext
        End If
    Next
    If (i < NOMBRE) Then
        [Form_Gestion Relance Client].Recordset.AbsolutePosition = i + 1
    End If
    
End Sub
'


n.b. si tu n'as pas de données confidentielles dans ta BD, place le fichier
Access sur [ ci-joint.fr ] ou [ ci-joint-com ], je pourrai ainsi voir directement
le problème.

Lupin
0
Shifty62
 
re lupin,

Bon j'ai décidé de t'envoyer ma BDD pour que tu ais vraiment le problème devant les yeux. Attention c'est une version Access 2000 !!

http://www.cijoint.fr/cjlink.php?file=cj200901/cijiVRNMID.zip

J'ai pris soin de supprimer les informations confidentielles donc rien n'est vrai dans la base ;)
0
Utilisateur anonyme
 
re:

voilà, j'ai pris le fichier, je regarde et te reviens la dessus :-)

Lupin
0
Utilisateur anonyme
 
re :

alors, si je comprends bien ce que tu tente de faire et je suis pas sur !

n'ayant pas suffassament de données pour obtenir le sous-formulaire facture !

Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer
    
    nom_facture = Val(Me.CODE_FACTURE.Value)
    [Form_Gestion Relance Client].CtlTab21.Pages("Clients").SetFocus
 
    With CodeContextObject
        DoCmd.GoToControl "MNEMO"
        DoCmd.FindRecord nom_facture, acEntire, False, , False, , True
        DoCmd.GoToControl "MNEMO"
    End With

    [Form_Gestion Relance Client].Recordset.MoveNext
    
End Sub
'


n.b. il n'y a aucune requete de créer dans ta base, tes formulaires me semblent pourtant
accrocher sur des requêtes codé en dur ! Il serait souhaitable de les accrocher sur des requêtes.


Lupin
0
Shifty62
 
Salut lupin !

Donc après avoir changer le code, j'ai toujours le même problème (décidément...).
Tu l'a tester le code toi ? il marche pour toi ?

Pour les requêtes si j'ai bien compris, il serait plus judicieux de les taper sous forme de code ?

Merci lupin pour l'aide que tu m'apportes ;)
0
Utilisateur anonyme
 
re:

non, je n'ai pas testé, je n'ai pas encore tout compris la mécanique,
probablement qu'il manque des données, car je n'accède pas au
sous-formulaire facture.

Je vais devoir scruter plus la BD, en attendant, regarde les requêtes
que j'ai fait dans ta BD !

http://membre.oricom.ca/lupin/util/relance.zip

Lupin
0
Shifty62
 
Ok lupin, j'attendrai ta réponse !

Si tu as des questions n'hesite pas !!!
0
Utilisateur anonyme
 
re :

voilà, j'ai avancé dans mes observations et c'est bien ce que je pensais,
l'utilisation d'onglets sous access rend certaines méthodes innaccessible.
J'ai déjà fait l'expérience sous VB et j'ai changé mes méthodes à cause
de cela.

comme :
    With CodeContextObject
        DoCmd.GoToControl "MNEMO"
        DoCmd.FindRecord nom_facture, acEntire, False, , False, , True
        DoCmd.GoToControl "MNEMO"
    End With


mais comme dit le proverbe, tous les chemins menent à Paris :-)

La solution est de contourner en lançant une routine déclarer dans [ Form_Client ].

Donc en résumé, si je comprends bien :

Un double clic sur le champ [ CODE_FACTURE ], doit capturer sa valeur,
rendre le focus au sous-formulaire [ Clients ] et trouver l'enregistrement
correspondant au code [ CODE_FACTURE ] récupéré dans une variable.

Première étape :
Aller sur le sous-formulaire [ Clients ], cibler le premier champs, ouvrir
la fenêtre des propriétés, choisir l'onglet évènement, choisir l'évènement
[ Sur clic ] , entrer dans la procédure événementiel.

Vous obtiendrai une routine du style [ Private LeChamps_Click() ]
Vous devriez à ce moment être dans le module [ Form_Clients ].

Remplacer le nom de la routine par :

[ Public ChercheCode(Byval Nom_Fact As String) ]


dans le routine :
Private Sub CODE_FACTURE_DblClick(Cancel As Integer)

    Dim nom_facture As Integer

    nom_facture = Val(Me.CODE_FACTURE.Value)
    [Form_Gestion Relance Client].CtlTab21.Pages("Clients").SetFocus

    Call ChercheCode (nom_facture)

End Sub
'


en gros ça ressemble à ça !

Ce soir je déposerai une version de votre BD avec ce code sur mon site !

Si vous réussissez à utiliser les requêtes, je pourrai aussi vous montrer
comment changer ces requêtes par programmation de façon à accélerer
les recherches.

Lupin
0
Utilisateur anonyme
 
re:

voilà, j'ai installer le code VBA dans la BD, et j'ai joint un tutoriel
(je ne connais pas tes connaissances de l'environnement, alors ... )
qui démontre que dans cette BD le formulaire [ Gestion Relance Client ]
est accroché sur une requête SQL. [ Requete_Form_Gestion_Relance_Client ]

En fait ce ne sont pas ces requêtes globales que je modifie mais les requêtes qui vont
cherché directement un enregistrement souhaité, c'est exactement ce que tu cherche
à faire mais c'est plus puissant.

Alors, examine bien le requête [ Requete_Form_Gestion_Relance_Client ] en mode SQL !

C'est une chaine de caractères qu'il est simple de reconstituer par programmation :-)

Le fichier :

http://membre.oricom.ca/lupin/util/Relance2.zip

( n.b. le lien précédent est mort )
( et celui-ci aussi n'aura qu'une durée très limité).

Lupin
0
Shifty62
 
Je te remercie beaucoup lupin ! Je vais étudier cela de pret ;)

A bientot !

Alex
0