ExcelからAccessにデータを取り込む方法

このQ&Aのポイント
  • Access初心者、VBA初中級者でもExcelからAccessにデータを取り込む方法を学びましょう。
  • Excelの表とAccessのDBの型が一致しない場合でも、特定の列のデータを特定のフィールドに取り込む方法をご紹介します。
  • TransferSpreadsheetを使って操作し、一度にデータを取り込むだけでなく、取り込み先や取り込む順番のカスタマイズも可能です。
回答を見る
  • ベストアンサー

ExcelからAccessにデータを取り込む方法

質問します。 Access初心者、VBA初中級者です。 VBAで、ExcelからAccessにデータを取り込んでいます。 ですが、Excelの表はAccessのDBの型と一致していません。取り込む場合、特定の列のデータをAccessの特定のフィールドに取り込むことはできますか? (たとえば、ExcelのA列のデータは、Accessの「品番」フィールドに入れる、B列のデータはAccessの「商品名」フィールドに入れる、というように。) 一時エリアに保存して、それを取り込む方法でもいいです。 現在TransferSpreadsheetを使っていますが、Rangeを指定して一度に全部もってきたいわけではないので、できれば取り込み先を設定したいと思った次第です。 また、Excelは使用行が決まっていないため、取り込みも、できれば 「カラ行になるまで1行ずつ取り込む」というようなコードにしたいです。 お手数をおかけしますが宜しくお願いします。

noname#105246
noname#105246

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です > rs.Open "テーブル名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic ここの部分は、ただ単にテーブルをオープンしたでけになります。 その後、rs.MoveNext 等で、処理対象のレコードに移動したりします。 で、 >   rs.AddNew は、新規レコードを追加しますよ、っていうものになります。 >  rs("品番") = oApp.Cells(iRow, 1) >  rs("商品名") = oApp.Cells(iRow, 2)   でフィールドに値を代入(設定)し、 > rs.Update で、登録しています。 処理の流れで、rs.AddNew しないでフィールドに値を代入し rs.Update すると これは、更新、になります。(ADOの場合) DAOの場合は、rs.Edit を記述し、これから更新しますよ、って指定します。 更新されるものは、現在参照できているレコードになります。 レコードセットを操作して、更新/削除/新規登録する場合は、 テーブルをオープンする際に、INSERT 等は指定する必要がありません。 SQLを発行して完結するもの(INSERT,DELETE,UPDATEなど)は、 一般的にアクションクエリとか呼ばれています。(クエリでの話ですが) これらを実行する時には、レコードセットをオープンする操作ではなく Execute するもので実行します。 例えば "DELETE * FROM テーブルA" を実行する時には、ADOでは CurrentProject.Connection.Execute "DELETE * FROM テーブルA" とかにします。 話がずれていっているような気がしてきましたが、わかる内容になって?ました?、、、

noname#105246
質問者

お礼

>30246kikuさま おそくなりました!ありがとうございます! まさにそのようなことが知りたかったのです。 本当に勉強になりました。ありがとうございます。 最後に一つお聞きしてもよいでしょうか(><) 色々、修正中に途中でバグったりすると、ExcelがOpenになったままになるらしく、 対象のExcelが編集中になったり、Excelが(手動で)開けなくなったりしてしまいます。 こういう場合はどうしたらよいのでしょうか。 Openしたら変数かなにかにExcelの内容を一括コピーして元のファイルはさっさとCloseする、とかできるのでしょうか。 甘えてしまってすみません。 どうぞよろしくお願いします。(><)

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です > こういう場合はどうしたらよいのでしょうか。 もっといい方法があると思いますが、私はタスクマネージャからExcelを終了させてます。 VBAでやろうとすると、起動しているExcelは以下の方法で得ることができます。   Dim oApp As Object   On Error Resume Next   Set oApp = GetObject(, "Excel.Application")   If (Not oApp Is Nothing) Then     ' ここで、ワークブックをループするなりして閉じるとか     '   End If ただ、Excel起動中に   Set oApp = CreateObject("Excel.Application") でExcel起動すると、Excelが複数立ち上がることになります。 (タスクマネージャで見るとわかると思います) なので、   Set oApp = GetObject(, "Excel.Application") で処理するのもループさせ、Excelが無くなるまで処理するのでしょうか。 ※確認作業中はファイルが壊れてもいいようにコピーは取っておきます。

noname#105246
質問者

お礼

>30246kikuさま ご回答ありがとうございました! やはりタスクマネージャが早いですよね。。 使う人が素人なのと、タスクマネージャに対象のものが乗ってこないのが気になるのですが とりあえずこちらに関しては、バグをださないこととOSの機能でなんとかしつつ、改善策を探そうと思います。 ありがとうございました!

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

