ADOXで複数回フィールドを定義することはできません | 実行時エラー-2147217858

このQ&Aのポイント
  • ADOXやVBのコードを使用してAccessでテーブルを作成する際、複数回同じフィールドを定義することはできません。このエラーが発生する理由として、テーブル内のフィールド数の最大値が255に制限されていることが挙げられます。
  • VBのコードの一部で、ADOXやCatalog、Tableなどのオブジェクトを使用してテーブルを作成しています。コード内でForループを使用してフィールドを定義している部分がありますが、このループ内で同じフィールドを複数回定義しようとしているためエラーが発生しています。
  • エラーが発生する原因を特定するためには、Forループ内のカウンタ変数iの値やループの範囲を確認する必要があります。また、テーブル作成時に指定するフィールドの数や属性も確認してください。エラーが発生する場合は、フィールドの定義に問題がある可能性があります。
回答を見る
  • ベストアンサー

ADOX 複数回フィールドを定義することは出来ませ

アクセス2010ですが アクセスの仕様を見ると テーブル内のフィールド数の最大値は255なのですが ADOXでVBAでテーブルを作成してるのですが 実行時エラー -2147217858 複数回フィールドを定義することは出来ません。 と言うエラーになり、テーブルが作れません。 vbaコードの一部は Set cat = New ADOX.Catalog Set tbl = New ADOX.Table cat.ActiveConnection = CurrentProject.Connection tbl.Name = "test" For i = LBound(tmp) To 200 ' UBound(tmp) Col = tmp(i) tbl.Columns.Append Col, adVarWChar, 20 tbl.Columns(Col).Attributes = adColNullable Next i cat.Tables.Append tbl です。 ためしに To 200 を To 100 にしても同じようなエラーになりました。 何でエラーになるのでしょう???

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。 質問では、テーブルを新規に作成するということなので、 No1はそれぞれ、 Sub test133() Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim col As New ADOX.Column Dim i As Long cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "テーブル名" With tbl.Columns For i = 1 To 10 .Append "F" & i, adVarWChar, 20 Next i End With cat.Tables.Append tbl Set cat = Nothing End Sub Sub test134() Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim col As New ADOX.Column Dim i As Long cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "テーブル名" cat.Tables.Append tbl For i = 1 To 10 Set col = New ADOX.Column With col .Name = "F" & i .Type = adVarWChar .DefinedSize = 20 .Attributes = adColNullable End With tbl.Columns.Append col Set col = Nothing Next i Set cat = Nothing End Sub のように。「テーブル名」の新規テーブルにフィールド名を F1,F2・・・のように新規に設定します。

nawvmaltyemj
質問者

お礼

どうもありがとうございました。

その他の回答 (1)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

フィールドを追加する方法を二つばかり。 二つのプロシージャで、 For i = 2 To 10 としているのは、あらかじめフィールドが 一つ設定してあって、フィールド名は"F1" となっています。追加すると、F2,F3,F4・・・・ が追加されます。 一番目と二番目の違いがわかるでしょうか? 質問は二番目のほうだと思いますが。この方法では、 ループの中でColumn設定したり削除したりします。 ループに入る位置、フィールドの設定方法、オブジェクトの 設定と破棄などについて確認してみてください。 なお、質問の中のエラー、 実行時エラー -2147217858 複数回フィールドを定義することは出来ません。 と言うエラーになり、テーブルが作れません。 は、コードを実行すると、そのときフィールドが一つだけ 設定されてふたたびループに入ったときに同じフィールドを 作成しようとしてエラーが起きるのでは、と思います。 エラーの原因はループの位置、オブジェクトの設定と破棄 などでしょう。 質問のコードを実行していないので推測ですが。 Sub test131() Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim col As New ADOX.Column Dim i As Long cat.ActiveConnection = CurrentProject.Connection Set tbl = cat.Tables("テーブル名") With tbl.Columns For i = 2 To 10 .Append "F" & i, adVarWChar, 20 Next i End With Set cat = Nothing End Sub Sub test132() Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim col As New ADOX.Column Dim i As Long cat.ActiveConnection = CurrentProject.Connection Set tbl = cat.Tables("テーブル名") For i = 2 To 10 Set col = New ADOX.Column With col .Name = "F" & i .Type = adVarWChar .DefinedSize = 20 .Attributes = adColNullable End With tbl.Columns.Append col Set col = Nothing Next i Set cat = Nothing End Sub

nawvmaltyemj
質問者

お礼

どうもありがとうございました。

