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
Configuration: Windows XP
Firefox 2.0.0.20

11 réponses

  1. 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
    1. 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
      1. 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
  2. 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
    1. 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
  3. 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
  4. 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
    1. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
    1. 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
  7. 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
    1. 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
  8. Utilisateur anonyme
     
    re:

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

    Lupin
    0
  9. 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
    1. 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
  10. 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
    1. Shifty62
       
      Ok lupin, j'attendrai ta réponse !

      Si tu as des questions n'hesite pas !!!
      0
  11. 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
  12. 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
    1. Shifty62
       
      Je te remercie beaucoup lupin ! Je vais étudier cela de pret ;)

      A bientot !

      Alex
      0