• ベストアンサー

エクセルのデータをアクセスへ自動インポート(エクスポート)したい。

いつも大変お世話になっております。m(_ _)m 質問させてください。 エクセルに存在するデータベースのデータを、アクセスにインポートしたいのですが、アクセス側の「取り込み」みたいなボタンを押せば、ある程度自動的にするような仕組みを作りたいです。 「ある程度」というのは、「ボタン1つですべて実行されるように」というところまで自動化されなくても大丈夫です。 参照先、インポート先のテーブル名などのマウス操作は入っても大丈夫です。 そのようなことができますでしょうか? できるだけ具体的に教えていただけると助かります。 よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 VBAで、DoCmdオブジェクトのTransferSpreadsheetメソッドでよいのではありませんか?  DoCmd.TransferSpreadsheet acImport,       [シートのタイプ],       [テープル名],       [ファイル名],       [Excel側のフィールドを使うかどうか],       [Excelの範囲] 実際のコード  DoCmd.TransferSpreadsheet acImport, , "TestTable", "D:\Test.xls", True, "Sheet1!A1:D20" "Sheet1!A1:D20" これはなくてもよいです。

xchoxcho
質問者

お礼

回答ありがとうございます。 こちらの質問の仕方に不足がありました。 たとえば、エクセルのデータは毎日少しずつ増えていきます。 その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。 頻度はほぼ毎日です。 それを自動化したいのですが、良い方法はないでしょうか?

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 #2 のWendy#02 です。 確かに、DoCmd.TransferSpreadsheet acImport では、Append は、無理かもしれませんね。Excel側で、差分を別シートに出して、TransferSpreadsheet acImportなら、出来ますが、Access 側が中心になると、差分は、取り出すことは出来ても、フィールド情報がないので、Append できません。そうすると、私の知っているのは、Adoぐらいしか技術がありませんので、以下のようなものを作ってみました。 Const は、それぞれ入力してください。また、テーブル名・フィールド名は、それぞれ入れてください。本来は、テーブルのレコード数を別に数えるつもりだったのですが、いっしょにしてしまいました。 なお、今回は、テーブルは、一旦閉じないと更新が分りません。 '----------------------------------------- Option Compare Database Dim myArVal As Variant Dim RightCol As Integer Const Fname As String = "Test.xls" 'Excelブック名 Const ShName As String = "Sheet1" 'シート名 Const RightColA1 As String = "D" '右端の列名 Sub Excel_Apend_ImportSample1() Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim mySQL As String Dim cnt As Long Dim dbRow As Long Dim i As Long  Set cn = CurrentProject.Connection  mySQL = "SELECT Count(TestTable.フィールド1) as cnt from TestTable"  rs.Open mySQL, cn, adOpenStatic  dbRow = rs!cnt  rs.Close  Call ExcelOpen(dbRow)  On Error GoTo RsClose  rs.Open "TestTable", cn, adOpenStatic, adLockOptimistic  With rs   For i = LBound(myArVal, 1) + 1 To UBound(myArVal, 1)   .AddNew    !フィールド1 = myArVal(i, 1)    !フィールド2 = myArVal(i, 2)    !フィールド3 = myArVal(i, 3)    !フィールド4 = myArVal(i, 4)    .Update   Next i  End With RsClose:  rs.Close: Set rs = Nothing  cn.Close: Set cn = Nothing  If Err.Number > 0 Then   MsgBox Err.Number & " " & Err.Description   Err.Clear  Else  Beep  End If End Sub Sub ExcelOpen(FirstRow) Dim xlApp As Object Dim xlshLastRow As Long Dim xlshAdd As String  On Error GoTo Quit 'デフォルトの位置にない場合は、ドライブ\フォルダ をつける  Set xlApp = CreateObject("Excel.Application")  With xlApp.Workbooks.Open(Fname)   xlshLastRow = .Worksheets(ShName).Range("A65536").End(xlUp).Row   'dbのレコード数に+2(フィールド行分+1) ~ Excel の最後の行   xlshAdd = "A" & FirstRow + 1 & ":" & RightColA1 & xlshLastRow   myArVal = .Worksheets(ShName).Range(xlshAdd).Value   .Close  End With Quit: If Err() > 0 Then  MsgBox Err.Description End If xlApp.Quit Set xlApp = Nothing End Sub

xchoxcho
質問者

お礼

回答ありがとうございます。 また、返事が遅くなってすみません。 何度もご丁寧な回答をしていただき、本当にありがとうございます。 上記に挑戦してみます。(私自身もVBAには自信がありませんがやってみます) また分からないことがあったら補足させていただくと思いますので、まだ締め切りませんが・・・ よろしくお願いします。m(_ _)m

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

アクセスに「外部データの取り込み」「インポート」「エクセルファイル」 の「操作」があるのをご存知ですね。 にもかかわらず、「自動的」に拘るのですか。 であればVBAでの処理になると思いますが、質問の書き方からして不安を覚えますが、VBAの回答を、自分の場合に当てはめて、修正はできますか。 >毎日少しずつ増えていきます。その「増えた分だけ」インポートする。 (#1の補足)データを入力した日付はエクセルデータにありますか。その日単位にアクセスに送ってはどうでしょう。 エクセルで日単位にデータを別シートに分けるのはどうするか判りますか。

xchoxcho
質問者

お礼

回答ありがとうございます。 また、お返事が遅くなりすみません。 アクセスに「外部データの取り込み」があるのはもちろん知っています。 操作する側の問題で、できたら(いや、確実に)「自動化」したい状況です。 お手数おかけしてすみません。

  • tak2003
  • ベストアンサー率32% (174/540)
回答No.1

エクセルで作ったデータをCSVで吐き出して、 アクセスでインポートすると理解すればよろしいでしょうか? アクセスのフォームにインポートボタンを作成してクリックイベントで VBAが起動するように作ればよいと思います。 詳しくは下記のHPを参考にしてみてください。 http://www.accessclub.jp/bbs3/0067/superbeg25315.html

参考URL:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23127&fo
xchoxcho
質問者

お礼

回答ありがとうございます。 こちらの質問の仕方に不足がありました。 たとえば、エクセルのデータは毎日少しずつ増えていきます。 その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。 頻度はほぼ毎日です。 それを自動化したいのですが、良い方法はないでしょうか?

関連するQ&A

専門家に質問してみよう