関連するQ&A

  • ADOX フィールドのRequiredプロパティを

    ADOX フィールドのRequiredプロパティをFalseにしたい アクセスです。 Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim idx As ADOX.Index Dim varRet As Variant Dim strMsg As String Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "test" tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる tbl.Columns.Append "氏名", adVarWChar, 50 cat.Tables.Append tbl 主キーを作る Set idx = New ADOX.Index idx.Name = "Primary" idx.PrimaryKey = True idx.Columns.Append "氏名ID" tbl.Indexes.Append idx MsgBox tbl.Name & "テーブルを作成しました。" Set cat = Nothing End Sub ********************************************************** 上記のコードでテーブルを作ると、RequiredをTrueにしてないのに、 実際にテーブルにデータを入れてる時に、NULLにしようとすると、 ********************************************************** フィールドに必要なプロパティが True に設定されているため、 このフィールド '<フィールド名>' には Null 値は挿入できません。値を入力してください。 ********************************************************** となります。 Requiredプロパティの規定値は、False になってますが、 なぜか値を要求されてしまいます。 ADOXで上記のコードに追加してRequiredをFalse にする方法を教えてください。、

  • ADOXでAccessのファイルを作る

    ADOXで下記のようにAccessファイルを作ろうと思うのですが Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim col As New ADOX.Column Dim idx As New ADOX.Index cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & ここには作成先のパス & ";" _ & "Jet OLEDB:Engine Type=4;" tbl.Name = "T_連絡先" col.Name = "連絡場所" col.Type = adVarWChar col.DefinedSize = 20 col.ParentCatalog = cat col.Properties("Jet OLEDB:Allow Zero Length") = True tbl.Columns.Append col Set col = Nothing col.Name = "連絡番号" col.Type = adVarWChar col.DefinedSize = 13 col.ParentCatalog = cat col.Properties("Jet OLEDB:Allow Zero Length") = True tbl.Columns.Append col Set col = Nothing cat.Tables.Append tbl Set tbl = Nothing 4台ある中の2台のPCでは問題なくファイルが作成されましたが、残り2台に関してはファイルは作成されるもののテーブルは作成されませんでした。 コードを削除しながらテストしてみると、"連絡場所"フィールドに問題があるらしく、"連絡場所"フィードのコードを削除すると問題なくテーブルも作成されます。 しかも、不思議なことにコードを変えずにフィールド名"連絡場所"を"連絡場所1"とするとテーブルは問題なく作成されます。マシンはすべてWin2000ProにVB6SP5です。とんでもなく初歩的なところでミスをしているような感じもしますが、まったく原因がつかめませんので、どうかよろしくお願いいたします。

  • ハイパーリンク型を指定することは可能ですか?

    VBAでテーブル(フィールド)を作る際にハイパーリンク型を指定することは可能ですか? Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "テーブル" tbl.Columns.Append "URL", adVarWChar cat.Tables.Append tbl Set cat = Nothing End Sub アクセスでこんな感じで作ってるのですが adVarWCharの部分をハイパーリンク型にしたいです。 しかし http://www.accessclub.jp/ado/adox/06.html を見てるとデータ型にハイパーリンク型が見当たらないのですが、不可能という事でしょうか?

  • データ型をメモ型にして既存テーブルにフィールドを追加したい(ACCESS ADOX)

    Sub test() Dim cat As New ADOX.Catalog Dim tb As New ADOX.Table cat.ActiveConnection = CurrentProject.Connection 'テーブルを開く Set tb = cat.Tables("テーブル1") tb.Columns.Append "フィールド1", ad○○ Set cat = Nothing Set tb = Nothing End Sub これで既存のテーブルにフィールドを追加できることを知ったのですが データ型をメモ型にするにはどの「ad○○」にすればいいのでしょう? (文字数が多いためテキスト型では収まりません) オブジェクトブラウザで見ても、多すぎてどれなのかわかりません。 ご教授よろしくお願い致します。

  • アクセス2000のデータベースにテーブルを追加して、フィールドを作成したい 

    アクセス2000のデータベースがあります。 このファイル「c:\ynet\Hz2data1.mdb」に新しいテーブル「会費管理2」を追加して、フィールドを作成したいのです。 現在は「会費管理2」テーブルがあるのを前提に下記のように書き込みしてみましたが・・・ 新しく「会費管理2」テーブルを指定したファイル「c:\ynet\Hz2data1.mdb」に作成してフィールドも作成するのを同時にできるのかしら? どなたか助けていただければ幸いです。                                           かしこ Private Sub コマンド1_Click() Beep If (MsgBox("データをアップデートしますが宜しいですか? 作業は一瞬で終わりますよ!!") = 7) Then End If Dim cnn As ADODB.Connection Dim catDB As ADOX.Catalog Dim tbl As ADOX.Table Dim colAdo As ADOX.Column strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" strCon = strCon & "Data Source=c:\ynet\Hz2data1.mdb" Set cnn = CurrentProject.Connection Set catDB = New ADOX.Catalog catDB.ActiveConnection = cnn Set tbl = New ADOX.Table tbl.Name = "会費管理2" '以下追加したいフィールド Set colAdo = New ADOX.Column With colAdo .Name = "個別台帳ID" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "会費名称ID" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "会費区分ID" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "年度" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "入金日" .Type = adDate .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "入金額" .Type = adCurrency .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = Nothing Set tbl = Nothing Set catDB = Nothing cnn.Close End Sub

  • ADOX Append Null許可フィールド作成

    お世話になります。 既存テーブルにフィールドを追加したところNull不許可で作成されました。 Dim CAT As ADOX.Catalog CAT.Tables("TM住所録").Columns.Append "年賀状", adVarWChar, 2 検索したところ次のようなサンプルがあったのですが、下のエラーになります。 CAT.Tables("TM住所録").Columns("年賀状").Attributes = adColNullable 実行時にエラー -2147217887 複数ステップのOLE DBの操作でエラーが発生しました。 各OLE DBの状態の値を確認して下さい。作業は終了しませんでした。 appendで追加したフィードをNull許可にするにはどうしたらいいでしょうか? よろしくお願いいたします。

  • アクセス2000で作成したデータベースにテーブルを追加したいのです 「Set tbl = catDB.Tables![会費管理2]」 

    アクセスで作成したデータベースがあります。 簡単にテーブルを追加するプログラムを作成したいのですが可能かしら? 現在[会費管理2]というテーブルが無いので[会費管理2]と言うテーブルを追加して、そのテーブルに各フィールドを作成したいのです。 作成したSet tbl = catDB.Tables![会費管理2] に '以下追加したいフィールド Set colAdo = New ADOX.Column With colAdo .Name = "数値1" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "数値2" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "数値3" .Type = adInteger .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "日付" .Type = adDate .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "金額" .Type = adCurrency .Attributes = adColNullable End With tbl.Columns.Append colAdo Set colAdo = Nothing Set tbl = Nothing Set catDB = Nothing cnn.Close End Sub

  • エクセルからMySQL

    すみません、エクセルからMySQLのテーブル作成をしたいのですが、うまくいきません。 --------------------------------------------------------- Sub aaa() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim cnn As New ADODB.Connection Set cat = New ADOX.Catalog cat.ActiveConnection = "provider = MSDASQL.1;data source=test;" cnn.Open "Provider=MSDASQL.1;Data Source=test;" Set tbl = New ADOX.Table tbl.Name = "aaa" Set tbl.ParentCatalog = cat With tbl .Columns.Append "ID", 4 .Columns.Append "名前", 4 End With End Sub ----------------------------------------------------------- エクセルからACCESSへの接続の参考ホームページを見ながらやっているので、MySQLの場合これであっているのか分からないです。実行してもエラーがでないのですが、確認してみるとテーブルが作成されていないです。どなたか分かる方教えてください。お願いします。 上のコードは、MySQLの【test】というデータベースに【aaa】というテーブルを作成するというつもりで書いているのですが、間違っていますでしょうか?

  • アクセスでフィールド入替えのVisualBasic

    アクセス2000で作成したテーブルに現在「場所」というフィールドがあります。 このフィールドのデータ型を「OLEオブジェクト」から「テキスト型」に変える「VisualBasic」の書き方を教えてください。 [現在ある"場所"を削除してから・・・ tbl.Columns.Append colAdo Set colAdo = New ADOX.Column With colAdo .Name = "場所" .Type = adVarWChar .Attributes = adColNullable End With 上記を追加する形になるのでしょうか? お願いいたします。

  • ADOXでmdbファイルにオートナンバー型フィールド作成するとエラー

    ADOXを使ってmdbファイルを作るときに、オートナンバー型フィールドを作るステートメントを入れると 「Microsoft JET Database Engine (0x80040E21) 複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。」 というエラーになります。 試しにオートナンバーにしないと、正常にmdbファイルが作成されます。 対処法をご存知の方、是非とも教えてください。 以下がソースの一部です。 Set catDB = CreateObject("ADOX.Catalog") catDB.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\hoge.mdb" Set tbl = CreateObject("ADOX.Table") With tbl .Name = "Contacts" Set .ParentCatalog = catDB With .Columns .Append "ContactId", adInteger ' ContactId フィールドをオートナンバー型に設定します。 .Item("ContactId").Properties("AutoIncrement") = True .Append "CustomerID" .Append "Phone" End With End With catDB.Tables.Append tbl←ここでエラーになります。 Set catDB = Nothing

専門家に質問してみよう