0

我有一个 Access VBA 脚本

  • 循环遍历目录中的 Excel 电子表格列表
  • 循环遍历每个电子表格的每个工作表
  • 将工作表中的数据导入 Access 表

我想再添加一个步骤:

  • 将列中的 Excel 值Field1与 Access 表中的值列表进行比较Exclude,如果找到匹配项,则删除 Excel 中的整行。

这是简化的代码,并附有说明新代码应该放在哪里的注释:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM FileList")
rs.MoveFirst

Dim appExcel As Excel.Application
Set appExcel = New Excel.Application
Dim objWorkbook As Excel.Workbook
Dim objSheet As Excel.Worksheet

Do Until rs.EOF = True
    strFilePath = rs!FilePath
    Set objWorkbook = appExcel.Workbooks.Open(strFilePath)
    For Each objSheet In objWorkbook.Sheets
        objSheet.Select
        strQuery = 
           "INSERT INTO tblImport (Field1) 
            SELECT [Field1] 
            FROM [Excel 8.0;HDR=YES;DATABASE=" & strFilePath & "].[" & objSheet.Name & strRange & "]"
        CurrentDb.Execute strQuery, dbFailOnError
        ***Add Code Here to Delete Rows in Excel where value found in Exclusion table***
        Next objSheet
    Set objSheet = Nothing
    objWorkbook.SaveAs FileName:=strFilePath, FileFormat:=xlExcel8
    objWorkbook.Close SaveChanges:=False
    Set objWorkbook = Nothing
    rs.MoveNext
    Loop

我确定我需要 Dim 另一个 RecordSet:

Dim rsExclude AS Recordset
Set rsExclude = CurrentDb.OpenRecordset("SELECT * FROM Exclude")

然后呢?或者也许有人可以推荐一种替代方法?

4

2 回答 2

1

好的,我想出了一个解决方案。我不相信它是“最佳的”(我希望有一个基于集合的解决方案,而不是这个迭代解决方案),但它的工作速度非常快。基本上,我添加了一个执行以下操作的 Do-While 循环:

  • 遍历范围内的每个行号
  • DLookup 对照 Access 表字段的值
  • 如果不匹配,则迭代计数器
  • 如果匹配,则删除行,并减少总行数

在下面添加代码:

Do While intRow <= strLastRow
    If IsNull(DLookup("Field1", "Exclude", "Field1 = '" & objSheet.Range("A" & intRow).Value & "'")) Then
        intRow = intRow + 1 'No match, move to next row
    Else
        objSheet.Rows(intRow).Delete 'Match found, delete row
        strLastRow = strLastRow - 1 'Decrease the number of rows in range
    End If
    Loop
于 2013-10-04T15:35:21.497 回答
0

另一种方法是在 Access 中创建删除查询,使用排除表作为您的条件。然后在您导入所有电子表格后从您的代码中执行查询(没有理由在每个电子表格之后运行它并减慢您的宏)。

或者只是修改您的插入查询来为您完成...

"INSERT INTO tblImport (Field1) 
SELECT [Field1] 
FROM [Excel 8.0;HDR=YES;DATABASE=" & strFilePath & "].[" & objSheet.Name & strRange & "]
WHERE [Field1] NOT IN (SELECT [yourFieldInExclusion] FROM Exclusion)"
于 2013-10-03T20:07:23.443 回答