こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2012-05-21 09:09:32

QNo.7487532

困ってます

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

すみません、私も実際に動かしたわけではないので。
下記によると追記はできないようですが
http://okwave.jp/qa/q1706501.html
下記ではできるようです。
http://www.accessclub.jp/bbs3/0449/superbeg131890-2.html

ちょっと気になるのは「xlSheet.Name」ですが、これでどのシートか判りますか。
作業中のシート名ではないでしょうか。
先の二番目の例では
strrange = Format$(i, "00") & "!A4:E3000"
のようにシート番号を指定しています。

投稿日時 - 2012-05-21 14:18:39

補足

とりあえずappendは難しそうなので、クエリを使って結合する方向で考えていきたいと思います。

解決の糸口がみつかり助かりました。ありがとうございました。

投稿日時 - 2012-05-23 07:54:53

お礼

再度の回答ありがとうございます。

私自身がAccessのVBAはまだ勉強したてですので、
ご紹介いただいたVBAのコードを参考にしていきたいと思います。

レコードの追加が難しければ、シートごとにインポートしたテーブルを
一つにまとめるVBAを考えてみようと思います。

投稿日時 - 2012-05-21 16:41:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

確認はしてありませんが、
newTBLname を For の前に出し
newTBLname = "総合"
でできませんか。

投稿日時 - 2012-05-21 11:48:22

お礼

回答ありがとうございました。

私も同じ方法を試してみましたが、ダメでした。

追加してインポートされるのではなく、最後にExcelからインポートした(と思われる)データ(レコード)だけでした。

投稿日時 - 2012-05-21 13:07:27

あなたにオススメの質問