2016-07-27 41 views
0

私がアクセス2016テーブルに一連のフィールドを追加しますが、エラーが発生した維持しようとしています:私はもともとDBNUMERICとして、データ型を指定 無効なフィールドデータ型使用時TableDef.CreateFieldメソッドVBA

Runtime error '3259' 
Invalid field data type 

それがdbDecimalに変更されているかどうかを確認しました。 CreateFieldsの hereの解決策は私の問題を解決しませんでしたが、私はSQLを試しませんでした。それはしませんでした。ここでは、コードは次のようになります。

Sub BOD_Variables() 

    Dim myDBS 
    Dim myTable As TableDef 
    Dim myTableName As String 

    myTableName = "BOD_Data" 
    Set myDBS = CurrentDb 
    Set myTable = myDBS.TableDefs(myTableName) 

    Dim myField As Field 
    Dim myVariableNames As Variant 

    myVariableNames = Array("Blank_4_SampleVol", ... "BOD_ Concentration _OUT") 

    Dim iCount As Integer 

    For iCount = LBound(myVariableNames) To UBound(myVariableNames) 
    Debug.Print myVariableNames(iCount) 

     Set myField = myTable.CreateField(myVariableNames(iCount), dbDecimal) 'Originally specified dbNumeric for data type. 
     myTable.Fields.Append myField 
    Next 
End Sub 

私はアレイ(インデックス)への呼び出しを置き換えるために試みた。それでも同じエラーを取得し

 Set myField = myTable.CreateField("Blank_4_SampleVol", dbNumeric) 

長さをdiscussed hereと指定してみましたが、問題は解決しませんでした。 CreateFieldのドキュメントでは、フィールドの型がdbNumbericの場合、フィールドの長さが無視されます。

私が紛失しているものはありますか?前もって感謝します。

+0

エラーの前に、forループまでの距離はどのくらいですか?あなたがやったデバッグの詳細が必要です。 –

+1

'dbDouble'を使うと、あなたのニーズを満たし、エラーなく実行できるはずです - 長さを指定する必要はありません – dbmitch

+1

私の答えのコードはDAOオブジェクト(例: 'TableDef') ADOXオブジェクトを使用します。 –

答えて

0

は、リンクされた問題のlinkに従い、DECIMALのための脚注#7をお読みください。

strSQL = "ALTER TABLE myTable ADD COLUMN " & myVariableNames(iCount) & " DECIMAL (20,6);" 
CurrentProject.Connection.Execute strSQL 

小数フィールドだったいる

[7] Not available in the Access query interface or DAO. Use ADO to Execute the DDL query statement.

だからあなたはこのようなものを使用したいです(下記のコメントを参照)、Avoid Using Decimal Field Size in Microsoft Access Tables またはhttp://allenbrowne.com/bug-08.html

ロング、ダブル、または通貨がより良い選択肢かもしれません。

+1

re: "小数フィールドに問題があります" - これらの参照はどちらも古くなっています(Access 2000および2003年頃)。 Access 2010では、小数点以下の値をソートする際に問題はなく、文字列区切り記号で値をエクスポートしても、テキストへのエクスポートは失敗しません。Accessコミュニティへのアレンの貢献は伝説的であり、もっともだとは言えますが、彼は長年引退しており、今日の5つ(またはそれ以上)のバージョンは、今日必ずしも真実ではありません。 –

+0

この情報ありがとう、@Gord! – Andre

1

それは我々がDAO.Field2オブジェクトを使用してみた場合でも、次ADOXコードは(アクセス2010でテスト済み)Decimalフィールドを作成し、DAOはDecimalフィールドを作成するために必要なプロパティを公開していないようだというのは本当である間:

Option Compare Database 
Option Explicit 

Sub AddNewDecimalField() 
    Dim cat As New ADOX.Catalog 
    cat.ActiveConnection = CurrentProject.Connection 
    Dim tbl As ADOX.Table 
    Set tbl = cat.Tables("MyTable") 
    Dim col As New ADOX.Column 
    col.Name = "MyNewDecimalField" 
    col.Type = adNumeric ' note: not adDecimal 
    col.Precision = 18 
    col.NumericScale = 8 
    tbl.Columns.Append col 
End Sub 

あるいは、アンドレは彼の答えに示唆するように、私たちはただ... ...

CurrentProject.Connection.Execute _ 
     "ALTER TABLE MyTable ADD COLUMN MyNewDecimalField DECIMAL(18,8)" 

をDDLクエリを使用することができます。

+0

ゴード、お時間をありがとう。私はあなたのより洗練されたアプローチを将来使用すると思う。初心者の質問が少しあります.ADOXを実装する方法と参照する方法は何ですか?アクセスはADOX.Tableをユーザー定義型として現在解釈しています。ありがとう、Phillip – PhillipOReilly

+0

VBA開発環境では、Tools> References ... 'を実行し、" Microsoft ADO Ext。6.0 for DDL and Security "のリファレンスを追加する必要があります。あなたの特定の質問は特別なものです:ほとんどの場合、DAOはADOXよりAccessの機能を完全にカバーしていますが、DAOでは「Decimal」フィールドのサポートが不思議です。 –

関連する問題