ExcelからAccessへのデータ書き込み方法をご教示ください

このQ&Aのポイント
  • ExcelからAccessへデータを書き込もうとしていますが、うまくいきません。フィールド名に問題があるようです。
  • Accessのテーブルで設定したフィールド名とExcelでの書き込み時のフィールド名が一致していないため、エラーが発生しています。
  • フィールド名を確認し、ExcelからAccessへの正しい書き込み方法を教えてください。
回答を見る
  • ベストアンサー

ExcelからAccessへの書き込み(VBA)

ExcelからAccessへデータを書き込もうとしていますが、うまくいきません。原因は、フィールド名にあるような気がしますが、どなたかアドバイス頂けないでしょうか?宜しくお願いいたします。 Accessのテーブルで、フィールド名を ログイン名、名前、年齢、血液型、住まい1、住まい2、仕事、確認日時 としエクセルから With RecSet .Open MySQL, Excite_DB, , adLockOptimistic .AddNew With .Fields .Item("ログイン名").Value = "test_LogIn" .Item("名前").Value = "山田" .Item("年齢").Value = "25" .Item("血液型").Value = "A" .Item("住まい1").Value = "東京都" .Item("住まい1").Value = "新宿区" .Item("仕事").Value = "会社員" .Item("確認日時").Value = DateValue("2007/05/04 12:20") + TimeValue("2007/05/04 12:25") End With .Update .Close End With と書き込もうかとしたところ、実行時エラー:3265 要求された名前、または、序数に対応する項目がコレクションに見つかりませんとでます。が発生します。 そこで、 For Each MyField In .Fields Debug.Print MyField.Name Next とフィールド名を取得したところ ログイン名、Expr1001、Expr1002、Expr1003、住まい1、Expr1004、Expr1005、確認日時 となります。 そこで、書込み時のフィールド名を、"Expr1001"とすると今度は、 実行時エラー:-2147217887 UpdateまたはCancelupdeteメゾッドには、対応するAddNewまたは、Editメゾッドが必要ですになります。 よろしくお願いいたします。 Accessでは、間違いなくフィールド名が設定されているのですが、

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

> With RecSet > .Open MySQL, Excite_DB, , adLockOptimistic の2行目で渡している SQL にミスがあると思います。SQL の内容 は省略されているので、具体的にはアドバイスできませんが、 見直してみて下さい。 > Expr1001 これは Access が設定する仮フィールド名です。これが発生する 一例をあげれば、 ・名前: tMember ・フィールド: ID, Shimei, Birthday というテーブルがあったとして、次のような SQL を渡した場合。   SELECT ID,Shimei,Birthday,Shimei FROM tMember; [ Shimei ]フィールドを2重で Select してます。 この時、一方は[ Shimei ]という正しいフィールド名で、もう一方 は [ Expr1001 ] というフィールド名になってしまいます。

vba_minarai
質問者

お礼

お返事ありがとうございます。 仰る通り、SQLに間違いがありました。 読み込みのSQLと書込みのSQLを共有していたのですが、読み込みの時にNullの値を文字列0に変換させるために、 SELECT ID,Shimei,Birthday & '', FROM tMember; と、& ''を挿入していたのが原因でした。 読み出しでは上手くいっていたので、SQLには絶対に間違いはないと思いこみ1日以上悩んでいました。 本当にありがとうございます。助かりました。 & ''を削除したところ上手くいきました。

