[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. 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. 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. Salut,
        Essaie de ne mettre que des simples guillemets pour tes champs numériques : (" & Champs1 & ", dbNumeric)

        @+
        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. 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 !