- ベストアンサー
エクセルのデータをアクセスへ自動インポート(エクスポート)したい。
いつも大変お世話になっております。m(_ _)m 質問させてください。 エクセルに存在するデータベースのデータを、アクセスにインポートしたいのですが、アクセス側の「取り込み」みたいなボタンを押せば、ある程度自動的にするような仕組みを作りたいです。 「ある程度」というのは、「ボタン1つですべて実行されるように」というところまで自動化されなくても大丈夫です。 参照先、インポート先のテーブル名などのマウス操作は入っても大丈夫です。 そのようなことができますでしょうか? できるだけ具体的に教えていただけると助かります。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 VBAで、DoCmdオブジェクトのTransferSpreadsheetメソッドでよいのではありませんか? DoCmd.TransferSpreadsheet acImport, [シートのタイプ], [テープル名], [ファイル名], [Excel側のフィールドを使うかどうか], [Excelの範囲] 実際のコード DoCmd.TransferSpreadsheet acImport, , "TestTable", "D:\Test.xls", True, "Sheet1!A1:D20" "Sheet1!A1:D20" これはなくてもよいです。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 #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
お礼
回答ありがとうございます。 また、返事が遅くなってすみません。 何度もご丁寧な回答をしていただき、本当にありがとうございます。 上記に挑戦してみます。(私自身もVBAには自信がありませんがやってみます) また分からないことがあったら補足させていただくと思いますので、まだ締め切りませんが・・・ よろしくお願いします。m(_ _)m
- imogasi
- ベストアンサー率27% (4737/17069)
アクセスに「外部データの取り込み」「インポート」「エクセルファイル」 の「操作」があるのをご存知ですね。 にもかかわらず、「自動的」に拘るのですか。 であればVBAでの処理になると思いますが、質問の書き方からして不安を覚えますが、VBAの回答を、自分の場合に当てはめて、修正はできますか。 >毎日少しずつ増えていきます。その「増えた分だけ」インポートする。 (#1の補足)データを入力した日付はエクセルデータにありますか。その日単位にアクセスに送ってはどうでしょう。 エクセルで日単位にデータを別シートに分けるのはどうするか判りますか。
お礼
回答ありがとうございます。 また、お返事が遅くなりすみません。 アクセスに「外部データの取り込み」があるのはもちろん知っています。 操作する側の問題で、できたら(いや、確実に)「自動化」したい状況です。 お手数おかけしてすみません。
- tak2003
- ベストアンサー率32% (174/540)
エクセルで作ったデータをCSVで吐き出して、 アクセスでインポートすると理解すればよろしいでしょうか? アクセスのフォームにインポートボタンを作成してクリックイベントで VBAが起動するように作ればよいと思います。 詳しくは下記のHPを参考にしてみてください。 http://www.accessclub.jp/bbs3/0067/superbeg25315.html
お礼
回答ありがとうございます。 こちらの質問の仕方に不足がありました。 たとえば、エクセルのデータは毎日少しずつ増えていきます。 その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。 頻度はほぼ毎日です。 それを自動化したいのですが、良い方法はないでしょうか?
お礼
回答ありがとうございます。 こちらの質問の仕方に不足がありました。 たとえば、エクセルのデータは毎日少しずつ増えていきます。 その「増えた分だけ」インポートする。もしくは、毎回エクセルにあるデータすべて(上書き)するなりを簡素化したいと思います。 頻度はほぼ毎日です。 それを自動化したいのですが、良い方法はないでしょうか?