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

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こちらでは、上記のソースで正常に作成できました。


なんでMDACのバージョン等の問題かと。

最新のものを入手して試してみてください。

この回答への補足

回答ありがとうございます。
MDACのバージョンを調べたところ
2.0でしたので、最新の2.8をインストールしてみました。
しかし、状況はかわらずでした。
Accessのバージョンなども関係しているのでしょうか?

補足日時:2003/11/07 09:25
    • good
    • 0
この回答へのお礼

お礼をすることを忘れていました。
大変申し訳ありません。
どうもありがとうございました。

お礼日時:2004/01/23 16:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Qテーブル作成時のプロパティーの設定方法

vb からアクセスのテーブル作成時のプロパティーの設定方法を教えてください。

値要求 のプロパティーを Falseにしたいのですが、DAOでは「フィールドの Required プロパティにアクセスするには、DAO の Required プロパティを使います。」だそうですが ADO、ADOX での設定の仕方がわかりません。
知っている方がおられたら教えて下さい。

Aベストアンサー

僕のPCのMSDNにあったのですが、ネット上のMSDNで同じページが見つからなかったので、コピペします。

ParentCatalog の例


次のコードで、テーブルをカタログに追加するより前にプロバイダに固有のプロパティにアクセスするための、ParentCatalog プロパティの使用法を示します。

Sub SetAllowZeroLength()

  Dim cnn As New ADODB.Connection
  Dim cat As New ADOX.Catalog
  Dim tbl As New ADOX.Table
  Dim col As New ADOX.Column

  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source= c:\Program Files\" & _
   "Microsoft Office\Office\Samples\Northwind.mdb;"
  Set cat.ActiveConnection = cnn
  tbl.Name = "MyTable"
  tbl.Columns.Append "Column1", adInteger
  Set col.ParentCatalog = cat
  col.Name = "Column2"
  col.Type = adVarWChar
  col.Properties("Jet OLEDB:Allow Zero Length") = True
  tbl.Columns.Append col
  cat.Tables.Append tbl

End Sub

僕のPCのMSDNにあったのですが、ネット上のMSDNで同じページが見つからなかったので、コピペします。

ParentCatalog の例


次のコードで、テーブルをカタログに追加するより前にプロバイダに固有のプロパティにアクセスするための、ParentCatalog プロパティの使用法を示します。

Sub SetAllowZeroLength()

  Dim cnn As New ADODB.Connection
  Dim cat As New ADOX.Catalog
  Dim tbl As New ADOX.Table
  Dim col As New ADOX.Column

  cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" ...続きを読む

QADOをし使用して、Accessのテーブルの中のフィールドを消したいのですが。

タイトル通りなんですけど、
テーブルにあるフィールドを追加、削除したいのですが、
どうしたらいいのか全くお手上げ状態です。
助けてください。

ADOを使用しています。
お願いします。

Aベストアンサー

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set Tbl = cat.Tables![テーブル名]

'フィールドの追加
Tbl.Columns.Append "追加フィールド名", adWChar
'フィールドの削除
Tbl.Columns.Delete "削除フィールド名"

Set Tbl = Nothing
Set cat = Nothing

Append、Deleteメソッドの引数など詳しいことは、MSDN Libraryなどで調べて下さい。
では。

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnect...続きを読む

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

QプロセスIDの取得方法について

下に同様の質問をしたのですが、削除方法分からない為、再度質問させていただきまし。

VB5.0を利用しています。
VBで書いたexeを実行した際に、そのプロセスID(自分の)は、GetCurrentProcessIdを利用すれば取得できると分かりました。
が、プログラム内でExcelを下記の様にオブジェクトを作成した場合、そのプロセスIDをどうやって取得すればいいのでしょうか?
ご存知の方居ましたら、教えて下さい。

Set ExcelObj = CreateObject("Excel.Application")
ここで起動?されたExcelのプロセスIDを取得したいのですが。

Aベストアンサー