処理は遅くなると思いますが、以下雰囲気で(ADOでの例) インポートしたいエクセルファイルが、mdb と同じフォルダに、 hogehoge.xls 名であったとします。(シート1枚) Dim rs As New ADODB.Recordset Dim oApp As Object Dim iRow As Long Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open Filename:=CurrentProject.Path & "\hogehoge.xls" rs.Open "テーブル名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ While( 空白行の判別 )   rs.AddNew   rs("品番") = oApp.Cells(iRow, 1)   rs("商品名") = oApp.Cells(iRow, 2)   rs.Update   iRow = iRow + 1 Wend rs.Close oApp.Quit Set oApp = Nothing ※ エラー処理は省いてます。 ※ ★では2行目から取り込みを設定 ※ 空白行の判別は、正式な記述に ※ シートが複数あって選択する必要があるのなら、追加してください。

noname#105246
質問者

お礼

>30246kiku様 ありがとうございます。 参考に使用してみたところ、 rs.Open "テーブル名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic のところで、 エラー「SQLステートメントが正しくありません。'DELETE','INSERT','PROCEDURE','SELECT',または'UPDATE'を使用してください」 が出てしまいました。 おそらくINSERTをしなければいけないのだと思いますが、 どこにどのように記述すればよいのでしょうか? お手数おかけしますがお教え下さいますか(><)

noname#105246
質問者

補足

たびたびすみません。 その後少しいじっていたら、出力されるようになりました! ありがとうございます。 ちなみに、DBへの書き込みのロジック(?)が微妙にわかっていません。 re.AddNew の部分が、書き込みますよ、という意味なのでしょうか? ここがわからないので、先程のように「SQLでINSERTしなきゃいけないんじゃないのか?」と思ってしまいました。

