我目前正在VBA中为我的数据库进行搜索循环。在这个数据库中,我有2个表,一个包含名为Main
的客户记录,另一个包含名为Sparr
的搜索词。我们的想法是使用过滤器过滤掉与Sparr
表中任何搜索词匹配的客户。任何与任何搜索词都不匹配的客户都会被添加到另一个名为filteredCustomerT
的表中。
例如:
table "Main"
Field "Mail"
mike@coolmail.com
john@hotmail.com
dave@mail.com
jonny@mailx.com
table "Sparr"
Field "sparrord"
hotmail
jonny
table "Testtable"
Field "testMail"
mike@coolmail.com
dave@mail.com
因此,如果我运行此VBA代码,我希望过滤掉john@hotmail.com
和jonny@mailx.com
。 Main
表包含200k条记录,Sparr
表包含2k条搜索词。我已经编写了一些应该遍历Main
表的VBA代码。对于Main
表中的每个记录,都有一个循环遍历Sparr
表的另一个嵌套循环,所以看看是否有匹配。如果没有匹配项,则VBA代码会将该条目复制到名为Testtable
的其他表中。我使用inStr
函数进行匹配。
下面我发布了似乎不起作用的VBA代码。任何人都可以帮助我蚂蚁可能指出代码中的错误。我对VBA编程很陌生。
Option Compare Database
Option Explicit
Sub filter()
Dim mainMail As Recordset
Dim sparrSokord As Recordset
Dim testtableTestmail As Recordset
Dim mainTemp As String
Dim sparrTemp As String
Dim match As Integer
Set mainMail = CurrentDb.OpenRecordset("Main")
Set sparrSokord = CurrentDb.OpenRecordset("Sparr")
Set testtableTestmail = CurrentDb.OpenRecordset("Testtable")
Do Until mainMail.EOF
mainTemp = mainMail![Mail]
match = 0
sparrSokord.MoveFirst
Do Until sparrSokord.EOF
sparrTemp = sparrSokord![sparrord]
If (InStr(mainTemp, sparrTemp) <> 0) Then
match = 1
Exit Do
End If
sparrSokord.MoveNext
Loop
If (match = 0) Then
testtableTestmail.AddNew
testtableTestmail![testMail] = mainTemp
testtableTestmail.Update
End If
mainMail.MoveNext
Loop
End Sub
答案 0 :(得分:1)
InStr可以以意想不到的方式运行,如果涉及空值/空字符串/等。
我注意到,一旦你到达目的地,你没有将<p>
的位置重置回记录集的开头。
当然,你会在SearchwordWord
之前做SearchwordWord.MoveFirst
之类的事情。在Do Until SearchwordWord.EOF
我还会注意到Do Until customerMail.EOF
总是执行循环的内容,然后检查最后的条件(这可能会给你意想不到的结果,特别是Do Until
在EOF之后第一次成功通过循环。
您可能希望使用SearchwordWord
/ while
代替wend
(我几乎从不使用它们)。这可能是你悲痛的最大原因。
答案 1 :(得分:-1)
问题现在解决了。我只需要关闭一些程序,然后再使用上面的更新代码再试一次。工作得很好!