- ベストアンサー
ACCESS2000ファイルのインポートについて
ACCESS2000を使用しています。 ある指定のフォルダにある複数のEXCELファイルを、ACCESSに一括でインポートしたいです。 EXCELファイルは範囲指定を行います。(例えばb2:d100までインポートしたい) ブック名は部署名が入っており、シート名はどのブックも同一シート名です。 どのように行えばいいでしょか。 ご回答の程、どうぞよろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
あら、まだ続いていたのですね(汗)。 >> AC2000で動作確認しています と書いた通り、私の環境では動いています。 ちなみに2010でも動いていますから、2007でも動くはずですよ。 (手元に2007が無いので検証できませんが。) それでも動かないようですが、 > エラーも表示されませんでした。 > ACCESSは、エラー時には、EXCELのように、黄色くマーカーされないのでしょうか されます。 されない、と言うことは、マクロはエラー無く動いているということです。 だとすると考えやすい事は myPath = "C:\import\" ここで指定したフォルダにエクセルブックが無い あるいはフォルダが合っているとして myFilename = Dir(myPath & "*.xls") ここに伴い、 > 2007では、拡張子をxlsxに変えました。 とのことですが、このフォルダに「xlsx」ファイルが存在しない、 どちらかだと思います。 フォルダ名を確認いただくのが初めの一歩。 フォルダ名が合っていたら myFilename = Dir(myPath & "*.xls*") と書きなおしてみるのが次のステップです。 上記なら「xls」「xlsx」どちらにも対応できますからオススメです。
その他の回答 (6)
- chayamati
- ベストアンサー率41% (260/624)
回答No.5です テストしてみました。 色々間違いがありました。 済みません。No.5は無かった事にしてください インポートするテーブルとまとめるテーブルを用意します。 インポートするテーブル フィールドは主キーなしのワークシートの項目名と同じ名前のフィールド まとめるテーブル ID(オートナンバー型、主キー)部署名 及び必要とする見出し名 次の処理をブックの数だけ繰り返しコーディングします 1.インポートテーブル初期化 2.一つ目のブックをインポート 3.インポートテーブルをまとめテーブルに条件付き(where)で追加 Private Sub インポート_Click() Dim ブック名, ルート名 As String ルート名 = "F:" ブック名 = "営業1課" '1.インポートテーブル初期化 DoCmd.DeleteObject acTable, "インポートするテーブル" '2.一つ目のブックをインポート DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "インポートするテーブル", ルート名 & ブック名 & ".xlsx", True, strrange '3.インポートテーブルをまとめテーブルに条件付き(where)で追加 DoCmd.RunSQL ("insert into まとめテーブル(部署名,商品名,金額) select ブック名,商品名,金額 from インポートテーブル") ブック名 = "営業2課" DoCmd.DeleteObject acTable, "インポートするテーブル" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "インポートするテーブル", ルート名 & ブック名 & ".xlsx", True, strrange DoCmd.RunSQL ("insert into まとめテーブル(部署名,商品名,金額) select ブック名,商品名,金額 from インポートテーブル") ブック名 = "営業3課" DoCmd.DeleteObject acTable, "インポートするテーブル" DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "インポートするテーブル", ルート名 & ブック名 & ".xlsx", True, strrange DoCmd.RunSQL ("insert into まとめテーブル(部署名,商品名,金額) select ブック名,商品名,金額 from インポートテーブル") End Sub
- chayamati
- ベストアンサー率41% (260/624)
インポートするテーブルとまとめるテーブルを同じ形式で用意します。 テーブルのフィールドは、シートの項目名に、ID(オートナンバー型、主キー)部署名を追加し 次の処理をブックの数だけ繰り返しコーディングします 1.インポートテーブル初期化 2.一つ目のブックをインポート 3.インポートテーブル部署名をブック名に更新 4.インポートテーブルをまとめテーブルに条件付き(where)で追加 1.インポートテーブル初期化 2.次のブックをインポート 3.インポートテーブル部署名をブック名に更新 4.インポートテーブルをまとめテーブルに条件付き(where)で追加
- tsubuyuki
- ベストアンサー率45% (699/1545)
すいません。 "てぶる"は、お好みの"テーブル名"に書き換えてご確認くださいませ。
- tsubuyuki
- ベストアンサー率45% (699/1545)
失礼、エクセルブックのインポートでしたね。 インポート定義は要りません。 Sub XL_Import() Dim myFilename As Variant Dim myPath As Variant Dim mySheet As String Dim myRange As String myPath = "C:\import\" myFilename = Dir(myPath & "*.xls") mySheet = "sheet1" myRange = "A1:C4" Do Until myFilename = "" DoCmd.TransferSpreadsheet acImport, 8, "てぶる", myPath & myFilename, True, _ mySheet & "!" & myRange myFilename = Dir() Loop End Sub 上記は、「c:\import」というフォルダ内にあるxlsファイルのうち、 「sheet1!A1:C4」の範囲を「テーブル名」というテーブルにインポートするモジュール例です。 エクセルの表における「項目名が入っている行」も範囲に含めてやった方が無難です。 AC2000で動作確認していますので、あとは適宜ご自身の環境に合わせてお使い下さい。 追記) 補足で提示くださったコード中に エクセルブックを開いて、「何もせずに」上書き保存・終了の処理があるようですが、 これはきっと意味が無いですよ。 「開いていたら、保存して閉じる」のなら意味がありますけどね。 でも、その場合でも上記のコード内に組み込めます。 わざわざ3個以下限定の配列に格納するのも私としては?です。
補足
いつも早速にご回答いただき、誠にありがとうございます。 明確で、綺麗なコード、どうもありがとうございました! おっしゃる通り、不要な記述もありました。。 ACCESS2000で実行した結果、何の反応も、エラーもでません。 自宅にある、2007で実行した結果も今度は何の反応も、エラーも表示されませんでした。 2007では、拡張子をxlsxに変えました。 初心者で申し訳ないのですが、ACCESSは、エラー時には、EXCELのように、黄色くマーカーされないのでしょうか。 ACCESSが無理なようですので、EXCEL2000では、どのように記述すればよろしいでしょうか。 何度もお手数をお掛けし、大変申し訳ありません。 どうぞよろしくお願い致します。
- tsubuyuki
- ベストアンサー率45% (699/1545)
簡単な理由だと思うのですが・・・ > buf = Dir(pathFILE & "*.xlsx") アクセス2000は「XLSX」ファイルを正しく認識しませんよ。
補足
失礼しました。 記載ミスでした。 xlsで実行した結果、何の反応もありませんでした。 仮にxlsxだった場合、何らかのエラーは表示されるかと思います。 何度も恐れ入りますが、ご回答の程、どうぞよろしくお願い致します。
- tsubuyuki
- ベストアンサー率45% (699/1545)
グーグル辺りで 「アクセス フォルダ内一括取り込み」 とか 「アクセス 一括インポート」 とかで探すといろいろ見つかりますよ。 例えば http://www.editorgoes.net/blog/2007/07/access_8.html こんな感じのモノだとか。 要するに、アクセスでインポート定義を作り、 「指定されたフォルダ内の全エクセルブックに対し インポート定義を基にインポートする」 ようなモジュールを作ってやれば良いです。
補足
ご回答いただき、ありがとうございます。 次のモジュールを、ACCESS2000の標準モジュールに記載し、実行した結果、何のエラーも反応もありませんでした。 自宅はACCESS2007で、これでは、ちゃんと実行できましたが、会社はACCESS2000で、何のエラーも反応もありません。 何故でしょか。 ご回答の程、どうぞよろしくお願い致します。 Sub ImportFromExcel() Dim objEXCEL As Object Dim objWorksheet As Object Dim arrFILE(3) As Variant '3個以下のファイルを読み込む設定の場合 Dim pathFILE As String Dim i As Integer Dim j As Integer Dim buf As String pathFILE = "C:\Users\hanako\Desktop\import\" nameSHEET = "Sheet1" 'AccessにインポートしたいExcelシート名 rangeSHEET = "b2:d100" '上記シートのインポートしたい範囲(最大値を指定) nameTABLE = "テーブル1" 'インポート先のAccessテーブル名 '--------------------------------------------- 'フォルダにあるExcelファイル名を取得 '--------------------------------------------- i = 0 buf = Dir(pathFILE & "*.xlsx") Do While buf <> "" arrFILE(i) = buf buf = Dir() i = i + 1 Loop '--------------------------------------------- 'Excelの各ファイルをAccessにインポート '--------------------------------------------- i = i - 1 For j = 0 To i 'Excelファイルを開く Set objEXCEL = CreateObject("Excel.Application") objEXCEL.Visible = True objEXCEL.Workbooks.Open pathFILE & arrFILE(j) '上書き保存とExcelの終了 objEXCEL.DisplayAlerts = False objEXCEL.Workbooks(1).Save objEXCEL.Workbooks(1).Close objEXCEL.Quit 'オブジェクトの破棄 Set objWorksheet = Nothing Set objEXCEL = Nothing DoCmd.TransferSpreadsheet acImport, 8, nameTABLE, pathFILE + arrFILE(j), True, nameSHEET + "!" + rangeSHEET Next End Sub
お礼
お礼がとても遅くなり、申し訳ございませんでした。 お蔭様で、お教え頂いた通り実行した結果、無事にインポートすることができました。 何度もご回答いただき、大変助かりました。 今後とも、どうぞよろしくお願いいたします!!