関連するQ&A

  • アクセスの外部データ(エクセル)の取り込み。VBA

    アクセスの外部データ(エクセル)の取り込み。VBAの質問です。 アクセス2003 エクセル2003 不要な行・列がある場合の外部データ取り込みVBAを教えて下さい。 今は、エクセルで削除して取り込んでいます。 アクセスに「得意先リスト」というテーブルを作っています。 コード(テキスト型)主キー 名称(テキスト型) フリガナ(テキスト型) 郵便番号(テキスト型) 住所1(テキスト型) 住所2(テキスト型) TEL(テキスト型) FAX(テキスト型) エクセルブック[得意先リスト.xls] シートは「リスト形式」のみです。 1~4行は不要。 5行目が見出しです。 A~AZ列までデータがあります。 必要な列は、B・C・D・F・G・H・M・N列です。 セルの書式設定は「文字列」です。 [アクセス エクセル インポート 行 列 削除]などでサンプルVBAを探しましたが見つからなかったので質問させて頂きました。 申し訳ありませんが、教えて下さい。

  • ExcelデータをAccessに取得させる方法

           エクセル           Access    A列   B列  C列      フェールド名  人 りんご みかん ばなな キャベツ    リンゴ  3   木村               木村  3    2    みかん  2   木村             小林             4    ばなな  4  小林               青木                   2    キャベツ 2  青木 のようにエクセルのデータでA列をAccessのフィールド名にし、もし無ければ、その項目名(りんご等)をフィールド名に追加させ、上の右図のようにAccessにデータを取得させるコードを作りたいと考えてます。  取得させる場合はExcellではなく、Access VBAで取得させたいです。  どんなコードを書いたらよろしいのですか?  分かる方がおられましたら、よろしくご指導くだされとうれしいです。  私のVBAのレベルですが、Access VBAは今回初めてで、Excel VBAは中級くらいかと思います。  よろしくお願いします。

  • ExcelかAccessで二つのデータが合っているかどうかを調べる方法を教えてください。

    二つのセル(フィールド)を比較して、そのデータが同じか違うか結果を別のセルに返したいのですが、そんなことって可能だったでしょうか。 データはA列とB列にほぼ同じデータがあり、その中の完全に一致してないデータだけを抽出したいのです。 行は約1500あります。 Access、Excelのどちらでも構わないのですが、方法をご存知の方がいらっしゃいましたら教えてください。

  • エクセル側からアクセスへデータ転送

    エクセル側からアクセスへデータを転送したく、 Sub Data_Add() Dim db As New ADODB.Connection Dim Rs As New ADODB.Recordset db.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Users\Owner\Desktop\A.mdb;" Rs.Open "B", db, adOpenStatic, adLockPessimistic Rs.AddNew Rs!a = Worksheets("1").Range("A1").Value Rs!b = Worksheets("1").Range("B1").Value Rs!c = Worksheets("1").Range("C1").Value Rs!d = Worksheets("1").Range("D1").Value Rs!e = Worksheets("1").Range("E1").Value Rs.Update Rs.Close db.Close これで、エクセルからアクセス"A"のテーブル"B"のフィールド"a"にエクセルの"A1"を、フィールド"b"にエクセルの"B1"をという風に、セル1つづつを転送させる事はできましたが、セル1つづつでは無く、A列をフィールド"a"に、B列をフィールド"b"にという風に、列ごと追加するにはどの様にしたらいいですか? 又、追加ではなく更新(すでにあったデータに追加するのではなく、上書き)するにはどの様にしたらいいですか? 追加、更新それぞれしたいので、誰か教えて頂けませんか? よろしくお願いします。

  • Excel VBA Accessでデータ取り込み

    Excel VBA、Access VBAについてお教え下さい。 「My_Excel.xlsm」というファイルがあります。このファイルにはボタンが1つあります。 このボタンを押すことにより、「Imp_Excel.xlsx」というファイルを取り込みたいと思います。 取り込み先ですが、「My_Excel.xlsm」に取込むのではなく、Accessの「My_Access.accdb」の「T_MyTable」というテーブルに取り込みたいと思っています。 Accessから直に「Imp_Excel.xlsx」をインポートするには、TransferSpreadsheetを用いれば比較的簡単にデータをAccessに取り込むことができるのですが、「My_Excel.xlsm」をまたいでAccessに取り込みたいので、TransferSpreadsheetは使えません。 やり方としては、 My_Excel.xlsxを開く。 レコードセット取得。 レコードセットがEOFになるまでまわして、SQLのINSERT、またはAddNewメソッドを使用して1件1件挿入していくしか方法はないでしょうか? 今のところ、私が思い浮かぶのは上記の方法なのですが、何かもっと簡単にやれるような方法はあるでしょうか?よろしくお願いします。

  • AccessのデータをExcelに貼り付け

    AccessのデータをフィルターしてExcelに貼り付けるには、AccessとExcelのどちらのVBAを使えば良いでしょうか。 前提:Accessに10フィールド100行くらいのデータがあり、Excelに氏名と日付を入力する欄がある。 処理:AccessのデータをExcelに入力した氏名と日付でフィルター(AND検索)→フィルターしたままExcelに貼り付け→そのデータをExcelの関数とVBAで処理(複雑な関数なのでAccessで処理できない)

  • Access2007へのデータインポート

    Excel2007で作った、2列だけの40,000行にわたるデータがあります。この1列目には数値が入っていて、複数の行に同じ数値が入っています。2列目は文字列です。 これをAccess2007で作ったデータベースに取り込みたいのです。 データベースにはIDフィールド(固有数値)とメモ型に規定されたフィールドがあり、Excelの1列目の数値がAccessのIDフィールドと一致したら、Excelの2列目の文字列を、メモ型に規定されたAccessのフィールドにインポートする作業を目指しています。 結果的に、メモ型に規定されたAccessのフィールドにはたくさんの文字列が連なるようにしたいのですが、方法がわかりません。 教えていただける方がおられましたらうれしいのですが・・・。どうぞよろしくお願いいたします。

  • ExcelデータをACCESSへエキスポート

    ExcelデータをADOを使いACCESSへエキスポートしたいのですが、 データ型がちがうというエラーが出てエクスポートできません。 対処法を教えてください。 Excelシートの次のようなデータをAccessへエクスポートしようと しています。 A B C D E F G(列) 1 ID  番号 地域  客先  売上金額 種類 数量 2    K01 東京    a社  100,000    イ  4 3    K02 神奈川  b社  50,000 Excelシートの1行にフィールド名があり、レコードがA2:G3入って いるとします。Accessの売上テーブルにExcelのフィールドと同じ 順番のフィールド名があった時、Excel VBAにてADOを使いAccess にデータを貼り付けようとすると、データ型がちがうとエラー表示 が出てしまいます。A2:A3はAccessの自動発番機能を使うのでいつも 空です。又F3:G3はデータがこの例のように空の場合もあります。 Excel側もAccess側もフィールドのデータ型は同じにしたつもりです が、レコードが空があることがエラーの原因でしょうか。もしそうなら どう対処すればよいのでしょうか。

  • AccessからExcelへ出力

    Access2003からExcel2003へ出力したいのですが、 クエリに3つのフィールドがあるとして、 1つ目のフィールドをExcelの1行目、 2つ目を2行目、3つ目を3行目とゆうことはできるのでしょうか? VBAは勉強中です。 よろしくお願いします。

  • ACCESSへエクセルデータのインポートについて

    お世話になります。 ACCESSのデータとしてエクセルをインポートしたいのですが、エクセルのデータ は、11行目がフィールド名になり、13行目からデータが始まっている状態です。 このようなファイルはACCESSにインポートすることが可能でしょうか 可能であれば、定期的にインポートをしたく、情報の信憑性を保ちたいと考えております。 宜しくお願い致します。