Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行
Posted
技术标签:
【中文标题】Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行【英文标题】:Access VBA: Delete Excel rows where cell value matches value in Access table 【发布时间】:2013-10-03 18:11:56 【问题描述】:我有一个 Access VBA 脚本
循环遍历目录中的 Excel 电子表格列表 循环遍历每个电子表格的每个工作表 将工作表中的数据导入 Access 表中我想再添加一个步骤:
将Field1
列中的 Excel 值与 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")
然后呢?或者也许有人可以推荐一种替代方法?
【问题讨论】:
【参考方案1】:好的,我想出了一个解决方案。我不相信它是“最佳的”(我希望有一个基于集合的解决方案,而不是这个迭代解决方案),但它的工作速度非常快。基本上,我添加了一个执行以下操作的 Do-While 循环:
遍历范围内的每个行号 根据 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
【讨论】:
【参考方案2】:另一种方法是在 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)"
【讨论】:
你误会了。我不想从 Access 表中删除数据。我想从 Excel 电子表格本身中删除相关行。 (更新了描述以使其更清晰。) 您是要在导入Access之前删除数据,使其不在数据库中,还是之后,以便在数据库中有记录的副本? 我的意图是导入所有数据以保持永久记录,然后删除Excel端的记录,这些记录必须通过修改传递给客户。以上是关于Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行的主要内容,如果未能解决你的问题,请参考以下文章
通过 VBA 将查询从 Access 导入 Excel 并删除单个单元格
如何将 Excel 单元格值设置为 Access Query 的条件?
Excel VBA代码查找列中的最大单元格值并删除其下方的所有行