メモ

主にプログラミング系の備忘録

Excel入力シートをガッツリAccessに取込

極力汎用的な作りに

Option Compare Database

Const sDataSheetName As String = "sheet1" 'データ取得シート名
Const sDataSheetRow As Long = 2           'データ取得行
Const sTableName As String = "T_Test"     'データ格納先テーブル名

'個々のExcel入力シートを取り込む関数
'取り込んだ結果を文字列形式で返す
Public Function ImportExcelFile(sFileName As String) As String
  On Error GoTo Err_Trap
  Dim xl As Object
  Dim wb As Object
  Dim ws As Object
  Dim buf As Variant
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim i As Long
  Dim sErr As String
  
  If sFileName = "" Then Exit Function
  
  If Dir(sFileName) = "" Then
    ImportExcelFile = "×" & sFileName & "(ファイルがありません。)"
    Exit Function
  End If
  
  Set xl = CreateObject("Excel.Application")

  Set wb = xl.Workbooks.Open(sFileName)
  Set ws = wb.Worksheets(sDataSheetName)
  buf = ws.Rows(sDataSheetRow)
  wb.Close (False)
  xl.Quit
  Set db = CurrentDb
  Set rs = db.OpenRecordset(sTableName)
  sErr = ""
  On Error GoTo Err_WriteTable
  rs.AddNew
  For i = 0 To rs.Fields.Count - 1
    rs.Fields(i) = buf(1, i + 1)
  Next i
  On Error GoTo Err_Trap
  rs.Update
  
  ImportExcelFile = "○" & sFileName & IIf(sErr <> "", "(" & sErr & ")", "")
  
  Exit Function
  
Err_WriteTable:
  If sErr <> "" Then sErr = sErr & "/"
  sErr = sErr & rs.Fields(i).Name & "->" & Err.Number & ":" & Err.Description
  Resume Next
  
Err_Trap:
  ImportExcelFile = "×(" & Err.Number & Err.Description & ")"
  
End Function

'任意のフォルダ内のExcelファイルを一括で取り込むための処理
'サブフォルダも再帰的に探索

Public Sub getExcelData(sPath As String)
    Dim buf As String
    Dim f As Object
    Dim sRet As String 'ファイル取込処理の結果を一時格納
    If sPath = "" Then Exit Sub
    If Right(sPath, 1) = "\" Then sPath = Left(sPath, Len(sPath) - 1)
    On Error GoTo Err_Dir
    buf = Dir(sPath & "\*.xls*")
    On Error GoTo 0
    Do Until buf = ""
      sRet = ImportExcelFile(sPath & "\" & buf)
      If Left(sRet, 1) = "○" Then nSuccess = nSuccess + 1
      nFile = nFile + 1
      Call ShowLog(sRet)
      buf = Dir()
    Loop
    
    With CreateObject("Scripting.FileSystemObject")
      For Each f In .GetFolder(sPath).SubFolders
        Call getExcelData(f.Path)
      Next f
    
    End With
    
    Exit Sub
Err_Dir:
  Select Case Err.Number
    Case 52
      Call ShowLog(sPath & "にはアクセスできません。")
      Call ShowLog("アクセスできないフォルダを含まない範囲で検索先フォルダを指定してください。")
      Exit Sub
    Case Else
      Debug.Print Err.Number & ":" & Err.Description
      Stop
  End Select
    
End Sub