IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Garder des données après fermeture de formulaire -> Table temporaire


Sujet :

VBA Access

  1. #1
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut Garder des données après fermeture de formulaire -> Table temporaire
    bonjour à tous

    Lors de l'exécution de mon code j'ai un petit message d'erreure :
    "erreure d'éxécution 91
    variable objet ou variable de bloc with non définie"

    J'ai regardé les postes traitant ce genre d'érreure, pas de chance pour moi cette erreure survient pour différent types de problèmes qui peuvent être bien différent les uns les autres, du moin d'après ce que j'ai compris.

    Contexte :

    Je stock dans des variables les valeures de liste déroulantes, de bouton "coche" et de bouton "option" lors de la fermeture du formulaire (ouverture d'un suivant en meme temps) afin de pouvoir les réutiliser sur le formulaire suivant ayant remarqué que une fois le premier fermé je ne peux récupère que des valeures nulles si je les appelles diréctement sur le second.

    A ma connaissance et c'est ce qui m'intérroge le plus, je n'ai pas de variable objet et je n'utilise pas de bloc with, donc de là ça part mal pour le debbugage. Je veux pas trop m'avancer mais à force de lire et de relire mon code je ne pense pas qu'il s'agisse d'une erreure d'algorithmes, je penche plus sur une erreure de syntaxe, j'arrive pas à trouver laquelle par contre.

    La ligne en rouge est celle qui est indiquée comme portant l'erreure d'après VBA. Merci d'avance pour toute aide qui me serait apportée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    Type document
            code_document As Integer
            nom_document As String
        End Type
    
     Private Sub b_p_envoi_new_suite_Click()
        Dim n As Integer
        Dim t As Integer
        Dim option_salle As Integer
        Dim option_mairie As Integer
        Dim option_agence As Integer
        Dim option_centre_commerciaux As Integer
        Dim option_comite_entreprise As Integer
        Dim option_divers As Integer
        Dim document As document
            
        n = Forms![envoi_new]![liste_document_select].ListCount
        For t = 1 To n
            document(t).code_document = Forms![envoi_new]![liste_document_select].Column(t - 1, 0)
            document(t).nom_document = Forms![envoi_new]![liste_document_select].Column(t - 1, 1)
        Next t
        
        option_salle = Forms![envoi_new]![option_salle]
        option_mairie = Forms![envoi_new]![option_mairie]
        option_agence = Forms![envoi_new]![option_agence]
        option_centre_commerciaux = Forms![envoi_new]![option_centre_commerciaux]
        option_comite_entreprise = Forms![envoi_new]![option_comite_entreprise]
        option_divers = Forms![envoi_new]![option_divers]
        
        For t = 1 To n
            MsgBox (document(t).code_document)
            MsgBox (document(t).code_document)
        Next t
        MsgBox (option_salle)
        MsgBox (option_mairie)
        MsgBox (option_agence)
        MsgBox (option_centre_commerciaux)
        MsgBox (option_comite_entreprise)
        MsgBox (option_divers)
    
    DoCmd.Close acForm, "envoi_new"
    On Error GoTo Err_b_p_envoi_new_suite_Click
    
        Dim stdocname As String
        Dim stlinkcriteria As String
    
        stdocname = "envoi_new_suite"
        DoCmd.OpenForm stdocname, , , stlinkcriteria
    
    Exit_b_p_envoi_new_suite_Click:
        Exit Sub
    
    Err_b_p_envoi_new_suite_Click:
        MsgBox Err.Description
        Resume Exit_b_p_envoi_new_suite_Click
        
    End Sub

  2. #2
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Cela doit venir de la manière dont tu déclare la variable document

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim document As document
    Mais pour faire ta fonction ne peux-tu pas créer une table temporaire ?
    1. Avant de fermer le premier formulaire, tu stockes tes données dans "TableTemp" que tu créé pour l'occasion

    1. Tu ouvres ton second formulaire avec les données de la "TableTemp"

    1. Tu supprimes la "TableTemp"

  3. #3
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    J'ai un cour de VBA fournit par un de mes professeurs de prog où les variables de type sont déclarées comme ceci donc je sais pas trop. Je vais essayer quelques trucs puis si je ne m'en sort pas je crérait une table temporaire qui me semble une très bonne idée, je n'y avait pas du tout pensé.

    Merci bien Ataturk

  4. #4
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    en fait je ne peux pas utiliser une table temporaire car le nombre de ligne dans mes zones de listes ne sera pas définissable avant qu'elles soient remplies par l'utilisateur...

    Faut que je réussisse mon petit bidouillage, donc pour l'aide je suis toujours demandeur, merci bien

  5. #5
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    quelqu'un aurait un exemple d'une création de table temporaire s'il vous plait? J'ai trouvé des exemples qui disent d'en créer avec par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Newtabl as TableDef
    Set Newtabl = currentDb.createtabledef("nom table")
    current db.tabledef.append Newtabl
    mais j'aurais besoin d'un exemple précis surtout pour la création des champs afin de savoir comment leur donner le bon type pour les données qu'ils receuilleront.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Dans ton formulaire, les données de la liste proviennent d'où (Table, requête,...) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![envoi_new]![liste_document_select]
    Si c'est une table : la table temp est une copie de celle-ci (Donc les champs sont identiques) que tu remplis ou vide au besoin.

    Si c'est une requête : Modifie la pour une de type "Création de table"

    Je vois pas bien ce que tu veux faire...
    Serait-il possible d'avoir un "screenshot" du formulaire premier ?

  7. #7
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    J'ai trois formulaires en fait :
    - Un premier sur lequel on récupère des infos dont une liste qui est rempli par l'utilisateur en fonction de ses séléctions, il choisit un ou plusieurs spéctacles, après il peut choisir un ou plusieur documents (c'est document sont ceux en rapport avec le ou les spéctacles choisis).

    - Un deuxième où il va choisir le type d'envoi et en fonction de celle ci certaines infos sont à prendre

    - un troisième sur lequel il définit d'autre critères puis une liste de client sera générée en fonction des critères des trois formulaires. Sachant que lors de l'ouverture d'un formulaire le formulaire d'avant est fermée (contrainte cahier des charges)

  8. #8
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    A force d'attendre de l'aide j'aide un peu les autres avec mes petites connaissances, mais si quelqu'un pouvais m'aider moi, je pourrais avancer dans mon travail car là j'arrive pas à m'aider tout seul

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Il ya plusieurs erreurs dans ton code VBA.

    1. ta variable ne peut pas avoir le même nom que ton type
    Dim document As document
    C'est comme si tu voulais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim Integer As Integer
    2. Tu ne peux pas utiliser une variable de type table sans l'avoir déclaré comme tel
    document(t).code_document = Forms...
    Pour que cette ligne soit correcte il faut une déclaration du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim MonTableau() As Document
    Ici la dimension n'est pas fixée, si sa valeur est dynamique, tu peux utiliser ReDim (et/ou sans Preserve) pour l'ajuster.
    Voila pour le code.

    Maintenant pour le reste, j'avoues n'avoir pas tout lu, mais si ton objectif c'est d'avoir les valeurs choisies (du formulaire fermé) pour les utiliser après dans un autre formulaire, tu peux simplement créer des champs indépendant dans ton formulaire de réception; et avant la fermeture de ton formulaire appelant, tu renseignes ces champs.

  10. #10
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    hum, d'accord, je prend note de ça, sauf (ah le chieur) que j'ai viré le code qui était fait comme ceci pour le remplacer par la création d'une table provisoire, j'ai trouvé quelques exemples sur le site mais rien de très précis or j'ai pas tout compris (et certaine chose n'ont pas l'air de fonctionner), et j'en était rendu (discussion avec Ataturck) à quémander des exemples de création de table temporaire. Merci quand même car l'histoire de ma déclaration de mon tableau ainsi que pour mon type va mettre utile quand même.

  11. #11
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    bon pour info voici ce que je viens de mettre au point, ceci ne fonctionne pas encore, j'ai un problème dans mes boucles for, je n'arrive pas à faire prendre la valeure de la variable compt, mais petit à petit qui sait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    Private Sub b_p_envoi_new_suite_Click()
        Dim creat_sql As String
        Dim rs As DAO.Recordset
        Dim compt As Integer
     
        creat_sql = "CREATE TABLE TEMPORAIRE"
        creat_sql = creat_sql + " ([nom_temp] text (70)"
        creat_sql = creat_sql + " [date_temp] date"
        creat_sql = creat_sql + " [salle_temp] text (5)"
        creat_sql = creat_sql + " [mairie_temp] text (5)"
        creat_sql = creat_sql + " [agence_temp] text (5)"
        creat_sql = creat_sql + " [centre_temp] text (5)"
        creat_sql = creat_sql + " [comite_temp] text (5)"
        creat_sql = creat_sql + " [divers_temp] text (5)"
        creat_sql = creat_sql + " [envoi_temp] text (8)"
        creat_sql = creat_sql + " [restrict_temp] text (8)"
     
        For compt = 0 To Forms![envoi_new]![liste_document_select].ListCount
            creat_sql = creat_sql + ", [document & compt] integer"
        Next compt
        creat_sql = creat_sql + ")"
     
        MsgBox (creat_sql)
        DoCmd.RunSQL creat_sql
     
        Set rs = Application.CurrentDb.OpenRecordset("TEMPORAIRE", dbOpenDynaset)
        rs.AddNew
        rs.Fields("nom_temps") = nom_envoi
        rs.Fields("date_temps") = date_envoi
        rs.Fields("salle_temps") = option_salle
        rs.Fields("salle_mairie") = option_mairie
        rs.Fields("salle_agence") = option_agence
        rs.Fields("centre_temps") = option_centre_commerciaux
        rs.Fields("comite_temps") = option_comite_entreprise
        rs.Fields("divers_temps") = option_divers
        For compt = 0 To Forms![envoi_new]![liste_document_select].ListCount
            rs.Fields("document" & compt).Value = Forms![envoi_new]![liste_document_select].Column(0, compt - 1)
        Next compt
     
     
    DoCmd.Close acForm, "envoi_new"
    On Error GoTo Err_b_p_envoi_new_suite_Click
     
        Dim stdocname As String
        Dim stlinkcriteria As String
     
        stdocname = "envoi_new_suite"
        DoCmd.OpenForm stdocname, , , stlinkcriteria
     
    Exit_b_p_envoi_new_suite_Click:
        Exit Sub
     
    Err_b_p_envoi_new_suite_Click:
        MsgBox Err.Description
        Resume Exit_b_p_envoi_new_suite_Click
     
    End Sub

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Je crois que tu te compliques la tache pour rien.

    Pourquoi ne pas créer directement ta table temporaire?
    tu la remplie et la vide quand tu veux, et tu l'utilise quand tu veux sans trop de problème !

    Je ne sais vraiment pas ce que tu cherches à faire

  13. #13
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    en fait je ne peux pas car le nombre de champs dépendra du nombre de document séléctionnés voilà pourquoi je fais cet algo.

    Je compte le nombre de ligne dans ma liste donc le nombre de document séléctionnés et pour chacun je cré un champs qui contiendra son le code du document qui est sa valeure dans la liste.


    Donc là mon truc n'est pas trop compliqué par rapport à ce que je dois faire, la seule difficulté qu'il me reste à traité (enfin j'espere) c'est quand je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    creat_sql = creat_sql + ", [document & compt] integer"
    que le champs s'appelle document0 si compt = 0, document1 si compt = 1, ce doit bien être faisable ça?

  14. #14
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    Ba voilà j'ai réussi à débloquer ce passage, me reste d'autre truc à rajouter je verrais bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Private Sub b_p_envoi_new_suite_Click()
        Dim creat_sql As String
        Dim rs As DAO.Recordset
        Dim compt As Integer
        Dim obj As AccessObject
     
        For Each obj In Application.CurrentData.AllTables
            If obj.Name = "TEMPORAIRE" Then
                If obj.IsLoaded Then
                    DoCmd.Close acTable, "TEMPORAIRE", acSaveNo
                End If
                DoCmd.DeleteObject acTable, "TEMPORAIRE"
            End If
        Next obj
     
     
        creat_sql = "CREATE TABLE TEMPORAIRE"
        creat_sql = creat_sql + " ([nom_temp] text (70),"
        creat_sql = creat_sql + " [date_temp] date,"
        creat_sql = creat_sql + " [salle_temp] text (5),"
        creat_sql = creat_sql + " [mairie_temp] text (5),"
        creat_sql = creat_sql + " [agence_temp] text (5),"
        creat_sql = creat_sql + " [centre_temp] text (5),"
        creat_sql = creat_sql + " [comite_temp] text (5),"
        creat_sql = creat_sql + " [divers_temp] text (5),"
        creat_sql = creat_sql + " [envoi_temp] text (8),"
        creat_sql = creat_sql + " [restrict_temp] text (8)"
     
        For compt = 1 To Forms![envoi_new]![liste_document_select].ListCount
            document = "document" & compt
            creat_sql = creat_sql + ", [" & document & "] integer"
        Next compt
        creat_sql = creat_sql + ")"
     
        DoCmd.RunSQL creat_sql
     
     
        Set rs = Application.CurrentDb.OpenRecordset("TEMPORAIRE", dbOpenDynaset)
        rs.AddNew
        rs.Fields("nom_temp") = nom_envoi
        rs.Fields("date_temp") = date_envoi
        rs.Fields("salle_temp") = option_salle
        rs.Fields("mairie_temp") = option_mairie
        rs.Fields("agence_temp") = option_agence
        rs.Fields("centre_temp") = option_centre_commerciaux
        rs.Fields("comite_temp") = option_comite_entreprise
        rs.Fields("divers_temp") = option_divers
        For compt = 1 To Forms![envoi_new]![liste_document_select].ListCount
            rs.Fields("document" & compt).Value = Forms![envoi_new]![liste_document_select].Column(0, compt - 1)
        Next compt
        rs.Update
        rs.Close
     
     
    DoCmd.Close acForm, "envoi_new"
    On Error GoTo Err_b_p_envoi_new_suite_Click
     
        Dim stdocname As String
        Dim stlinkcriteria As String
     
        stdocname = "envoi_new_suite"
        DoCmd.OpenForm stdocname, , , stlinkcriteria
     
    Exit_b_p_envoi_new_suite_Click:
        Exit Sub
     
    Err_b_p_envoi_new_suite_Click:
        MsgBox Err.Description
        Resume Exit_b_p_envoi_new_suite_Click
     
    End Sub

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2015, 11h53
  2. Réponses: 2
    Dernier message: 27/05/2008, 16h28
  3. non sauvegarde des données à la fermeture d'un formulaire
    Par zanou666 dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/10/2007, 14h20
  4. Réponses: 29
    Dernier message: 01/07/2006, 09h23
  5. Réponses: 5
    Dernier message: 27/12/2004, 00h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo