Excel複数シートをaccessへ一括インポート

このQ&Aのポイント
  • Excel複数シートを、accessへ1つのテーブルへ一括インポートする方法を教えてください。
  • 複数シートの一括取り込みの方法について、vbを使用して試してみましたが、テーブル名やワークブックの指定方法について指示がありますか?
  • Excelの複数シートを一括でAccessにインポートするためのVBAコードを教えてください。
回答を見る
  • ベストアンサー

Excel複数シートをaccessへ一括インポート

Excel複数シートを、accessへ1つのテーブルへ一括インポート (1) ワークブックは複数あります。 (2) ブックには、色々な名前のシート名があります。 (3) テーブルに指定する名前をワークブックに合わせればと思ってます 複数シートの一括取り込みの vb は以下の通り作ってみました。 ここでは、 vbの中で「テーブル名」・「ドライブ内のワークブック(xlsデータ)」指定しなければいけないので、 任意で「テーブル名」・「ワークブック(xlsデータ)」「ドライブ」を(ダイアログボックスなど)指定出来ればと思っています。 ===================================================================== Private Sub コマンド0_Click() '////////////////////////////////////////////////////////// '/Excel複数シートのAccessテーブルへのインポート / '/参照設定 Microsoft Excel x.x Object Library / '////////////////////////////////////////////////////////// Const csWsRng As String = "A1:D1000" Const csTblName As String = "インポートテーブル" Const csWbPath As String = "D:\" Dim voXlApp As Excel.Application Dim voXlWb As Excel.Workbook Dim voXlWs As Excel.Worksheet Set voXlApp = New Excel.Application voXlApp.Visible = True Set voXlWb = voXlApp.Workbooks.Open(FileName:=csWbPath & "\aaaa.xlsx", _ ReadOnly:=True) For Each voXlWs In voXlWb.Worksheets DoCmd.TransferSpreadsheet TransferType:=acImport, _ SpreadsheetType:=acSpreadsheetTypeExcel9, _ TableName:=csTblName, _ FileName:=voXlWb.FullName, _ HasFieldNames:=True, _ Range:=voXlWs.Name & "!" & csWsRng Next voXlWs voXlWb.Close voXlApp.Quit Set voXlWs = Nothing Set voXlWb = Nothing Set voXlApp = Nothing End Sub ===================================================================== ご教示頂ければと思います。 宜しくお願い致します。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

ファイル選択なら、FileDialog を使うとかして http://www.geocities.jp/cbc_vbnet/tips/dialog.html 上記サンプルコード中の変数名を使うとして (FileName:=csWbPath & "\aaaa.xlsx" を (FileName:=vrtSelectedItem テーブル名はご自身でも TableName:=csTblName とされているので、テーブル名の重複が起きない保証があればこのままで でなければ、 Book名も付け足すとか(Book名_シート名)すれば良いのかな? 任意のテーブル名にしたいならば、 一旦テーブル(Bookフルパス|テーブル名)にでもBookフルパスを書き出して テーブルを開いてテーブル名を手入力し、そのテーブルのレコードセットを廻して インポート処理と絡めればよいのでは?

great-smile
質問者

お礼

返信遅くなり申し訳ありませんでした。 早速ご教示頂きました方法を行ってみましたところ、無事思い通りのものが、完成しました。 ありがとうございました!

