VBA,用于从目录中的所有电子表格导入满足特定条件的数据

时间:2017-08-31 13:26:46

标签: vba excel-vba ms-access excel

以下是我的代码:

Public Function Import_Multi_Excel_Files()

Dim InputFile As String
Dim InputPath As String

InputPath = "L:\Directory\To\Project\Data\"
InputFile = Dir(InputPath & "*.xls*")
worksheetName = "WorksheetThatHasData!A:H"

Do While InputFile <> ""
    DoCmd.TransferSpreadsheet acImport, , "Table_1", InputPath & InputFile, -1, worksheetName, True '< The true is for column headers
    InputFile = Dir
Loop

End Function

上面的代码是从每个工作簿中的特定工作表中获取所有数据(这很好)并将其导入MS Access。但我注意到我们的报告总是包括当前月份和上个月,即使报告的日期为当月。每个文件名的格式为Report - YYYYMM。我想到的想法是查看文件名的YYYYMM部分,只抓取相应日期的数据。

以下编辑和添加

Actuarial_Report-201705
Enrollment_Report-201705
Premium-Data-201705

上述每个报告都包含5月和4月的信息。但前几个月的报告显然将包括4月份和3月份的数据,依此类推。发生的事情是,我导入的所有数据都计入了两次登记,保费和精算信息。我想只从201705报告中提取201705数据,并让代码忽略201704信息。

1 个答案:

答案 0 :(得分:0)

使用以下内容替换While循环:

Dim strMonth As String
Dim strYear As String
Do While InputFile <> ""
    strMonth = Mid(InputFile, Len(InputFile) - 6, 2)
    strYear = Mid(InputFile, Len(InputFile) - 10, 4)
    DoCmd.TransferSpreadsheet acImport, , "Table_1", InputPath & InputFile, -1, worksheetName, True '< The true is for column headers
    CurrentDb.Execute "DELETE * From Table_1 WHERE MyDateColumn < #" & strYear & "/" & strMonth & "/01#"
    InputFile = Dir
Loop

MyDateColumn是您存储日期的列。

假设:您没有在Table_1中存储要保留的任何其他旧信息,否则您需要导入到另一个表,删除无效的日期信息,然后将数据附加到Table_1

文件名的末尾不能改变,否则会产生错误。

请注意,我没有在查询中使用参数,但由于字符串来自文件名,最大长度为6,中间有/,因此不存在SQL注入的风险。