• ベストアンサー

エクセルからアクセスへ

お世話になります。 エクセルからVBAでアクセスのテーブルに レコードを追加させたいのですが、 下記の記述でいきなり mydb as database の所が 青く塗られ 「コンパイルエラー:ユーザー定義型は定義されていません」 とエラーになってしまします。 また、databaseのdが小文字なのも気になります。 参照設定での項目チェックが必要なんだと思うのですが どこにチェックしたら良いのか、またそれだけではダメなのか 分かりません。 どなたかご教授下さい。     記 Dim mydb As database Dim myrs As Recordset Dim myrnge As Range Dim myrow As Long

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

データベース操作 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130.html こちらが参考になるのでは?

miruchoko
質問者

お礼

参考になりました。 ありがとうございます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

アクセス側で、それも操作でやれば簡単なのに。 ACCESSVBAでもエクセルからなどのインポートがある。 エクセル側から、VBAでやるというのは、勉強・練習のためか。 背伸びしてないですか。課題丸投げに近いが、やってみたから、まあ例示を挙げておく。 DAOの方でやっているが、ADOとかは似ているし、SQLでも出来るとおもうが、その中でDAOが易しいかな。WEBを調べれば判るよ。 実行前に、参照設定 - Microsoft DAO 3.X Object Libraryにチェックを行うこと。 ーー Sub test02() 'VBE - ツール - 参照設定 - Microsoft DAO 3.X Object Libraryにチェック Dim rs As DAO.Recordset Dim db As DAO.Database Set ac = CreateObject("Access.Application") Set db = OpenDatabase("db2.mdb") Set rs = db.OpenRecordset("生徒") MsgBox "フィールド数=" & rs.Fields.Count rs.MoveLast rs.AddNew rs.Fields(2) = "山村" rs.Fields(3) = "岡山" rs.Fields(4) = "元町小学校" rs.Fields(5) = 4 rs.Update End Sub 私の場合「db2」というmdbがあり 「生徒」というテーブルがあり ID 生徒番号 氏名 県 学校 学年 7 8 上村 東京 山田南小学校 2 というようなフィールド構成になっていて、そこの最終の次にに追加 した例。テスト済み。 質問者の場合に合わせてやってみてください。 あとエクセルのシートの値との関連など判るだろう。省略。 エクセルの世界でやっているから、フィールドに代入するコードの右辺に=(シート指定).Cells(i,j) で済むし、MoveLastの次からのAddnewをForNextででも繰り返すと出来るだろう。

miruchoko
質問者

お礼

うまくいきました。 ありがとうございます。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

こんにちは、 ODBCで、接続して、コーディングしてみては、 いかがですか。??? http://www.geocities.jp/tomtomf/index.html

miruchoko
質問者

お礼

参考になりました。 ありがとうございます。