関連するQ&A

  • EXCELファイルからACCESSへインポート

    質問させていただきます。 ACCESSのフォームから、EXCELファイルを選択してEXCELの内容を、 テーブルにインポートさせたいのですが。以下の方法で行って いるのですが、テーブルに反映されません。 Private Sub cmd_Import_Click() Dim InitialFileName As String Dim varTitle As Variant Dim FileName As String InitialFileName = "hoge.xls" varTitle = "ファイルを開く" FileName = GETHOGEOPEN(varTitle, InitialFileName) DoCmd.SetWarnings False DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_HOGE", FileName, True DoCmd.SetWarnings True MsgBox "完了しました" End Sub ACCESS → ACCESS2003 SP3 EXCEL →EXCEL2003 SP3 よく見ると、すでにEXCELのバージョン指定が違う(汗) これが原因かも・・・・(汗) わかる方がいらっしゃったら教えてください。

  • Excelから一つのテーブルにインポートしたい

    こんにちは。 ExcelではVBAが使えるレベルですが、Access初心者です。 エクセルのワークブックにデータがA~N列までデータが入っています。 1行目はタイトル(フィールド名)で2行目以下がデータ(レコード)になります。 ワークブックの中のシート数はさまざまです。 1行目のタイトル(フィールド名)はあってもデータがないものもありますし、 2行目以下のデータ(レコード)数もさまざまです。 ワークブック(とその中のシート)が多いので VBAを使ってAccessに取り込みたいと思っています。 いろいろネットで検索して以下のVBAまでたどりついたのですが、 それぞれ「ワークブック名_シート名」というテーブルに取り込まれます。 これを例えば「総合」というようなテーブル一つに取り込むにはどうしたらいいでしょうか? 週末をつぶして試行錯誤しましたが、どうしても解決しないのでアドバイスいただけるとうれしいです。 Sub ImportFromExcel() Dim tgtXLname As String Dim tgtXLpath As String Dim newTBLname As String Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim sCnt As Integer Dim n As Integer Application.Echo False TargetFolder = "C:\work" tgtXLname = Dir(TargetFolder & "\*.xls") Do While tgtXLname <> ""   tgtXLpath = TargetFolder(a) & "\" & tgtXLname   Set xlApp = GetObject(, "Excel.Application")   xlApp.Application.Visible = True   xlApp.Workbooks.Open tgtXLpath   Set xlBook = xlApp.ActiveWorkbook   sCnt = xlBook.Worksheets.Count   For n = 1 To sCnt     Set xlSheet = xlBook.Worksheets(n)     newTBLname = Left(tgtXLname, Len(tgtXLname) - 4) & "_" & xlSheet.Name     DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, newTBLname, tgtXLpath, True, xlSheet.Name & "!" & "A:N"     Set xlSheet = Nothing   Next   xlBook.Close SaveChanges:=False   Set xlBook = Nothing   tgtXLname = Dir() Loop xlApp.Application.Quit Set xlApp = Nothing Application.Echo True MsgBox "インポート終了" End Sub

  • ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について

    表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか? ====== VBAコードの抜粋 =========   Dim xlApp As Object       ' Excelのアプリケーション定義   Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義   Dim xlSheet As Object      ' Excelの参照するシート名を定義   Dim SheetName As String     ' シート名を代入   Dim SheetCount As Byte     ' シートの選択 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む If SheetCount = 1 Then SheetName = "Sheet1" If SheetCount = 2 Then SheetName = "Sheet2" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名") Set xlSheet = xlBook.Worksheets(SheetName) Set Wcell = xlSheet.Range("A1") Set Cn = CurrentProject.Connection Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True   データを取込むコードあり(省略) xlBook.Close xlApp.Visible = False Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing Next SheetCount

  • CreateObjectとGetObjectの違い

    当方エクセル2003です。 Sub test_CreateObject() Dim App As Excel.Application Dim MyFileName As String Set App = CreateObject("Excel.Application") MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls" With App .Workbooks.Open FileName:=MyFileName .Visible = True End With Set App = Nothing End Sub --------------------------------------------------------- Sub test_GetObject() Dim App As Excel.Application Dim MyFileName As String Set App = GetObject(, "Excel.Application") MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls" With App .Workbooks.Open FileName:=MyFileName .Visible = True End With Set App = Nothing End Sub この二つは何が違うのでしょうか? どちらも既存のエクセルファイルがが開きます。

  • シートの複写をデスクトップのフォルダに挿入したい

    Excel2007でマクロ作成中の初心者です。 今正常に作動しているマクロコード「この計算シートの保存」をもとに 「この計算シートをデスクトップの決まったフォルダに挿入」としたいです。 どう変更したらいいかご指導お願いします。 ------------------------------------------- Sub この計算シートをデスクトップの決まったフォルダに挿入() ' 'Const cnsTITLE = "マクロなしブックの作成" 'Const cnsFILTER = "Excelワークブック (*.xls),*.xls" Dim xlAPP As Application Dim WBK1 As Workbook ' 本ブックの Dim WBK2 As Workbook ' 作成ブック(新規ブック) Dim strFileName As String Dim tblSH As Variant Dim lngLines As Long Dim myDate As String myDate = Range("AE4").Value 'Date = Format(Date, "ge年m月度") Set WBK1 = ThisWorkbook ' 本ブック ' この計算シートをデスクトップの「計算書庫」フォルダに挿入する   Worksheets("この計算シート").Copy Set WBK2 = ActiveWorkbook strFileName = Format(myDate, "ge年m月度") & ".xls" ChDir ThisWorkbook.Path + "\計算書庫" 'デスクトップの「計算書庫」フォルダに変更したい Application.DisplayAlerts = False WBK2.SaveAs "定期計算書" & strFileName, FileFormat:=XlFileFormat.xlExcel8 MsgBox "この計算書を " & myDate & " の名前でデスクトップの「計算書庫」フォルダに挿入しました。" Application.DisplayFormulaBar = True WBK2.Close False Application.DisplayAlerts = True Set WBK2 = Nothing MAKE_NEWBOOK_WO_MACROS_EXIT: Set WBK1 = Nothing Set xlAPP = Nothing End Sub ---------------------------------------------- Sub この計算シートの保存() ' 'Const cnsTITLE = "マクロなしブックの作成" 'Const cnsFILTER = "Excelワークブック (*.xls),*.xls" Dim xlAPP As Application Dim WBK1 As Workbook ' 本ブックの Dim WBK2 As Workbook ' 作成ブック(新規ブック) Dim strFileName As String Dim tblSH As Variant Dim lngLines As Long Dim myDate As String myDate = Range("AE4").Value 'Date = Format(Date, "ge年m月度") Set WBK1 = ThisWorkbook ' 本ブック ' この計算シートを新規ブックにコピーする Worksheets("この計算シート").Copy Set WBK2 = ActiveWorkbook strFileName = Format(myDate, "ge年m月度") & ".xls" ChDir ThisWorkbook.Path + "\計算書庫" Application.DisplayAlerts = False WBK2.SaveAs "計算書庫"" & strFileName, FileFormat:=XlFileFormat.xlExcel8 MsgBox "この計算書を " & myDate & " の名前で保存しました。" Application.DisplayFormulaBar = True WBK2.Close False Application.DisplayAlerts = True Set WBK2 = Nothing MAKE_NEWBOOK_WO_MACROS_EXIT: Set WBK1 = Nothing Set xlAPP = Nothing End Sub

  • エクセルのCSV形式の複数ブックを一括でインポートしたい

    あるフォルダ内にある「複数ブック(CSV形式)」をエクセルに一括でインポートしたいのです。フォルダ内にある複数のエクセルブックの名前はばらばですが、形式だけが全て同じです。 Book1 A B C 1 1 1 Book2 A B C 2 2 2 Book3 A B C 3 3 3 ↑  2つブックがあって最終的には・・・・ Book5 A B C 1 1 1 2 2 2 3 3 3 ↑ こうしたいです。複数ブックの一行目以下のデータ全てをひとつのものにまとめたいのです。(全ての複数のCSVブックは一行目は同じです。2行目以降を追加するみたいな感じです。) いろいろと調べて作ってみたのですが、「デバック」??で黄色くなって全く上手く行きません。 ご存知であれば是非教えてください。 ・~・・~・・~・・~・・~・・~・・~・・~・・~・・~・ Sub フォルダ指定連結() Dim myShell As Object Dim myFS As Object, myFile As Object Dim myName As String, myPath As String Dim myLine As String, newStr As String Set myShell = CreateObject("Wscript.Shell") myPath = myShell.Specialfolders("Desktop") & "\aaa\" Set myShell = Nothing Set myFS = CreateObject("Scripting.FileSystemObject") myName = Dir(myPath & "\*.csv\") Do While myName <> "" Set myFile = myFS.OpenTextFile(myPath & "\" & myName, 1) myFile.ReadLine '1行目スキップ Do Until myFile.AtEndOfStream myLine = myFile.ReadLine newStr = newStr & myLine & vbCrLf Loop myFile.Close myName = Dir() Loop Set myFile = myFS.CreateTextFile("C:\test.csv\", True) myFile.Write newStr myFile.Close Set myFS = Nothing Set myFile = Nothing End Sub ・~・・~・・~・・~・・~・・~・・~・・~・・~・・~・ これが教えていただいたり、自分で修正を加えたりしたぶんですが・・・。 環境はウィンドウズXPで2002です。

  • ACCESSでExcelにデータ出力、高速化

    ACCESSのVBAを使ってテーブルのデータを 既存ブックに出力し、別名で保存をしたいのですが、 どうも、処理が遅くて困っています。 改善点がありましたら教えてくださいお願いいたします。 Dim objExcel As Excel.Application Dim xlWrkbk As Excel.Workbook Dim xlWrksh As Excel.Worksheet Dim rs As DAO.Recordset Dim strFilename As String strFilename = CurrentProject.Path & "既存ブック名.XLS" Set objExcel = New Excel.Application Set xlWrkbk = objExcel.Workbooks.Open(Filename:=strFilename, ReadOnly:=True) Set xlWrksh = xlWrkbk.Worksheets("シート名") Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenSnapshot) With objExcel xlWrksh.Range("A:N").Clear xlWrksh.Range("A2").CopyFromRecordset rs xlWrkbk.SaveAs Filename:=CurrentProject.Path & "新しいブック名.xls" xlWrkbk.Close .Quit rs.Close End With Set rs = Nothing Set objExcel = Nothing Set xlWrkbk = Nothing Set xlWrksh = Nothing

  • Accessを使ったデータの一括インポートについて

    VBA初心者です。 現在ExcelのデータをAccessにインポートする方法を探しています。 フォルダの構成としては 親フォルダに子フォルダがあり、そのなかにファイルがあります。 例としましては 親フォルダ 子フォルダ ファイル名 A aaaa 1111 B bbbb 2222 C cccc 3333 D dddd 4444 E eeee 5555 F ffff 6666 と言った感じです。 自分なりに調べて1つのフォルダの中にあるデータは全てインポートできそうです。(aaaaフォルダ内等) 現在、親ごとにテーブル分けして一括インポートできる方法を探しています。 現在のコードは Private Sub AAA_Click() Dim dname As String Dim fname As String Dim tblname As String dname = "c:\フォルダ名\" tblname = "テーブル名" fname = Dir(dname & "*.xls") Do While fname <> "" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, dname & fname, True fname = Dir() Loop End Sub これを用いようと考えてます。 ここから子フォルダ内を全て1つのテーブルにまとめるというところでつまづいております。 初心者のためコードも頂けると助かります。 よろしくお願いします。

  • Access からオブジェクトとして開いたExcelのプロセスが終了しない

    AccessからExcelのデータを読み込んだ後、Accessを終了させてもプロセスが終了しません。 bookはclose、applicationはquit、オブジェクト変数はnothingというExcelの終了記述をしているので他の問題なのかと思いいろいろ調べて試しましたが解決できません。 Excelのファイル名とシート名はAccessのフォームに貼り付けたテキストボックスの値を取得させていますが下記コードでは省略しています。環境はWin2000Server、Access2000です。 どなたかお気づきの点があればどうぞご教授お願いします。 --------------------------------- Public Sub test() Dim filename As String Dim sheetname As String filename = "c:\パス\ファイル名.xls" sheetname = "シート名" 'AccessからExcelをオブジェクトとして開く Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(filename) Set xlSheet = xlBook.Worksheets(sheetname) 'Excelの行取得用変数設定 Dim xlrow As Integer 'データ開始行 xlrow = 5 Dim xlrowEnd As Integer 'データ最終行(最終行は合計値が入っているので-1とする) xlrowEnd = (Range("A5").End(xlDown).Row) - 1 'Excelデータの取り込み Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "a", cn, adOpenKeyset, adLockOptimistic cn.Execute "delete * from a" xlrow = 5 'Excelデータの開始行番号 Do While xlrow <= xlrowEnd rs.AddNew rs!フィールド1 = xlSheet.Cells(xlrow, 1).Value rs!フィールド2 = xlSheet.Cells(xlrow, 2).Value rs.Update rs.MoveNext xlrow = xlrow + 1 Loop 'Excelの終了記述 xlBook.Close xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing 'ADO接続終了記述 rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • accessのVABを使ったインポートについて

    accessへのインポートについて質問です。 VBAをつかってボタンを押すとファイル選択ダイアログが開き選択すると既存のテーブルへインポートするものを作成したいと考えています。 検索して出てきたものを加工して使ってみているのですが理想形になりません。 現状いまのままでも使えてはいるのですがより効率的にしたいと思っています。 具体的には以下の2点を修正したいと考えています。 ・元データは本来はCSVのためCSVのまま取り込みたい 範囲指定の際にExcelの関数を使って求めているためそれをCSV 現状はCSVを一度Excelに修正しています。 ・A2のセルに日付(ユーザー定義yyyy年mm月dd日)が入っているためそれをUPDATEだデータに追加したい 現状は入力を求められるためそこに入力すると反映されます。 また、反映時はyyyy/mm/ddという表記で表示をしたいです。 一応Gとしてデータの取得はしていると思うのですがうまくいきません。 取り込むデータをCSVとExcelにしているのはもう一つ取込用のボタンがありそちらの取込はCSVだからです。 (CSVだけで取り込めるようになったらExcelは消します) 独学でネットにあるものをつまんでいる状況のため専門用語などが分からず説明が足りていないところなどありましたらご質問下さい。 宜しくお願い致します。 Private Sub コマンド1_Click() Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub Dim objFileSys As Object Dim fileName As String Dim FN As Variant 'ファイルシステムを扱うオブジェクトを作成 Set objFileSys = CreateObject("Scripting.FileSystemObject") '拡張子無しのファイル名を取得 fileName = objFileSys.GetBaseName(msg) FN = objFileSys.GetAbsolutePathName(msg) Dim b As Long Dim r As Long Dim G As Date With CreateObject("Excel.Application") With .Workbooks.Open(FN) 'G = CDate(.Sheets(fileName).Range("A2").Value) b = .Sheets(fileName).Cells(1, 1).End(-4121).row .Close False End With End With DoCmd.TransferSpreadsheet acImport, , "T_G", msg, True, "B7:I" & b Dim sql As String DoCmd.SetWarnings WarningsOn:=False sql = "UPDATE T_G SET 入金日 = G WHERE Nz(入金日)=''" DoCmd.RunSQL sql DoCmd.SetWarnings WarningsOn:=True Set objFileSys = Nothing On Error GoTo err_sample err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "ダウンロード" '任意のフォルダパスを入れてください fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "Excel Files(*.xls)", "*.xlsx;*.xls" fDlg.Filters.Add "Text Files(*.csv;*.txt)", "*.csv;*.txt" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" End Function

専門家に質問してみよう