[Access VBA] Problème Type Field

Bonjour,
je dois créer des tables sur mesure en fonction des choix utilisateurs.

je recontre deux plantages sur le numérique et le décimal.
Le reste fonctionne
Mon code est :

...
If format1=1 then Set fld = tdf.createField("" & Champs1 & "", dbtext)
If format1=2 then Set fld = tdf.createField("" & Champs1 & "", dbNumeric)
If format1=3 then Set fld = tdf.createField("" & Champs1 & "", dbMemo)
If format1=4 then Set fld = tdf.createField("" & Champs1 & "", dbDate)
If format1=5 then Set fld = tdf.createField("" & Champs1 & "", dbDecimal)
If format1=6 then Set fld = tdf.createField("" & Champs1 & "", dbCurrency)

je ne sais pas pourquoi la ligne avec dbNumeric et la ligne avec dbDecimal plante ?

quelqu'un a t'il la listes des valeurs possibles pour les types de fields, j'ai récupéré tous les types, et je ne comprends pas pourquoi ces deux plantent et arrêtent la macro ?
Problème de longueur ?
Est il possible que ce soit un problème de nombre par exemple : au lien de mettre un entier il faut mettre un décimal et donc convertir Champs1 en Champ1 avec des virgules et 00
Configuration: Windows XP
Internet Explorer 6.0