関連するQ&A

  • ACCESSの宣言

    Private Sub コード_AfterUpdate() Dim Mdb As Database Dim Mtb As Recordset Dim sqlstr As String って、始めに宣言しますが、いざプログラムを走らせてみると、Dim Mdb As Database で "コンパイルエラー ユーザー定義型は定義されていません" になってしまいます。ここでひっかかるともうどうにもできないです。 なぜ、この宣言はいけないのでしょうか?

  • AccessでのSQL文

    AccessでSQL文を使おうと思うのですが、 Dim mydb as Database とすると、ユーザ定義型は定義されていません とエラーになります。 また、mydb as と打つと変数の方の一覧が出ますがその中にもDataBaseがありません。 サンプルの家計簿を開いてみるとSQL文を使っているのにエラーは出ません。 ヘルプを見てみるとDAOが関係しているようなのですが良くわかりません。 AccessでDatabase型を使うにはどうすればいいのでしょう。 教えてください。 Access2000です。

  • Access2002 VB がエラー

    Access2002 VBで以下のコーディングをしてます Dim db As Database Dim rs As Recordset Dim fld As Field Set db = CurrentDb Set rs = db.OpenRecordset("ConvertChar") これを実行するとdb宣言行で以下のエラーが表示されます。 コンパイルエラー: ユーザ定義型は定義されていません。 これは何が原因でエラーとなるのでしょうか? 宜しくお願いします。

  • MSAccess で database定義されていない?

    Accessでレコードのデータを読もうと標準モジュールに次のプログラムを作りました Option Compare Database Public longTATENO As Long Public longYOKINO As Long Public Sub no_gen() Dim dbs As database Dim RS As Recordset Set dbs = CurrentDb Set RS = dbs.Openrecordset("M_基本情報") longTATENO = RS![立替処理No] longYOKINO = RS![預金処理No] End Sub 別のフォームを開くときに no_gen と書きそのフォームを開くと dbs As database の所が反転表示になり コンパイルエラー  ユーザ定義型は定義されていませんと出ます。 何が悪いのでしょう? Access初心者ですよろしくお願いします

  • Accessのバージョンの違いでうまく動かなくなるんですか?

    VBA(Access95)で作成されたツールをAccess2000で動かすと、 コンパイルエラーになってうまく動きません。 今のところエラーになっている箇所は、 Dim xxx As Recordset Global xxx As Database です。 どうすれば問題なく動くようになりますか? やっぱり、2000ではダメなんでしょうか?? よろしくお願いします。

  • Access2000のVBAでコンパイルエラー

    Access2000のVBAで初歩的な質問があります。 「tblShi」というテーブルがあります。 フォームにボタン「btn1」を作り、 デザインビューでボタンのプロパティを開いて イベントのクリック時のところで、 「ビルダの選択」をコードビルダにしました。 そして「Private Sub btn1_Click()」の中に、最初に   Dim db As Database という記述をしています。 このフォームを開いてボタンを押すと、なぜか   コンパイルエラー   ユーザ定義型は定義されていません というエラーが表示されてしまいます。 たしかにコードを書いているときに、   Dim db As のところまで入れると、小さいウィンドウの中に たくさん候補が表されますが、 その中に「Database」というのがないです。 「QueryDef」とか「Workspace」とかもありませんでした。 (「Recordset」はありまして、それはコンパイルが通ります) いろいろな解説を見ても、やはり最初はどれも 「Database」型を宣言しているようなんですが… 何がよくないのでしょうか。 もしわかる方がいらっしゃったら教えてください。

  • ACCESS2007でのDAO(?)につきまして

    お世話になっております。 ACCESSの件で色々教えて頂き、とても感謝しております。 つきましては、ACCESS2007で疑問に思える点がありましたので 以下に記述いたします。 あるACCESS2007のVBAの記述で Dim myDB As Database Dim myQueryDef As QueryDef なる変数定義がされているのを見たのですが 質問があります <質問1> 上記の定義はDAOを使用しているという事になるのでしょうか? <質問2> DAOであるならば Dim myDB As DAO.Database Dim myQueryDef As DAO.QueryDef と記述するのが正しいのではないでしょうか? (Option Explicitは記述してあります) 私には謝った記述に見えるのですが、動作 している理由がわかりません。 質問が変かもしれませんが、どなたか教えて 頂けるありがたいです。

  • Access Excelへ出力時にエラー

    お世話になります。 下記にてローカルクエリの抽出結果をExcelへ出力しております。  Dim obj As Object  Dim MyDB As DAO.Database  Dim MyRs As DAO.Recordset  Dim qdf As DAO.QueryDef  Dim out_path as String  Dim sheet_name as String  out_path = "出力先ファイルのフルパス(ファイル名含む)"  sheet_name = "出力先シート名" Set MyDB = CurrentDb Set obj = GetObject(out_path, "Excel.Sheet") obj.Application.Visible = False obj.Parent.Windows(1).Visible = True Set qdf = MyDB.QueryDefs("ローカルクエリ名") With qdf .Parameters("[forms]![test]![id]") = Forms!test!id Set MyRs = .OpenRecordset .Close End With obj.Worksheets(sheet_name).Select   ← (注) obj.Application.Cells(24, 1).CopyFromRecordset MyRs ※ローカルクエリの抽出条件としてフォーム上のテキストボックスを  参照しているため、Parametersを使ってます。 とりえあず上記で抽出結果は出力されます。 但し、適当なExcelファイルを開いた状態で実行すると、(注)の箇所で 「実行時エラー1004 WorksheetクラスのSelectメソッドが失敗 しました」となってしまいます。 なお、Selectの箇所をActiveにすると「実行時エラー438 オブジェクトは このプロパティまたはメソッドをサポートしていません。」と表示されます。 また、obj.Application.Visible = False の箇所で開いていた Excelファイルが閉じてしまうのですが、そういうものなのでしょうか。 勉強不足で大変恐縮ですが、ご教授の程、宜しくお願い足します。

  • VB5+SQL2000での ** TRANSACTIONについて(ADO)

    環境:VB5(SP3)+SQL2000(SP1) VBで、BEGIN TRANSACTIONを定義し、その後更新用DBを更新する前に、ストアドプロシージャを利用せずDBを検索した場合、問題無く更新用DBへの更新に対して(ROLLBACK/COMMIT) TRANSACTION が効くのですが、ストアドプロシージャで検索した場合、(ROLLBACK) TRANSACTION が効きません。 分かりづらいですがサンプルを記します。 Function Test() Dim MyRs As New ADODB.Recordset Dim MyRs2 As New ADODB.Recordset : MyDB.Execute "BEGIN TRANSACTION TEST999",,adCmdText+adExecuteNoRecords : '(A)不具合未発生パターン 'レコードセットを開く 'このように、レコードセットを作成した場合問題なし。 MyRs.Open "SELECT * FROM TESTDB..テスト",MyDB,adOpenStatic '(B)不具合発生パターン 'ただし、上のSELECT文をストアドプロシージャで開いた場合、ROLLBACKが効かない 'レコードセットを開く(正常に(ROLLBACK)TRANSACTIONが動作せず、UpDate時にCommitしている) 'MyRs.Open "TESTDB..TEST001",MyDB,adOpenStatic : MyRs2.Open "SELECT * FROM TESTDB..更新テスト",MyDB,adOpenKeyset,adLockPessimistic If Err <> 0 Then 'Error処理 End If If MyRs2.EOF Then MyRs2.AddNew MyRs2![FLD1] = MyRs2![FLD1A] Else MyRs2![FLD1] = "TEST" End If MyRs2.UpDate 'ここは正常終了。(Err = 0) 'テスト用にエラー設定 Err = 1 if Err <> 0 then '(B)不具合発生パターンの場合、ROLLBACK をしても、DBに登録されてしまう。 MyDB.Execute "ROLLBACK TRANSACTION TEST999",,adCmdText+adExecuteNoRecords Exit Function End If MyRs.Close MyRs2.Close SmileDB.Execute "COMMIT TRANSACTION TEST999",,adCmdText+adExecuteNoRecords End Function

  • Access 抽出結果をExcelへ出力

    お世話になります。 VBAより抽出結果をExcelへ出力したいと思います。 とりあえず、抽出結果をExcelの特定の箇所へ出力することは 出来たのですが、今回は見出し(フィールド名)もあわせて出力 したいところです。 見出しの部分を出力するにはどうすればよいのでしょうか。 恐らく見出し部分と抽出結果部分はそれぞれ別々に出力 しなければならないとは思うのですが。。 なお、見出し部分は固定の文字列ではないため、毎回フィールド名を 取得し、それを見出しとして出力する必要があります。 抽出結果(集計クエリ)は、 項目 yyyy年mm月 ・・・・ yyyy年mm月 数量A      500   ・・・・    1200        数量B      200   ・・・・     800 というような感じで、現在は 数量A      500   ・・・・    1200        数量B      200   ・・・・     800 の部分だけ出力できている状況です。 Dim obj As Object Dim MyDB As DAO.Database Dim MyRs As DAO.Recordset MySQL = SQL文(集計クエリ) Set MyRs = MyDB.OpenRecordset(MySQL) obj.Worksheets(シート名).Select obj.Application.Cells(23, 1).CopyFormRecordset MyRs 上記でExcelへ出力してます。 ご教授の程、宜しくお願い致します。

専門家に質問してみよう