• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス VBA サブフォルダからインポート)

VBAでサブフォルダからのインポート方法

このQ&Aのポイント
  • AccessとExcelを使用して、特定のフォルダ内のサブフォルダからファイルをインポートする方法についての質問です。
  • トップパスの設定方法やインポートファイルの名称の指定方法、インポート範囲の設定方法について、初心者の方に分かりやすく教えて欲しいとのことです。
  • 現在、同じパス内にあるエクセルファイルを指定した範囲でテーブルにインポートすることはできているが、それをサブフォルダ内のファイルにも適用したいとしています。

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 参照設定「Microsoft Scripting Runtime」で、 モジュールの先頭から、 Option Compare Database Option Explicit Dim j As Long Dim x As String Dim sSql As String Sub Shori_0()   Dim f As Object   Dim b As Object   Dim c As Object   Dim d As Object   Dim t As Variant   Dim e As Object   Dim p As String   Dim i As Long      Set e = CreateObject("Excel.Application")   With e.FileDialog(4)     If .Show = True Then       t = .SelectedItems(1)     Else       e.Quit       Set e = Nothing       Exit Sub     End If   End With   e.Quit   Set e = Nothing      x = Forms![frm]![txt_範囲]        Set f = CreateObject("Scripting.FileSystemObject")      On Error Resume Next   sSql = "DROP TABLE テストテーブル "   CurrentProject.Connection.Execute CommandText:=sSql   sSql = "DROP TABLE 一時テーブル "   CurrentProject.Connection.Execute CommandText:=sSql   On Error GoTo 0      Call Shori_1(f.GetFolder(t), i)      On Error Resume Next   sSql = "DROP TABLE 一時テーブル "   CurrentProject.Connection.Execute CommandText:=sSql   On Error GoTo 0 End Sub Sub Shori_1(ByVal objFolder As Folder, ByRef j As Long)   Dim u As Folder   Dim w As File   For Each u In objFolder.SubFolders     Call Shori_1(u, j)   Next   For Each w In objFolder.Files     With w       Call Shori_2(.Path)     End With   Next   Set u = Nothing   Set w = Nothing End Sub Sub Shori_2(c As String)   If c Like "*_3年目.xls*" Then     If j = 0 Then       DoCmd.TransferSpreadsheet acImport, , "テストテーブル", c, True, x       sSql = "ALTER TABLE テストテーブル ADD COLUMN ファイル名 VarChar(250);"       CurrentProject.Connection.Execute CommandText:=sSql       sSql = "UPDATE テストテーブル SET ファイル名='" & c & "';"       CurrentProject.Connection.Execute CommandText:=sSql       j = j + 1     Else       On Error Resume Next       sSql = "DROP TABLE 一時テーブル "       CurrentProject.Connection.Execute CommandText:=sSql       On Error GoTo 0       DoCmd.TransferSpreadsheet acImport, , "一時テーブル", c, True, x       sSql = "ALTER TABLE 一時テーブル ADD COLUMN ファイル名 VarChar(250);"       CurrentProject.Connection.Execute CommandText:=sSql       sSql = "UPDATE 一時テーブル SET ファイル名='" & c & "';"       CurrentProject.Connection.Execute CommandText:=sSql       sSql = "INSERT INTO テストテーブル SELECT * FROM 一時テーブル"       CurrentProject.Connection.Execute CommandText:=sSql       j = j + 1     End If   End If End Sub

noname#228034
質問者

お礼

今回も本当に助かりました! また何かありましたら、ご教示のほど よろしくお願い致します。

noname#228034
質問者

補足

参照設定しましたが、 Option Compare Database 部分で 「プロジーシャ内では無効です。」のコンパイルエラーが出てしまいます。 今回もご面倒おかけしますが、教えていただけますでしょうか。 よろしくお願いします!

その他の回答 (2)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんにちは こちらでテストしている限りでは動いています。 どのコードでエラーになっていますか?

noname#228034
質問者

補足

ご連絡遅くなりました。 ご質問しておりましたコンパイルエラーですが、(別件で)PCを再起動したところ、エラーが出なくなりました。 どういうことなのかは不明ですが、大丈夫そうです。 お騒がせして申し訳ありませんでした。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは モジュールの先頭から、と書いておきました。 新しいモジュールを挿入して、その先頭から貼り付けて下さい。 既に、 Option Compare Database Option Explicit が有る場合も、面倒なので上書きして下さい。

noname#228034
質問者

補足

なるほど、失礼しました。 さて、今度は「実行時エラー:抽出条件でデータ型が一致しません。」と出てしまします。 抽出条件も何も・・・???です。 すみません。