関連するQ&A

  • チェックボックスの値を新規でレコードへ格納したい(Access2003 ADO)

    宜しくお願いします。 Access2003(WinXP)です。ADOで書いています。 テーブルへ新しいレコードを作成していれる時と 既にあるレコードへの編集なのですが、 新規の時は AddNew を書くだけで 他は同じコードを利用しています。 テキストボックスやコンボボックスの値は入るのですが チェックボックスのTrue、Falseのところで 新規の時だけエラーになります。 編集の時は大丈夫です。 rs.Fields("フィールド名").Value = Form.チェックボックス名.Value と入れているのですが、いけないのでしょうか。 ちなみにDAOで書いていたのを途中でADOに変えています。 rs.Fields!フィールド名= としてもだめでした。 分かる方、お願いします。

  • アクセスのD○○関数について

    アクセスのD○○関数 (DCountなどDから始まる関数) は、(expr, domain, [criteria]) となっていますが、 expr→フィールド名 domain→テーブル名 で フィールド名は[]と""で囲わなくてはならなくて ("[日付]"など) フィールド名は[]は付けちゃいけないけど""で囲わなくちゃいけない。 という認識で合っていますか? よろしくお願いします。

  • DAOでACCESSをREADしてEXCELに表示

    お世話になります。 初心者ですが、DAOを使ってACCESSのテーブル(名称”テーブル1”)を全READして全データをEXCELに表示するところまでは出来ました。 (やりたいこと1) 今度は下記の様に"ボタン1"をクリックされたら、Accessに下記の様なデータ(今は"taro"という固定でデータですが将来的には可変的する予定です)を追加したいのですが、既にAccess側に社員番号と氏名が同じレコードがあった場合には追加させないロジックを追加したいのです (やりたいこと2) "ボタン1"をクリックした時に、追加される"taro"のデータはAccessの"テーブル1"の一番下に追加されるようにしたいです。現在は中途半端にテーブル1の真ん中あたりに追加されます。 上記2点につきまして、どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 Windows XP SP3 Excel2003 Sub ボタン1_Click() Dim rst As DAO.Recordset Dim fld As DAO.Field Dim sht As Worksheet Dim rcnt As Long, ccnt As Long '行カウンタ、列カウンタ ' On Error GoTo Err_DAOSample If DBE Is Nothing Then Set DBE = New DAO.DBEngine End If If DB Is Nothing Then Set DB = DBE.OpenDatabase("C:\TEST.mdb") End If Set rst = DB.OpenRecordset("SELECT * FROM テーブル1", dbOpenDynaset) Set sht = ActiveSheet ' レコード追加 With rst .AddNew .Fields("社員番号") = "00000010" .Fields("氏名") = "taro" .Fields("所属") = "管理部" .Fields("年齢") = 19 .Update End With End Sub

  • ACCESSのクエリの関数について

    ACCESSのクエリの関数について 列の標準偏差はテーブルの集計で出来ますが、レコードの標準偏差を求めたいと思います。 クエリの関数で、StDev(expr)のexprにレコードの[テーブルの名前]![フィールド名前]を 入れる時には","で続けるのか? この方法では式が作成出来ません。

  • VBAでのフィールド追加処理

    AccessVBAにて既に定義されているテーブルにフィールドを追加する処理にて、'**の部分でエラー(同名のフィールドが既にあるエラー)が起きます。以下の記述をしています。 フィールド追加は2つのテーブルに対して実施しています。 Do While iC < rstH.Fields.Count For Each fldLoop In tdfM.Fields sName = rstH.Fields(iC).Value If sName = fldLoop.Name Then 'H_workにはフィールドを設定 tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) Else Set fd = tdfM.CreateField(sName, dbText, 100) '空文字列の許可=true fd.AllowZeroLength = True tdfM.Fields.Append fd '** tdfM.Fields.Refresh 'Test tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) End If iC = iC + 1 If iC = rstH.Fields.Count Then Exit For End If rstH.MoveFirst Next fldLoop Loop 既に設定されているフィールド名の場合は、If sName=fldloop・・・の部分を通るはずですが、何故か 想定と違った分岐をしてしまっています。原因が解りません。どなたか教えて下さい。

  • Access2000上でのCStrコマンドの記述に関する質問です

    いつもお世話になっております。 Access2000で、あるデータをCSVファイルに変換しようと思って、各方面のご意見により、VBAで下記の通り記述し、実行致しました。 変換するフィールドの数が少なければ問題なく実行できますが、そのフィールド数が34種類以上になれば、「行継続文字( _ )を使いすぎています」との警告と共にエラーが発生します(なお、今回実行したいのは34種類のフィールドです)。 「CStr(adoRs.Fields("フィールド1").Value) ~ (adoRs.Fields("フィールド34").Value) 」と、1行で記述する等、何か良い方法がないものかと悩んでおります。 もし、解決方法をご存じの方がおられれば、その方法を教えて頂きたく、宜しくお願い致します。 ’--(ご参考)---------------------------------------------------- Dim adoRs As New ADODB.Recordset Dim strsql As String Dim strFile As String strsql = "SELECT フィールド1,フィールド2, ・・・・フィールド34" & _ "FROM ○○ファイル ORDER BY フィールド1" adoRs.Open strsql, CurrentProject.Connection strFile = "C:\AAAデータファイル.CSV" Open strFile For Output Access Write As #1 Do Until adoRs.EOF Write #1, _ CStr(adoRs.Fields("フィールド1").Value), _ CStr(adoRs.Fields("フィールド2").Value), _               ・                ・                ・ CStr(adoRs.Fields("フィールド34").Value) adoRs.MoveNext Loop adoRs.Close Close #1 ’---------------------------------------------------------

  • [VBA] ADOの Clone と AddNew

    Access VBA 学習中の初心者です。ADOについて教えて下さい。 RecordsetオブジェクトのCloneメソッドを使用してレコードのコピーを行う以下のプロシージャで、 If Not rs.EOF Then の存在意義がわかりません。 1. rsClone に対象のレコードがあった場合は次行からの処理をする、ということであれば If Not rsClone.EOF Then にすれば良いかと思うのですが、それでは違いますでしょうか? 2. とある人に聞いたところ、 「rsのカレントがEOFだとAddNewでエラーになるから、そのエラー回避のためそうなっている」 と言われたのですが、 テキストやヘルプで AddNewメソッド についてそのような注意事項を見つけられませんでした。 自分なりに試してみてもその条件下でエラーになりませんでした。(試し方に自信ないですが。) AddNewメソッドを使う際にEOFであるかどうか気にした方が良いものなのでしょうか? 質問が分かりづらく、ご回答頂くにあたり追加の情報が必要でしたらご指摘下さい。 「プロシージャをこうした方がわかりやすい、適切」などのご意見も歓迎です。 どうぞよろしくお願いいたします。 -------------------------- Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim rsClone As ADODB.Recordset Dim myField As Variant, cnt As Integer Set cn = CurrentProject.Connection rs.Open "名簿", cn, adOpenStatic, adLockOptimistic Set rsClone = rs.Clone(adLockReadOnly) rs.Clone.Bookmark = rs.Bookmark rsClone.Find "名簿 like '山田 太郎'" If Not rs.EOF Then                 ←★★★質問★★★ rs.AddNew cnt = 0 For Each myField In rsClone.Fields rs.Fields(cnt) = myField cnt = cnt + 1 Next End If rs.Update rs.Clone.Close Set rsClone = Nothing rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub

  • ADOでエクセルを読む時にフィールドを序数でアクセスしたい

    開発環境はVC++.Net Office2000 SDK開発  お世話になります。 ExcelをADOを使い中身を見ようとしているのですが、 フィールド名が無いので序数でフィールドにアクセスしようとしていますが 「要求された名前、または序数に対応する項目がコレクションで見つかりません」 とエラーが出てしまいます。 GetItemに序数を入れているつもりなのですがうまく行きません。 ただ、列名を入れればアクセスできるので、序数の指定以外は問題ないと思っています。 プログラムは以下のようにしていますが、何か解決の糸口はありませんか? TESTHRxls(lpRecordset.CreateInstance(__uuidof(Recordset))); TESTHRxls(lpRecordset->Open(bsCommand,bsConn,adOpenDynamic,adLockPessimistic,adCmdText)); lpRecordset->MoveFirst();//先頭へ移動 while(!(lpRecordset->EndOfFile)){ vIndex=1; _bstr_t testValue = lpRecordset->Fields->Count; int testValue2 = lpRecordset->Fields->GetItem(vIndex)->Value; lpRecordset->MoveNext(); }//--while(!(lpRecordset->EndOfFile)){ lpRecordset->Close();

  • ExcelからVBAを使ってAccess2007のデータをコピーしたいのですが、うまくできません

    Access2000のDBをAccess2007に移行しましたが、Excel2007からAccessのDBを呼び出す事ができなくなりました。 DBを呼び出す方法はExcelからVBAでDBに接続し、オブジェクトを開く方法をとっていました。 AccessのDBの拡張子が○○.mdbならば接続できますが、○○.accdbになると接続できません。 VBAをDAOからADOに変更してみましたが、やはり、だめでした。 何かいい方法はないでしょうか。 お忙しいところ、申し訳ございませんが、何卒、よろしくお願い致します。 ちなみに下記のようなVBAを組んでいます。 Dim objDB As New ADODB.Connection Dim rcsTQ As New ADODB.Recordset Dim DBname Dim TQname Dim dbCol As Integer Dim rf As Field DBname = "\データの整理1.accdb" 'パス名とデータベース名を指定する。 TQname = "T受付データ" 'テーブル名、クエリー名を指定する。 'データベースに接続する objDB.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & DBname 'テーブル、クエリを開く rcsTQ.Open TQname, objDB '書き出しをする Range("a10").Value = "テスト書き出し" dbCol = 0 For Each rf In rcsTQ.Fields dbCol = dbCol + 1 Cells(11, dbCol).Value = rf.Name Next rf Range("a12").CopyFromRecordset rcsTQ objDB.Close Set objDB = Nothing End Sub

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

専門家に質問してみよう