FindWindowなどのキャプションか、クラス名で対象オブジェクトハンドルを取得し、
GetCurrentProcessId関数で、プロセスIDとスレッドIDを取得する方法が一般的。
過去スレにいっぱいサンプルがあります。

スクリプトを使用するなら、以下の方法もあったりする。

でもどちらも複数EXCEL起動時は、考えなければいけない部分多し。

Sub Main()
  Dim ExcelObj As Excel.Application
  
  Set ExcelObj = CreateObject("Excel.Application")
  ExcelObj.Visible = True
  Call DebugHandle
  ExcelObj.Quit
  Set ExcelObj = Nothing
End Sub

Public Function DebugHandle()
  Dim strSQL   As String
  Dim objWk    As Object
  Dim objXlsProc As Object
  strSQL = "SELECT Handle FROM Win32_Process WHERE Name = 'EXCEL.EXE'"
  Set objWk = GetObject("winmgmts:").ExecQuery(strSQL)
  For Each objXlsProc In objWk
    Debug.Print objXlsProc.Handle
  Next
End Function

FindWindowなどのキャプションか、クラス名で対象オブジェクトハンドルを取得し、
GetCurrentProcessId関数で、プロセスIDとスレッドIDを取得する方法が一般的。
過去スレにいっぱいサンプルがあります。

スクリプトを使用するなら、以下の方法もあったりする。

でもどちらも複数EXCEL起動時は、考えなければいけない部分多し。

Sub Main()
  Dim ExcelObj As Excel.Application
  
  Set ExcelObj = CreateObject("Excel.Application")
  ExcelObj.Visible = True
  Call DebugH...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

QエクセルVBA 「On Error GoTo 0」について

「On Error GoTo 」ステートメントの意味は、だいたい理解しています。
「On Error GoTo 0」 ステートメントについて、ご教授お願いします。
参考書には「エラーのトラップ処理を無効にする」と載っていましたが、よくわかりません。
具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。
よろしくお願いします。

Aベストアンサー

#3の回答者ですが、コードのどこが原因か特定し、実行時エラーとして、そのエラーが不可避な場合において、On Error Resume Next を付けますから、On Error Goto ErrHandler よりも、扱い方が難しいです。当然、その部分だけの範囲を囲うので、On Error Goto 0 を入れると思いますし、今では、使う場面が限定されているはずです。

後はテキストを参考にしてください。当面、このようなコードが必要になることはないと思いますが。

Q【Excel VBA】ネットワーク上の共有フォルダにあるExcelを開く

Windows XP
Office2003

エクセルVBAにて、ネットワーク上にある共有フォルダ内のエクセルブックを開くコーディングを教えていただけますでしょうか?

開きたいブック:\\共有サーバー\共有\TEST.xls

よろしくお願いします。

Aベストアンサー

Workbooks.Open fileName:="\\共有サーバー\共有\TEST.xls"

http://www.bokuno.biz/program/vba/reference/Workbooks.html
http://officetanaka.net/excel/vba/file/file05.htm
http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page1.htm

QVB.NETからAccess内のデータベースに列を挿入する方法について

VB.NETからAccess内のデータベースに列を挿入する方法について
御存知の方がおられましたらご享受ください。m(_"_)m

Aベストアンサー

テーブル変更の【ALTER TABLE】をSQLで流してみてはどうでしょうか?
テーブル変更のSQL文については、以下のサイトが参考になると思います。

http://www.techscore.com/tech/sql/03_02.html

ソースはこんな感じかな?
※実行をして確認はしていません

Dim Conn As New SqlConnection
Dim Cmd As SqlCommand

'DBオープン
Conn.ConnectionString = "コネクション文字列"
Conn.Open()

'SQL実行
Cmd = New SqlCommand("テーブル変更のSQL文", Conn)
Cmd.ExecuteNonQuery()

'DBクローズ
Conn.Close()


人気Q&Aランキング

おすすめ情報