11 réponses

  1. Salut,
    Essaie de ne mettre que des simples guillemets pour tes champs numériques : (" & Champs1 & ", dbNumeric)

    @+
    1. non le problème n'est pas les "" car le code marche dans tous les cas sauf 2 :

      il y a erreur (plus exactement arret du code) lorsque le type du champs est dbNumeric et dbDecimal.
      1. bonjour blux

        je prends comme message :

        Erreur d'execution 3259
        Type de champs de données non valide.

        donc en théorie access vba refuse le type dbdecimal et dbnumeric pour les fields.

        il me reste donc a trouver des types de substitution....
        mais pourquoi l'aide en ligne fournit la liste complète si des types sont rejetés...

        long integer single double bigint ?
        encore un autre... bon je vais rechercher et faire des tests...

        merci en tout cas.
        1. Bonjour, suite à ta demande ci joint le code.

          En fait ce n'est qu'un programme car le but du jeu est de créer un back up service, en chargant des fichiers de quelque nature que ce soit avec ou sans délimitateur de les transformer et de créer des fichiers de type "intraprod" pour que l'informatique le charge dans leur outil "intraprod" pour relancer les clients qui doivent de l'argent a l'entreprise qui nous a envoyé les fichiers et qui a fait faillite pour que la banque qui a escompté les traites récupère le plus d''argent possible ...

          dans le cas ci dessous tu as un fichier a entrer avec 2 champs et sans délimitatieur mais avec une longueur fixe (issu des macro systèmes)

          Tout marche sauf quand je selectionne statut1 ou statut2 dans le programme ci dessous les nombres qui correspondent à dbNumeric ou dbDecimal.

          Merci a toi en tout cas.

          Sub CreationTable2B()
          Dim NomFichTable As Variant
          Set db = CurrentDb()
          Set Base_Recherche = db.OpenRecordset("TB_Fichier")
          Base_Recherche.Index = "primarykey"
          Base_Recherche.Seek "=", Nom_Fichier_Entree

          Base_Recherche.Edit
          NomFichTable = Base_Recherche("NomFichier").Value
          Base_Recherche.Close

          Dim dbs As DAO.Database
          Dim tdf As DAO.TableDef
          Dim fld As DAO.Field
          Set dbs = CurrentDb()
          Set tdf = dbs.CreateTableDef("TB_" & NomFichTable & "")
          If Format1 = 1 Then Set fld = tdf.CreateField("" & Champs1 & "", dbText)
          If Format1 = 2 Then Set fld = tdf.CreateField("" & Champs1 & "", dbNumeric)
          If Format1 = 3 Then Set fld = tdf.CreateField("" & Champs1 & "", dbMemo)
          If Format1 = 4 Then Set fld = tdf.CreateField("" & Champs1 & "", dbDate)
          If Format1 = 5 Then Set fld = tdf.CreateField("" & Champs1 & "", dbDecimal)
          If Format1 = 6 Then Set fld = tdf.CreateField("" & Champs1 & "", dbCurrency)

          fld.OrdinalPosition = 1
          fld.Size = Longueur1.Value
          tdf.Fields.Append fld

          If Format2 = 1 Then Set fld = tdf.CreateField("" & Champs2 & "", dbText)
          If Format2 = 2 Then Set fld = tdf.CreateField("" & Champs2 & "", dbNumeric)
          If Format2 = 3 Then Set fld = tdf.CreateField("" & Champs2 & "", dbMemo)
          If Format2 = 4 Then Set fld = tdf.CreateField("" & Champs2 & "", dbDate)
          If Format2 = 5 Then Set fld = tdf.CreateField("" & Champs2 & "", dbDecimal)
          If Format2 = 6 Then Set fld = tdf.CreateField("" & Champs2 & "", dbCurrency)

          fld.OrdinalPosition = 2
          fld.Size = Longueur2.Value
          tdf.Fields.Append fld

          dbs.TableDefs.Append tdf
          RefreshDatabaseWindow

          MsgBox "La table " & tdf.Name & " a été créée"
          Set fld = Nothing
          Set tdf = Nothing
          Set dbs = Nothing

          End Sub
          1. Modérateur
            Je viens de reproduire chez moi (sous access 2002), je ne comprends pas...

            Tout ce que je vois, c'est que dans l'aide, les deux trucs qui merdent renvoient à la même description :

            Type de données stockant une valeur numérique exacte signée de précision p et d'échelle s (1 ≤ p ≤15 ; 0 ≤ s ≤ p).

            Donc, je penche pour un gros bug d'access.

            A part contourner avec des types particuliers : dbdouble, dbsingle..., je ne vois pas.
            1. En tout cas, merci beaucoup a toi de ton aide, je vais contourner.
              Bonne journée.
              1. Voici un code qui fonctionne et créer tous les types ACCESS.
                PREREQUIS
                Avoir une base C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb
                Dans cette base avoir une table "T"
                Coller le code dans module nouvelle base
                Exécuter sub test()

                au stop vérifier les msg dans le debug et la table dans
                C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb

                Bonne chance :

                Sub test()
                Dim MyDB As Database
                Dim tdf As TableDef
                Dim fldLoop As Field

                Set MyDB = OpenDatabase("C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb")
                Set tdf = MyDB.TableDefs![T]

                On Error Resume Next
                AppendDeleteField tdf, "APPEND", "dbBigInt", dbBigInt
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbBinary", dbBinary
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbBoolean", dbBoolean
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbByte", dbByte
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbChar", dbChar
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbCurrency", dbCurrency
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbDate", dbDate
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbDecimal", dbDecimal
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbDouble", dbDouble
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbFloat", dbFloat
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbGUID", dbGUID
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbInteger", dbInteger
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbLong", dbLong
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbLongBinary", dbLongBinary
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbMemo", dbMemo
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbNumeric", dbNumeric
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbSingle", dbSingle
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbText", dbText
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbTime", dbTime
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbTimeStamp", dbTimeStamp
                Debug.Print Error(ErrorNumber)
                AppendDeleteField tdf, "APPEND", "dbVarBinary", dbVarBinary
                Debug.Print Error(ErrorNumber)

                Stop

                AppendDeleteField tdf, "DELETE", "dbBigInt", dbBigInt
                AppendDeleteField tdf, "DELETE", "dbBinary", dbBinary
                AppendDeleteField tdf, "DELETE", "dbBoolean", dbBoolean
                AppendDeleteField tdf, "DELETE", "dbByte", dbByte
                AppendDeleteField tdf, "DELETE", "dbChar", dbChar
                AppendDeleteField tdf, "DELETE", "dbCurrency", dbCurrency
                AppendDeleteField tdf, "DELETE", "dbDate", dbDate
                AppendDeleteField tdf, "DELETE", "dbDecimal", dbDecimal
                AppendDeleteField tdf, "DELETE", "dbDouble", dbDouble
                AppendDeleteField tdf, "DELETE", "dbFloat", dbFloat
                AppendDeleteField tdf, "DELETE", "dbGUID", dbGUID
                AppendDeleteField tdf, "DELETE", "dbInteger", dbInteger
                AppendDeleteField tdf, "DELETE", "dbLong", dbLong
                AppendDeleteField tdf, "DELETE", "dbLongBinary", dbLongBinary
                AppendDeleteField tdf, "DELETE", "dbMemo", dbMemo
                AppendDeleteField tdf, "DELETE", "dbNumeric", dbNumeric
                AppendDeleteField tdf, "DELETE", "dbSingle", dbSingle
                AppendDeleteField tdf, "DELETE", "dbText", dbText
                AppendDeleteField tdf, "DELETE", "dbTime", dbTime
                AppendDeleteField tdf, "DELETE", "dbTimeStamp", dbTimeStamp
                AppendDeleteField tdf, "DELETE", "dbVarBinary", dbVarBinary
                End Sub

                Sub AppendDeleteField(tdfTemp As TableDef, _
                strCommand As String, strName As String, _
                Optional varType, Optional varSize)

                'exemple de l'aide ACCESS

                With tdfTemp

                ' Check first to see if the TableDef object is updatable. If it isn't, control is passed back to
                ' the calling procedure.
                If .Updatable = False Then
                MsgBox "TableDef not Updatable! " & _
                "Unable to complete task."
                Exit Sub
                End If

                ' Depending on the passed data, append or delete a
                ' field to the Fields collection of the specified
                ' TableDef object.
                If strCommand = "APPEND" Then
                .Fields.Append .CreateField(strName, _
                varType, varSize)
                Else
                If strCommand = "DELETE" Then .Fields.Delete _
                strName
                End If

                End With

                End Sub
                1. BONJOUR,
                  honnêtement j'ai pas tout compris.

                  d'abord quel champs créer dans la table T ? moi j'en ai créé un et ensuite les champs de ton code se créé a la suite.
                  Ensuite pour moi l'éxécution du code renvoit une erreur si je travaille sur la même table : admin utilisé.

                  donc je lance le code d'une autre table et je regarde sur la base ou j'ai cré la table T, dans ce cas il y a les champs rajoutés dans la table T.
                  Il n'y a cependant aucune valeur ou écriture dedans.
                  je n'ai pas de rejet rien.

                  si je continue la macro après le stop, cela efface les champs créés. Mais le lancement de l'execution du code plante toujours ensuite.

                  je vais regarder en détail ton code et essayer de comprendre demain au travail.

                  En tout cas merci à toi de cette aide.
                  1. Salut,
                    La seule chose à comprendre est le code suivant :
                    tdf.Fields.Append .CreateField(strName, varType, varSize)
                    ou tdf est un objet TableDef
                    Fields est une collection de Field
                    Append une méthode de Fields
                    CreateField une méthode de TableDef
                    strName, varType, varSize sont les attributs du Field à créer dans la table.

                    Voici l'aide de VBA ACCESS :
                    Pour ajouter un champ à une table :

                    1. Vérifiez que tous les objets Recordset basés sur la table sont fermés.

                    2. Utilisez la méthode CreateField pour créer une variable objet Field et définir ses propriétés.

                    3. Utilisez la méthode Append pour ajouter l'objet Field à la collection Fields de l'objet TableDef.

                    Bonne chance
                  2. Petite pécision,
                    J'ai essayé le code exemple de Microsoft en mettant dbNumeric comme type de données et ça plante alors qu'apparemment le code est identique à celui que je t'ai donné.

                    Je n'ai pas d'explication!
                  3. Modérateur
                    @dhcpC'est bien là le problème, dans la doc il est indiqué que ce type de données existe, mais on ne peut pas l'utiliser...
                2. Merci en tout cas de votre aide.
                  je vais tout ce qui plante en txt, pour le retraitement on verra plus tard...

                  bonne journée !